Hunny MIME++ Change Log


Version 4.0.10 -- 14 Sep 2012

  • Bug fix: Crash possible if string not NUL terminated.

Version 4.0.9 -- 5 Jun 2012

  • Bug fix: Extra space in filename when unfolding Content-Disposition header field

Version 4.0.8 -- 27 Feb 2012

  • New option to select how the parser handles invalid header syntax.

Version 4.0.7 -- 4 Oct 2010

  • For Microsoft Windows, changed the default text encoding/decoding engine from ICU to MLang.

  • For OS X, Linux, and Solaris (and all non-Windows platforms), changed the default text encoding/decoding engine from ICU to libiconv.

  • Bug fixes in the mimepp-email supplemental library related to the handling of text conversions to and from Unicode.

  • Microsoft Windows DLL builds changed to use static linking of the C runtime library.


Version 4.0.6 -- 26 Aug 2010

  • Added libraries for Mac OS X.

  • Added new Mailbox::validate static member function, which can validate an email address according to the strict syntax of RFC 5322.


Version 4.0.5 -- 14 Sep 2009

  • Bug fix: The return value from String::compare(size_t,size_t,const char*,size_t) could be incorrect when last parameter took its default value. This fix introduces a new member function String::compare(size_t,size_t,const char*) and removes the default value from the last parameter of String::compare(size_t,size_t,const char*,size_t).

Version 4.0.4 -- 7 Aug 2009

  • Bug fix: Memory leak in the mimepp::email::Message class.

  • mimepp::email::Message changed to return the From display name as Unicode (UTF-8) text.

  • Updated to Solaris 10 and the latest Sun C++ compiler.


Version 4.0.3 -- 6 Apr 2009

  • Windows only: Changed to use MLang2 from MLang, improving character conversion. Specifically, this fixes problems with converting GB18030.

  • Relaxed parsing of the boundary parameter to allow additional characters in the unquoted string.


Version 4.0.2 -- 21 Oct 2008

  • Changed behavior: Allow space character in encoded word, to be more compatible with popular MUAs.

Version 4.0.1 -- 23 Sep 2008

  • Changed behavior: To fold a header line, add a newline before any white space. To unfold a header line, remove only the newline.

Version 4.0 -- 15 Oct 2007

  • Added Apple OS X as a supported operating system.

  • Added support for native text encoding/decoding facilities. Hunny MIME++ 3.0 used only ICU (International Components for Unicode) for text encoding and decoding. Hunny MIME++ 4.0 uses MLang by default on Windows and libiconv by default on Linux, Solaris, and OS X, while allowing ICU as a runtime option.

  • Exposed TextEncoder and TextDecoder classes as part of the public API. Hunny MIME++ 3.0 used these classes internally. Hunny MIME++ 4.0 exposes them so that library users can use them.

  • Added new member functions to DispositionType to support Unicode filenames in accordance with RFC 2231.

  • Added new TnefDecoder and TnefAttachment classes, which provide the capability to extract attachments from TNEF containers.

  • Updated the classes in the mail namespace to handle HTML email more easily. Renamed the namespace to mimepp::email.


Version 3.0.7 -- 10 February 2007

  • Bug fix: Length parameter not checked in String::copy(), which could cause a buffer overrun if the length argument were too large.

  • Bug fix: Calling Mailbox::setDisplayNameUtf8() with a long display name could cause line wrapping in the wrong place.


Version 3.0.6 -- 13 March 2006

  • Updated to use ICU 3.4.

  • Changed uuencode decoder to work around a Netscape bug.


Version 3.0.5 -- 5 March 2005

  • Bug fix: QuotedPrintableEncoder::encode member function could cause an access violation under certain conditions.

Version 3.0.4 -- 6 October 2004

  • Bug fix: QuotedPrintableDecoder::decode returns short decoded string.

  • Bug fix: Memory leak in mail::Text (example code).

  • Added new functions versionInfo() and buildInfo(), which return information about the version number and the build.

  • If mimepp::Initialize() successfully loads the ICU shared library or DLL, it then calls u_init() to initialize ICU.


