From 016104d17c39cef9dccf110cdada4656646d5ee1 Mon Sep 17 00:00:00 2001 From: helge Date: Mon, 28 May 2007 13:08:17 +0000 Subject: [PATCH] improved handling of text content git-svn-id: http://svn.opengroupware.org/SOPE/trunk@1487 e4a50df8-12e2-0310-a44c-efbce7f8a7e3 --- sope-mime/ChangeLog | 4 + sope-mime/NGMime/ChangeLog | 7 ++ sope-mime/NGMime/GNUmakefile | 2 + sope-mime/NGMime/NGMimeBodyGenerator.m | 99 ------------------ sope-mime/NGMime/NGMimeRfc822BodyGenerator.m | 59 +++++++++++ sope-mime/NGMime/NGMimeTextBodyGenerator.m | 102 +++++++++++++++++++ sope-mime/Version | 2 +- 7 files changed, 175 insertions(+), 100 deletions(-) create mode 100644 sope-mime/NGMime/NGMimeRfc822BodyGenerator.m create mode 100644 sope-mime/NGMime/NGMimeTextBodyGenerator.m diff --git a/sope-mime/ChangeLog b/sope-mime/ChangeLog index 9cc785d1..38a9085e 100644 --- a/sope-mime/ChangeLog +++ b/sope-mime/ChangeLog @@ -1,3 +1,7 @@ +2007-05-28 Helge Hess + + * NGMime: improved text body encoding (v4.7.246) + 2007-05-15 Wolfgang Sourdeau * NGMime.m: encode string body contents using the charset diff --git a/sope-mime/NGMime/ChangeLog b/sope-mime/NGMime/ChangeLog index e255405e..64724089 100644 --- a/sope-mime/NGMime/ChangeLog +++ b/sope-mime/NGMime/ChangeLog @@ -1,3 +1,10 @@ +2007-05-28 Helge Hess + + * NGMimeTextBodyGenerator.m: reworked body contents encoding using the + character encoding support in NGExtension/NSString+Encoding + + * NGMimeBodyGenerator.m: moved contained classes to own .m files + 2007-05-15 Wolfgang Sourdeau * NGMimeBodyGenerator.m: encode string body contents using the charset diff --git a/sope-mime/NGMime/GNUmakefile b/sope-mime/NGMime/GNUmakefile index ca97ee83..65b1a3f5 100644 --- a/sope-mime/NGMime/GNUmakefile +++ b/sope-mime/NGMime/GNUmakefile @@ -72,6 +72,8 @@ NGMime_OBJC_FILES = \ NGMimeStringHeaderFieldGenerator.m \ \ NGMimeMultipartBodyGenerator.m \ + NGMimeTextBodyGenerator.m \ + NGMimeRfc822BodyGenerator.m \ -include GNUmakefile.preamble include $(GNUSTEP_MAKEFILES)/subproject.make diff --git a/sope-mime/NGMime/NGMimeBodyGenerator.m b/sope-mime/NGMime/NGMimeBodyGenerator.m index 39fc4020..2d5ebd4c 100644 --- a/sope-mime/NGMime/NGMimeBodyGenerator.m +++ b/sope-mime/NGMime/NGMimeBodyGenerator.m @@ -85,102 +85,3 @@ static BOOL debugOn = NO; } @end /* NGMimeBodyGenerator */ - - -@implementation NGMimeTextBodyGenerator - -+ (int)version { - return 2; -} -+ (void)initialize { - NSAssert2([super version] == 2, - @"invalid superclass (%@) version %i !", - NSStringFromClass([self superclass]), [super version]); -} - -- (NSStringEncoding)_encodingFromContentType:(NGMimeType *)_type { - NSStringEncoding encoding; - NSString *charset; - - encoding = [NSString defaultCStringEncoding]; - if (_type != nil) { - charset = [_type valueOfParameter: @"charset"]; - if ([charset length] > 0) { - if ([charset isEqualToString: @"utf-8"]) - encoding = NSUTF8StringEncoding; - else if ([charset isEqualToString: @"iso-8859-1"]) - encoding = NSISOLatin1StringEncoding; - /* more should be handled here */ - } - } - - return encoding; -} - -- (NSData *)generateBodyOfPart:(id)_part - additionalHeaders:(NGMutableHashMap *)_addHeaders - delegate:(id)_delegate -{ - NSStringEncoding encoding; - NSData *data; - id body; - - encoding = [self _encodingFromContentType: [_part contentType]]; - body = [_part body]; - data = nil; - - if ([body isKindOfClass:[NSString class]]) - data = [body dataUsingEncoding:encoding]; - else if ([body respondsToSelector:@selector(bytes)]) - data = body; - else if ([body respondsToSelector:@selector(dataUsingEncoding:)]) - data = [body dataUsingEncoding:encoding]; - else if (body != nil) { - [self logWithFormat:@"ERROR: unexpected part body: %@", body]; - return nil; - } - - if (data == nil) { - [self logWithFormat:@"WARNING(%s): generate empty body", - __PRETTY_FUNCTION__]; - data = [NSData data]; - } - return [self encodeData:data forPart:_part additionalHeaders:_addHeaders]; -} - -@end /* NGMimeTextBodyGenerator */ - - -@implementation NGMimeRfc822BodyGenerator - -+ (int)version { - return 2; -} -+ (void)initialize { - NSAssert2([super version] == 2, - @"invalid superclass (%@) version %i !", - NSStringFromClass([self superclass]), [super version]); -} - -- (id)generatorForPart:(id)_part { - id g; - - g = [[[NGMimePartGenerator alloc] init] autorelease]; - [g setUseMimeData:self->useMimeData]; - return g; -} - -- (NSData *)generateBodyOfPart:(id)_part - additionalHeaders:(NGMutableHashMap *)_addHeaders - delegate:(id)_delegate -{ - NSData *data; - NGMimePartGenerator *gen; - - gen = (NGMimePartGenerator *)[self generatorForPart:_part]; - [gen setDelegate:_delegate]; - data = [gen generateMimeFromPart:[_part body]]; - return data; -} - -@end /* NGMimeRfc822BodyGenerator */ diff --git a/sope-mime/NGMime/NGMimeRfc822BodyGenerator.m b/sope-mime/NGMime/NGMimeRfc822BodyGenerator.m new file mode 100644 index 00000000..30064e17 --- /dev/null +++ b/sope-mime/NGMime/NGMimeRfc822BodyGenerator.m @@ -0,0 +1,59 @@ +/* + Copyright (C) 2000-2007 SKYRIX Software AG + Copyright (C) 2007 Helge Hess + + This file is part of SOPE. + + SOPE is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + SOPE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with SOPE; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#include "NGMimeBodyGenerator.h" +#include "NGMimePartGenerator.h" +#include "common.h" + +@implementation NGMimeRfc822BodyGenerator + ++ (int)version { + return 2; +} ++ (void)initialize { + NSAssert2([super version] == 2, + @"invalid superclass (%@) version %i !", + NSStringFromClass([self superclass]), [super version]); +} + +- (id)generatorForPart:(id)_part { + id g; + + g = [[[NGMimePartGenerator alloc] init] autorelease]; + [g setUseMimeData:self->useMimeData]; + return g; +} + +- (NSData *)generateBodyOfPart:(id)_part + additionalHeaders:(NGMutableHashMap *)_addHeaders + delegate:(id)_delegate +{ + NSData *data; + NGMimePartGenerator *gen; + + gen = (NGMimePartGenerator *)[self generatorForPart:_part]; + [gen setDelegate:_delegate]; + data = [gen generateMimeFromPart:[_part body]]; + return data; +} + +@end /* NGMimeRfc822BodyGenerator */ diff --git a/sope-mime/NGMime/NGMimeTextBodyGenerator.m b/sope-mime/NGMime/NGMimeTextBodyGenerator.m new file mode 100644 index 00000000..2369ae95 --- /dev/null +++ b/sope-mime/NGMime/NGMimeTextBodyGenerator.m @@ -0,0 +1,102 @@ +/* + Copyright (C) 2000-2007 SKYRIX Software AG + Copyright (C) 2007 Helge Hess + + This file is part of SOPE. + + SOPE is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + SOPE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with SOPE; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. +*/ + +#include "NGMimeBodyGenerator.h" +#include "NGMimePartGenerator.h" +#include "common.h" + +@implementation NGMimeTextBodyGenerator + ++ (int)version { + return 2; +} ++ (void)initialize { + NSAssert2([super version] == 2, + @"invalid superclass (%@) version %i !", + NSStringFromClass([self superclass]), [super version]); +} + +- (NSStringEncoding)_encodingFromContentType:(NGMimeType *)_type { + NSStringEncoding encoding; + NSString *charset; + + encoding = [NSString defaultCStringEncoding]; + if (_type != nil) { + charset = [_type valueOfParameter: @"charset"]; + if ([charset length] > 0) { + if ([charset isEqualToString: @"utf-8"]) + encoding = NSUTF8StringEncoding; + else if ([charset isEqualToString: @"iso-8859-1"]) + encoding = NSISOLatin1StringEncoding; + /* more should be handled here */ + } + } + + return encoding; +} + +- (NSData *)generateBodyOfPart:(id)_part + additionalHeaders:(NGMutableHashMap *)_addHeaders + delegate:(id)_delegate +{ + NSData *data; + id body; + + body = [_part body]; + data = nil; + + if ([body isKindOfClass:[NSString class]]) { + NSString *charset = [[_part contentType] valueOfParameter:@"charset"]; + if ([charset isNotEmpty]) + data = [body dataUsingEncodingNamed:charset]; + + if (data == nil) /* either no charset given or the charset failed */ + data = [body dataUsingEncoding:[NSString defaultCStringEncoding]]; + } + else if ([body respondsToSelector:@selector(bytes)]) { + /* an NSData, but why not check the class?!, we can't just cast it */ + data = body; + } + else if ([body respondsToSelector:@selector(dataUsingEncoding:)]) { + /* hm, whats that?, NSString is covered before */ + NSStringEncoding encoding = 0; + NSString *charset = [[_part contentType] valueOfParameter:@"charset"]; + + if ([charset isNotEmpty]) + encoding = [NSString stringEncodingForEncodingNamed:charset]; + + data = [body dataUsingEncoding: + (encoding != 0 ? encoding : NSISOLatin1StringEncoding)]; + } + else if (body != nil) { + [self errorWithFormat:@"unexpected part body %@: %@", [body class], body]; + return nil; + } + + if (data == nil) { + [self warnWithFormat:@"%s: generate empty body", __PRETTY_FUNCTION__]; + data = [NSData data]; + } + return [self encodeData:data forPart:_part additionalHeaders:_addHeaders]; +} + +@end /* NGMimeTextBodyGenerator */ diff --git a/sope-mime/Version b/sope-mime/Version index e00a6227..160886bc 100644 --- a/sope-mime/Version +++ b/sope-mime/Version @@ -2,7 +2,7 @@ MAJOR_VERSION:=4 MINOR_VERSION:=7 -SUBMINOR_VERSION:=245 +SUBMINOR_VERSION:=246 # v4.5.214 requires libNGExtensions v4.5.146 # v4.2.149 requires libNGStreams v4.2.34 -- 2.39.5