diff --git a/ChangeLog b/ChangeLog index 187d01e5f..179c160b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2011-02-13 Wolfgang Sourdeau + * UI/MailPartViewers/UIxMailPartViewer.m (-decodedFlatContent): + finally make use of the -bodyDataFromEncoding: category method + from NSData+Mail (Mailer module). + (-flatContentAsString): moved charset-decoding code into a new + category method named "-bodyStringFromCharset:" in NSData+Mail + (Mailer module). + * SoObjects/Mailer/SOGoMailObject.m (-lookupInfoForBodyPart:): accept "text" as path parameter and return the main bodyStructure in that case. diff --git a/SoObjects/Mailer/NSData+Mail.h b/SoObjects/Mailer/NSData+Mail.h index 9c7deb3ba..7258be786 100644 --- a/SoObjects/Mailer/NSData+Mail.h +++ b/SoObjects/Mailer/NSData+Mail.h @@ -30,6 +30,8 @@ @interface NSData (SOGoMailUtilities) - (NSData *) bodyDataFromEncoding: (NSString *) encoding; +- (NSString *) bodyStringFromCharset: (NSString *) charset; + - (NSString *) decodedHeader; @end diff --git a/SoObjects/Mailer/NSData+Mail.m b/SoObjects/Mailer/NSData+Mail.m index 6315979b1..57e99e5cd 100644 --- a/SoObjects/Mailer/NSData+Mail.m +++ b/SoObjects/Mailer/NSData+Mail.m @@ -26,6 +26,7 @@ #import #import #import +#import #import "NSData+Mail.h" @@ -36,24 +37,72 @@ NSString *realEncoding; NSData *decodedData; - realEncoding = [encoding lowercaseString]; - - if ([realEncoding isEqualToString: @"7bit"] - || [realEncoding isEqualToString: @"8bit"]) - decodedData = self; - else if ([realEncoding isEqualToString: @"base64"]) - decodedData = [self dataByDecodingBase64]; - else if ([realEncoding isEqualToString: @"quoted-printable"]) - decodedData = [self dataByDecodingQuotedPrintableTransferEncoding]; - else + if ([encoding length] > 0) { - decodedData = nil; - NSLog (@"encoding '%@' unknown, returning nil data", realEncoding); + realEncoding = [encoding lowercaseString]; + + if ([realEncoding isEqualToString: @"7bit"] + || [realEncoding isEqualToString: @"8bit"]) + decodedData = self; + else if ([realEncoding isEqualToString: @"base64"]) + decodedData = [self dataByDecodingBase64]; + else if ([realEncoding isEqualToString: @"quoted-printable"]) + decodedData = [self dataByDecodingQuotedPrintableTransferEncoding]; + else + { + decodedData = nil; + NSLog (@"encoding '%@' unknown, returning nil data", realEncoding); + } } + else + decodedData = self; return decodedData; } +- (NSString *) bodyStringFromCharset: (NSString *) charset +{ + NSString *lcCharset, *bodyString; + + if ([charset length]) + lcCharset = [charset lowercaseString]; + else + lcCharset = @"us-ascii"; + + bodyString = [NSString stringWithData: self usingEncodingNamed: lcCharset]; + if (![bodyString length]) + { + /* UTF-8 is used as a 8bit fallback charset... */ + bodyString = [[NSString alloc] initWithData: self + encoding: NSUTF8StringEncoding]; + [bodyString autorelease]; + } + + if (!bodyString) + { + /* + iCalendar invitations sent by Outlook 2002 have the annoying bug that the + mail states an UTF-8 content encoding but the actual iCalendar content is + encoding in Latin-1 (or Windows Western?). + + As a result the content decoding will fail (TODO: always?). In this case we + try to decode with Latin-1. + + Note: we could check for the Outlook x-mailer, but it was considered better + to try Latin-1 as a fallback in any case (be tolerant). + */ + + bodyString = [[NSString alloc] initWithData: self + encoding: NSISOLatin1StringEncoding]; + if (!bodyString) + [self errorWithFormat: @"an attempt to use" + @" NSISOLatin1StringEncoding as callback failed"]; + [bodyString autorelease]; + } + + return bodyString; +} + /* * Excpected form is: "=?charset?encoding?encoded text?=". */ diff --git a/UI/MailPartViewers/UIxMailPartViewer.m b/UI/MailPartViewers/UIxMailPartViewer.m index 4851301a6..2981875fd 100644 --- a/UI/MailPartViewers/UIxMailPartViewer.m +++ b/UI/MailPartViewers/UIxMailPartViewer.m @@ -31,13 +31,14 @@ #import #import -#import -#import +#import +#import +#import -#import "UI/MailerUI/WOContext+UIxMailer.h" +#import "MailerUI/WOContext+UIxMailer.h" #import "UIxMailRenderingContext.h" #import "UIxMailSizeFormatter.h" -#import "UI/SOGoUI/UIxComponent.h" +#import "SOGoUI/UIxComponent.h" #import "UIxMailPartViewer.h" @@ -114,28 +115,13 @@ return flatContent; } -#warning we should use NSData+Mail bodyDataFromEncoding: instead - (NSData *) decodedFlatContent { NSString *enc; enc = [[bodyInfo objectForKey:@"encoding"] lowercaseString]; - if ([enc isEqualToString:@"7bit"]) - return [self flatContent]; - - if ([enc isEqualToString:@"8bit"]) // TODO: correct? - return [self flatContent]; - - if ([enc isEqualToString:@"base64"]) - return [[self flatContent] dataByDecodingBase64]; - - if ([enc isEqualToString:@"quoted-printable"]) - return [[self flatContent] dataByDecodingQuotedPrintableTransferEncoding]; - - [self errorWithFormat:@"unsupported MIME encoding: %@", enc]; - - return [self flatContent]; + return [[self flatContent] bodyDataFromEncoding: enc]; } - (SOGoMailBodyPart *) clientPart @@ -170,40 +156,7 @@ { charset = [[bodyInfo objectForKey:@"parameterList"] objectForKey: @"charset"]; - if ([charset length]) - charset = [charset lowercaseString]; - else - charset = @"us-ascii"; - s = [NSString stringWithData: content usingEncodingNamed: charset]; - if (![s length]) - { - /* UTF-8 is used as a 8bit fallback charset... */ - s = [[NSString alloc] initWithData: content - encoding: NSUTF8StringEncoding]; - [s autorelease]; - } - - if (!s) - { - /* - iCalendar invitations sent by Outlook 2002 have the annoying bug that the - mail states an UTF-8 content encoding but the actual iCalendar content is - encoding in Latin-1 (or Windows Western?). - - As a result the content decoding will fail (TODO: always?). In this case we - try to decode with Latin-1. - - Note: we could check for the Outlook x-mailer, but it was considered better - to try Latin-1 as a fallback in any case (be tolerant). - */ - - s = [[NSString alloc] initWithData:content - encoding: NSISOLatin1StringEncoding]; - if (!s) - [self errorWithFormat: @"an attempt to use" - @" NSISOLatin1StringEncoding as callback failed"]; - [s autorelease]; - } + s = [content bodyStringFromCharset: charset]; } else {