Version 3.0.3 -- 18 September 2004

  • Bug fix: Unnecessary string constructor in FieldBody::unfold causes slow performance.

  • Added global option Max Depth. This value limits the depth to which the parser will automatically parse nested body parts. Added a global function mimepp::setMaxDepth(int) that allows the developer to set the value. (Default value is 5). This new feature limits exposure to denial of service attacks.

  • Improved MediaType::createBoundary()


Version 3.0.2 -- 5 July 2004

  • Bug fix: When creating encoded words from Unicode text, and when the encoding is modal, each segment should end in ASCII mode.

Version 3.0.1 -- 6 May 2004

  • Changed DllMain() so that it does not call mimepp::Initialize() (Microsoft Windows)

  • Added solution and project files for Visual Studio .NET.


Version 3.0 -- 31 January 2004

  • Support for converting many character encodings to and from Unicode

  • Checked builds added

  • Debug build added (Windows only)


Version 2.2.3 -- 30 November 2003

  • Bug fix: Memory leak in Group::parse()

Version 2.2.2 -- 24 July 2003

  • Bug fix: TextUtil::toLf() returns string with incorrect length

  • Bug fix: decoding error in Base64Decoder::decode() causes memory to be freed twice

  • Base64Decoder::decode() returns empty string if decoding error occurs

  • Added StringRep::reallocBuffer() function

  • Added QuotedPrintableDecoder::errorDetected() function

  • Internal changes to Base64Decoder, Base64Encoder, QuotedPrintableDecoder, and QuotedPrintableEncoder


Version 2.2.1 -- 27 May 2003

  • Bug fix: segmentation violation when parsing an encoded word like "=?koi8-r?B??=" (zero-length base64 string)

Version 2.2 -- 13 February 2003

  • Minor changes to the code that yield drastic speed improvement

  • Changes in the source code to improve portability (we compiled it on Tru64 Unix with Digital C++ and HP/UX 11 with aCC)

  • Node::parent() made a const member function

  • Doctree example code updated


Version 2.1.1 -- 15 January 2003

  • Bug fix: parameters in headers fields that contain spaces are delimited by quotation marks

Version 2.1 -- 11 November 2002

  • Bug fix: off-by-one error in String::c_str() fixed

  • Bug fix: Parent Node of FieldBody not set in Field::fieldBody()

  • Added new convenience functions: MediaType::charset() and MediaType::setCharset(const String&)

  • mail::Text changed to contain text language

  • new examples added to the How-To document


Version 2.0.2 -- 15 October 2002

  • Bug fix: Base64Encoder would sometimes omit a line break

  • Bug fix: Memory leak when parsing address lists and mailbox lists

  • Bug fix: TextUtil::toCrLf() fixed

  • Bug fix: Memory leak in EncodedWord fixed

  • Bug fix: Delete problem in Body fixed

  • Bug fix: Delete problem in QuotedPrintableEncoder fixed


Version 2.0.1 -- 13 September 2002

  • Bug fix: String::find_first_of() and related functions fixed. (The bug was introduced by internal changes in version 2.0.)

  • Bug fix: String::reserve() fixed

  • Bug fix: String::capacity() fixed

  • Body class: parse() and assemble() check for subtype of "rfc822" if primary type is "message"

  • Field class: possible memory leak fixed in the assignment operator

  • MediaType::createBoundary() now returns the newly created boundary string

  • Some utility functions in TextUtil class renamed

  • New example code for MHTML


Version 2.0 -- 15 August 2002

  • Major changes, listed in Release Notes 2.0

Version 1.3.7 -- 19 June 2002

  • Bug fix: Final boundary of multipart body not recognized if the last line has no LF

  • Bug fix: DwMessage has is-modified flag set after Parse() is called


Version 1.3.6 -- 16 May 2002

  • Bug fix: DwAddressList instance assigned to Resent-To header field

