Hunny MIME++ Change Log
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, NNTPThe 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