Version 1.3.5 -- 13 September 2001

  • Fixed the SMTP example

  • Limit in eval libraries extended from 64K to 256K


Version 1.3.4 -- 27 July 2001

  • Added more examples and documentation

Version 1.3.3 -- 10 February 2001

  • Added more examples

Version 1.3.2 -- 8 July 2000

  • Changes to parser for multipart messages to match the boundary more strictly. Fixes a problem with certain badly formed multipart messages from Qualcomm's Eudora

Version 1.3.1 -- 12 June 2000

  • DwText::operator= rewritten (bug fix)

  • DwMediaType::CreateBoundary() adds constant to serial number to avoid seeding the random number generator with zero. (semi-bug fix)

  • Fixed bug in DwMailbox which caused the full name to drop a space when encoded and non-encoded words were both present

  • Function q_decode() changed to pass through 8-bit characters (old behavior: 8-bit characters, which are illegal in encoded text, were ignored)

  • DwDateTime::SetValues() sets the is-modified flag (bug fix)

  • In DwAddressList::Assemble(), if an address in the list is invalid, it is included in the assembled string. Similarly, in DwMailboxList::Assemble(), if a mailbox in the list is invalid, it is included in the assembled string. (Old behavior: invalid addresses were not included)

  • In DwAddressList::Parse(), if an address is invalid, it is added to the list. Similarly, in DwMailboxList::Parse(), if a mailbox is invalid, it is added to the list. (Old behavior: invalid addresses were not added to the list.)

  • Added 'const' to DwMailbox::GetFullName()

  • Various bug fixes connected with setting the parent of added child objects

  • Fixed memory leak in DwBoyerMoore class


Version 1.3 -- 29 April 2000

  • Content-transfer-encoding utility functions moved from util library to core library

  • New functions DwBEncode(), DwQEncode(), and DwQDecode() added to support encoding and decoding of non-ASCII text in header fields

  • New class DwEncodedWord added

  • Eliminated use of isspace() and related functions from <ctype.h>. The functions are not suitable for use in MIME++ if the locale is not the C locale. Affects field.cpp, string.cpp, token.cpp, uuencode.cpp.

  • New functions in DwMailbox to set and get full name as non-ASCII string

  • New system-dependent function DwGetHostByName(), which is thread-safe. This function replaces gethostbyname(), which is not thread-safe on all Unix OSes.

  • (Unix) Uses static mutex initializer

  • Changes to DwText to handle encoded words and non-ASCII text (RFC 2047)

  • DwMessageComponent::FromString() clears is-modified flag. I believe this is the correct behavior, but could conceivably break some existing code.


Version 1.2.4 -- 21 Feb 2000

  • Fixed a bug in DwPopClient::GetMultiListResponse() and DwNntpClient::PGetTextResponse(). When there was a period at the beginning of a line, the pointer was advanced but the line length was not decremented.

Version 1.2.3 -- 26 Aug 1999

  • DwInitialize() returns a boolean value. If the return value is false, then the library must not be used.

  • In Win32, DwInitialize() is called from DllMain() when the DLL is loaded. If you are in Win32 but not using a DLL, you must call DwInitialize() before using the library, in order to initialize a CRITICAL_SECTION. In Unix, DwInitialize() is not used, but it might be a good idea to call it, in case this changes in the future.

  • DwMediaType::CreateBoundary had a bug where it would create identical boundaries for nested body parts. The fixed version always creates a unique boundary.

  • DwMsgId::CreateDefault() always creates a unique message ID. The old version would create the same ID if called twice within the same second.

  • The parser in DwEntity, which looks for the end of the headers and the beginning of the body, will handle most messages where the blank line separating headers and body is missing. A line that is not part of a wrapped header field, and which does not contain a colon (':'), is considered to be the first line of the body.

  • Added DwNextInteger() to system.cpp. In a multithreaded environment, this function provides serialized access to a counter shared by all threads.

  • The static integer counter, which was used in DwString and in DwMessageComponent to assign object IDs have been removed. The ObjectId() functions just return the "this" pointer cast to an integer. [This changed was required to make the library multithread-safe. Keeping the counter would have required serializing all access to it, which would have be too inefficient.]


Version 1.2.2 -- 5 Jun 1999

  • Y2K fix (sort of). As of 1989, all dates used in Internet email are required to use 4 digit years (RFC 1123). The date handling code in MIME++ has always used only four digit years, and has always taken a four digit year for granted. With this fix, if it receives a two digit year between 0 and 50, it is assumed to refer to a year in the 2000s. If it receives a two digit year between 51 and 99, it is assumed to refer to a year in the 1900s.

  • Fixed a bug where the parent object wasn't set when some objects were copied.

  • Fixed a bug that caused a segmentation violation when a date was parsed that ended with an open parenthesis.


Version 1.2.1 -- 18 Mar 1999

  • Fixed bug that occurred when using DwString::rfind() on a zero-length string

  • Fixed bug in DwPopClient::Uidl(int)


Version 1.2 -- 10 Dec 1998

  • Added new class DwStamp for representing field-body of Received field

  • Uses reentrant version of rand()

  • DwMsgId::CreateDefault() changed -- made reentrant

  • Removed TakeBuffer(), ReleaseBuffer(), CopyTo(), and RefCount() from DwString.

  • Changes to DwString to resolve problems that could arise in multithreaded environment

  • Win32 version uses Win32 API function GetTimeZoneInformation() instead of standard C library functions localtime() and gmtime() to get time zone

  • Fixed bug in DwPopClient -- Uidl(int) calls GetSingleLineReponse() instead of GetMultiLineResponse()

  • Fixed bug where some DwFieldBody objects where not correctly marked as modified when required (DwAddressList, DwBody, DwMailboxList, DwMediaType, DwDispositionType)


Version 1.1.1 -- 20 May 1998

  • The code to convert between strings and enums for media types and subtypes was updated to convert the new enums added in version 1.1.

Version 1.1 -- 1 May 1998

  • The single library is now split into three libraries:

    mimepp_core - the basic classes for MIME components
    mimepp_util - utilities (base64, quoted-printable, and so on)
    mimepp_net - SMTP, POP, NNTP

    The primary reason for splitting into three is portability: the core and util libraries should be relatively easy to port to other systems, while the net library requires the network functions to be ported.

  • The library now depends on "portability functions". If you need to port the core library to a new platform, just implement the portability functions on that platform, and the rest of the library should work. (More work would be required to port the net library.) These functions are declared in the file system.h. The Unix implementation is in sys_un.cpp; the Windows implementation is in sys_nt.cpp.

  • Supports ANSI iostreams and cfront-compatible iostreams. Note that these two iostreams libraries are not compatible, and you must compile for one or the other. The selected library is determined by a "#define" in the file config.h.

  • Changed the interface for managing lists. The earlier versions used intrusive linked lists and supported iteration but not random access. The new interface is consistent among all lists, uses dynamically resized arrays internally, and supports random access. The affected classes are these:

    Containers: DwAddressList, DwBody, DwDispositionType, DwHeaders, DwMailboxList, DwMediaType

    Items: DwAddress, DwBodyPart, DwField, DwHeaders, DwParameter

  • Throws an exception if an index is out of bounds. Added new classes DwException and DwBoundsException. A "#define" in config.h allows this feature to be disabled.

  • There are very few, if any, inline functions.

  • The library is more forgiving if there is no final boundary in a multipart entity.

  • Added member functions to DwBody to access the preamble and epilogue of a multipart body.

  • Changes to DwDateTime

    • improved interface
    • improved implementation
    • can add the time zone name as a comment string, will recognize the time zone name in a final comment
    • all system dependencies are handled in the new portability functions
  • More enumerated values for registered IANA values, including MIME media types and subtypes. The enums are declared in enum.h.

  • Supports Winsock 2. Set the right "#define" in config.h to select Winsock 1.1 or Winsock 2.


Version 1.0 -- 1 Sep 1997

  • First release