From eb8a64fd8d4bbdc173ccbf599d737ea48d40c475 Mon Sep 17 00:00:00 2001 From: wolfgang Date: Thu, 22 Nov 2007 23:05:51 +0000 Subject: [PATCH] git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1275 d1b88da0-ebda-0310-925b-ed51d893ca5b --- ChangeLog | 10 + ...et-r1548.diff => sope-patchset-r1551.diff} | 297 ++++++++++++++---- SoObjects/Mailer/SOGoMailBodyPart.m | 3 +- SoObjects/Mailer/SOGoMailObject.m | 3 +- .../Toolbars/SOGoContactFolder.toolbar | 2 +- .../English.lproj/Localizable.strings | 2 +- UI/MailPartViewers/UIxMailPartHTMLViewer.m | 2 - UI/MailPartViewers/UIxMailRenderingContext.m | 66 ++-- .../Toolbars/SOGoAppointmentFolders.toolbar | 2 +- 9 files changed, 280 insertions(+), 107 deletions(-) rename SOPE/{sope-patchset-r1548.diff => sope-patchset-r1551.diff} (85%) diff --git a/ChangeLog b/ChangeLog index b4f6d4fd..f3a0e7f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2007-11-22 Wolfgang Sourdeau + * UI/MailPartViewers/UIxMailRenderingContext.m + ([UIxMailRenderingContext -viewerForBodyInfo:_info]): same as below. + + * SoObjects/Mailer/SOGoMailObject.m ([SOGoMailObject + -plainTextContentFetchKeys]): same as below. + + * SoObjects/Mailer/SOGoMailBodyPart.m ([SOGoMailBodyPart + +bodyPartClassForMimeType:mimeTypeinContext:_ctx]): accept the + application/ics type from Google Calendar. + * SoObjects/SOGo/NSCalendarDate+SOGo.m ([NSCalendarDate +distantFuture]): rewrote method to return an object that is compatible with NSCalendarDate, unlike the implementation in diff --git a/SOPE/sope-patchset-r1548.diff b/SOPE/sope-patchset-r1551.diff similarity index 85% rename from SOPE/sope-patchset-r1548.diff rename to SOPE/sope-patchset-r1551.diff index 84d6abab..6faa58df 100644 --- a/SOPE/sope-patchset-r1548.diff +++ b/SOPE/sope-patchset-r1551.diff @@ -1,6 +1,50 @@ +Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m +=================================================================== +--- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1551) ++++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (copie de travail) +@@ -713,6 +713,39 @@ + return ms; + } + ++/* GCSEOAdaptorChannel protocol */ ++static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ ++ @" c_name VARCHAR (256) NOT NULL,\n" ++ @" c_content VARCHAR (100000) NOT NULL,\n" ++ @" c_creationdate INT4 NOT NULL,\n" ++ @" c_lastmodified INT4 NOT NULL,\n" ++ @" c_version INT4 NOT NULL,\n" ++ @" c_deleted INT4 NULL\n" ++ @")"); ++static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ ++ @" c_uid VARCHAR (256) NOT NULL,\n" ++ @" c_object VARCHAR (256) NOT NULL,\n" ++ @" c_role VARCHAR (80) NOT NULL\n" ++ @")"); ++ ++- (NSException *) createGCSFolderTableWithName: (NSString *) tableName ++{ ++ NSString *sql; ++ ++ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; ++ ++ return [self evaluateExpressionX: sql]; ++} ++ ++- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName ++{ ++ NSString *sql; ++ ++ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; ++ ++ return [self evaluateExpressionX: sql]; ++} ++ + @end /* PostgreSQL72Channel */ + + @implementation PostgreSQL72Channel(PrimaryKeyGeneration) Index: sope-mime/NGImap4/NGImap4Connection.m =================================================================== ---- sope-mime/NGImap4/NGImap4Connection.m (révision 1548) +--- sope-mime/NGImap4/NGImap4Connection.m (révision 1551) +++ sope-mime/NGImap4/NGImap4Connection.m (copie de travail) @@ -381,7 +381,7 @@ @@ -13,7 +57,7 @@ Index: sope-mime/NGImap4/NGImap4Connection.m [self errorWithFormat:@"Could not list mailbox hierarchy!"]; Index: sope-mime/NGImap4/NGImap4ResponseNormalizer.m =================================================================== ---- sope-mime/NGImap4/NGImap4ResponseNormalizer.m (révision 1548) +--- sope-mime/NGImap4/NGImap4ResponseNormalizer.m (révision 1551) +++ sope-mime/NGImap4/NGImap4ResponseNormalizer.m (copie de travail) @@ -648,14 +648,13 @@ enumerator = [_flags objectEnumerator]; @@ -39,7 +83,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseNormalizer.m if (objs) free(objs); Index: sope-mime/NGImap4/NGImap4ResponseParser.m =================================================================== ---- sope-mime/NGImap4/NGImap4ResponseParser.m (révision 1548) +--- sope-mime/NGImap4/NGImap4ResponseParser.m (révision 1551) +++ sope-mime/NGImap4/NGImap4ResponseParser.m (copie de travail) @@ -84,6 +84,8 @@ static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, @@ -230,24 +274,163 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m { Index: sope-mime/NGMail/NGSmtpClient.m =================================================================== ---- sope-mime/NGMail/NGSmtpClient.m (révision 1548) +--- sope-mime/NGMail/NGSmtpClient.m (révision 1551) +++ sope-mime/NGMail/NGSmtpClient.m (copie de travail) -@@ -442,10 +442,10 @@ +@@ -24,6 +24,82 @@ + #include "NGSmtpReplyCodes.h" + #include "common.h" + ++// ++// Useful extension that comes from Pantomime which is also ++// released under the LGPL. ++// ++@interface NSMutableData (DataCleanupExtension) ++ ++- (NSRange) rangeOfCString: (const char *) theCString; ++- (NSRange) rangeOfCString: (const char *) theCString ++ options: (unsigned int) theOptions ++ range: (NSRange) theRange; ++@end ++ ++@implementation NSMutableData (DataCleanupExtension) ++ ++- (NSRange) rangeOfCString: (const char *) theCString ++{ ++ return [self rangeOfCString: theCString ++ options: 0 ++ range: NSMakeRange(0,[self length])]; ++} ++ ++-(NSRange) rangeOfCString: (const char *) theCString ++ options: (unsigned int) theOptions ++ range: (NSRange) theRange ++{ ++ const char *b, *bytes; ++ int i, len, slen; ++ ++ if (!theCString) ++ { ++ return NSMakeRange(NSNotFound,0); ++ } ++ ++ bytes = [self bytes]; ++ len = [self length]; ++ slen = strlen(theCString); ++ ++ b = bytes; ++ ++ if (len > theRange.location + theRange.length) ++ { ++ len = theRange.location + theRange.length; ++ } ++ ++ if (theOptions == NSCaseInsensitiveSearch) ++ { ++ i = theRange.location; ++ b += i; ++ ++ for (; i <= len-slen; i++, b++) ++ { ++ if (!strncasecmp(theCString,b,slen)) ++ { ++ return NSMakeRange(i,slen); ++ } ++ } ++ } ++ else ++ { ++ i = theRange.location; ++ b += i; ++ ++ for (; i <= len-slen; i++, b++) ++ { ++ if (!memcmp(theCString,b,slen)) ++ { ++ return NSMakeRange(i,slen); ++ } ++ } ++ } ++ ++ return NSMakeRange(NSNotFound,0); ++} ++ ++@end ++ + @interface NGSmtpClient(PrivateMethods) + - (void)_fetchExtensionInfo; + @end +@@ -429,7 +505,9 @@ + + - (BOOL)sendData:(NSData *)_data { + NGSmtpResponse *reply = nil; +- ++ NSMutableData *cleaned_data; ++ NSRange r1, r2; ++ + [self requireState:NGSmtpState_TRANSACTION]; + + reply = [self sendCommand:@"DATA"]; +@@ -441,11 +519,54 @@ + } [self->text flush]; ++ cleaned_data = [NSMutableData dataWithData: _data]; ++ ++ // ++ // According to RFC 2821 section 4.5.2, we must check for the character ++ // sequence "."; any occurrence have its period duplicated ++ // to avoid data transparency. ++ // ++ // The following code was copied from Pantomime (and also the one ++ // that strips Bcc: headers from the mail's content) ++ // ++ r1 = [cleaned_data rangeOfCString: "\r\n."]; ++ ++ while (r1.location != NSNotFound) ++ { ++ [cleaned_data replaceBytesInRange: r1 withBytes: "\r\n.." length: 4]; ++ ++ r1 = [cleaned_data rangeOfCString: "\r\n." ++ options: 0 ++ range: NSMakeRange(NSMaxRange(r1)+1, [cleaned_data length]-NSMaxRange(r1)-1)]; ++ } ++ ++ // ++ // We now look for the Bcc: header. If it is present, we remove it. ++ // Some servers, like qmail, do not remove it automatically. ++ // ++ r1 = [cleaned_data rangeOfCString: "\r\n\r\n"]; ++ r1 = [cleaned_data rangeOfCString: "\r\nBcc: " ++ options: 0 ++ range: NSMakeRange(0,r1.location-1)]; ++ ++ if (r1.location != NSNotFound) ++ { ++ // We search for the first \r\n AFTER the Bcc: header and ++ // replace the whole thing with \r\n. ++ r2 = [cleaned_data rangeOfCString: "\r\n" ++ options: 0 ++ range: NSMakeRange(NSMaxRange(r1)+1,[cleaned_data length]-NSMaxRange(r1)-1)]; ++ [cleaned_data replaceBytesInRange: NSMakeRange(r1.location, NSMaxRange(r2)-r1.location) ++ withBytes: "\r\n" ++ length: 2]; ++ } ++ ++ if (self->isDebuggingEnabled) - [NGTextErr writeFormat:@"C: data(%i bytes) ..\n", [_data bytes]]; -+ [NGTextErr writeFormat:@"C: data(%i bytes) ..\n", [_data length]]; ++ [NGTextErr writeFormat:@"C: data(%i bytes) ..\n", [cleaned_data length]]; - [self->connection safeWriteBytes:[_data bytes] count:[_data length]]; +- [self->connection safeWriteBytes:[_data bytes] count:[_data length]]; - [self->connection safeWriteBytes:".\r\n" count:3]; ++ [self->connection safeWriteBytes:[cleaned_data bytes] count:[cleaned_data length]]; + [self->connection safeWriteBytes:"\r\n.\r\n" count:5]; [self->connection flush]; reply = [self receiveReply]; Index: sope-mime/NGMail/NGMimeMessageGenerator.m =================================================================== ---- sope-mime/NGMail/NGMimeMessageGenerator.m (révision 1548) +--- sope-mime/NGMail/NGMimeMessageGenerator.m (révision 1551) +++ sope-mime/NGMail/NGMimeMessageGenerator.m (copie de travail) @@ -86,37 +86,40 @@ char *des = NULL; @@ -313,7 +496,7 @@ Index: sope-mime/NGMail/NGMimeMessageGenerator.m unsigned isoEndLen = 2; Index: sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m =================================================================== ---- sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (révision 1548) +--- sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (révision 1551) +++ sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m (copie de travail) @@ -285,24 +285,16 @@ - (id)parseValue:(id)_data ofHeaderField:(NSString *)_field { @@ -347,7 +530,7 @@ Index: sope-mime/NGMime/NGMimeRFC822DateHeaderFieldParser.m bytes++; Index: sope-mime/NGMime/NGMimeBodyPart.m =================================================================== ---- sope-mime/NGMime/NGMimeBodyPart.m (révision 1548) +--- sope-mime/NGMime/NGMimeBodyPart.m (révision 1551) +++ sope-mime/NGMime/NGMimeBodyPart.m (copie de travail) @@ -31,18 +31,6 @@ return 2; @@ -385,7 +568,7 @@ Index: sope-mime/NGMime/NGMimeBodyPart.m - (NSString *)contentId { Index: sope-mime/NGMime/NGMimeBodyParser.m =================================================================== ---- sope-mime/NGMime/NGMimeBodyParser.m (révision 1548) +--- sope-mime/NGMime/NGMimeBodyParser.m (révision 1551) +++ sope-mime/NGMime/NGMimeBodyParser.m (copie de travail) @@ -67,7 +67,10 @@ if (_data == nil) return nil; @@ -401,7 +584,7 @@ Index: sope-mime/NGMime/NGMimeBodyParser.m Index: sope-mime/NGMime/NGMimePartParser.h =================================================================== ---- sope-mime/NGMime/NGMimePartParser.h (révision 1548) +--- sope-mime/NGMime/NGMimePartParser.h (révision 1551) +++ sope-mime/NGMime/NGMimePartParser.h (copie de travail) @@ -117,6 +117,7 @@ BOOL parserParseRawBodyDataOfPart:1; @@ -423,7 +606,7 @@ Index: sope-mime/NGMime/NGMimePartParser.h @interface NSObject(NGMimePartParser) Index: sope-mime/NGMime/NGMimePartParser.m =================================================================== ---- sope-mime/NGMime/NGMimePartParser.m (révision 1548) +--- sope-mime/NGMime/NGMimePartParser.m (révision 1551) +++ sope-mime/NGMime/NGMimePartParser.m (copie de travail) @@ -227,7 +227,7 @@ } @@ -448,7 +631,7 @@ Index: sope-mime/NGMime/NGMimePartParser.m : [NGMimeType mimeType:[ctype stringValue]]; Index: sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m =================================================================== ---- sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (révision 1548) +--- sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (révision 1551) +++ sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m (copie de travail) @@ -49,80 +49,70 @@ @@ -582,53 +765,9 @@ Index: sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m } return data; } -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1548) -+++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (copie de travail) -@@ -713,6 +713,39 @@ - return ms; - } - -+/* GCSEOAdaptorChannel protocol */ -+static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_name VARCHAR (256) NOT NULL,\n" -+ @" c_content VARCHAR (100000) NOT NULL,\n" -+ @" c_creationdate INT4 NOT NULL,\n" -+ @" c_lastmodified INT4 NOT NULL,\n" -+ @" c_version INT4 NOT NULL,\n" -+ @" c_deleted INT4 NULL\n" -+ @")"); -+static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n" \ -+ @" c_uid VARCHAR (256) NOT NULL,\n" -+ @" c_object VARCHAR (256) NOT NULL,\n" -+ @" c_role VARCHAR (80) NOT NULL\n" -+ @")"); -+ -+- (NSException *) createGCSFolderTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ -+- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName -+{ -+ NSString *sql; -+ -+ sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName]; -+ -+ return [self evaluateExpressionX: sql]; -+} -+ - @end /* PostgreSQL72Channel */ - - @implementation PostgreSQL72Channel(PrimaryKeyGeneration) Index: sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m =================================================================== ---- sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (révision 1548) +--- sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (révision 1551) +++ sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m (copie de travail) @@ -140,8 +140,12 @@ @@ -671,7 +810,7 @@ Index: sope-core/NGExtensions/FdExt.subproj/NSString+Encoding.m static char *iconv_wrapper(id self, char *_src, unsigned _srcLen, Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h =================================================================== ---- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (révision 1548) +--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (révision 1551) +++ sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h (copie de travail) @@ -19,6 +19,8 @@ 02111-1307, USA. @@ -682,9 +821,18 @@ Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.h #include #include #include +@@ -34,7 +36,7 @@ + + @interface libxmlHTMLSAXDriver : NSObject < SaxXMLReader > + { +- id contentHandler; ++ NSObject *contentHandler; + id dtdHandler; + id errorHandler; + id entityResolver; Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m =================================================================== ---- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (révision 1548) +--- sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (révision 1551) +++ sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m (copie de travail) @@ -30,6 +30,12 @@ #include @@ -699,6 +847,19 @@ Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m @interface libxmlHTMLSAXDriver(PrivateMethods) - (void)tearDownParser; +@@ -194,10 +200,10 @@ + return self->entityResolver; + } + +-- (void)setContentHandler:(id)_handler { ++- (void)setContentHandler:(NSObject *)_handler { + ASSIGN(self->contentHandler, _handler); + } +-- (id)contentHandler { ++- (NSObject *)contentHandler { + return self->contentHandler; + } + @@ -205,6 +211,7 @@ - (void)setupParserWithDocumentPath:(NSString *)_path { @@ -731,7 +892,7 @@ Index: sope-xml/libxmlSAXDriver/libxmlHTMLSAXDriver.m - (void)tearDownParser { Index: sope-appserver/NGObjWeb/GNUmakefile.postamble =================================================================== ---- sope-appserver/NGObjWeb/GNUmakefile.postamble (révision 1548) +--- sope-appserver/NGObjWeb/GNUmakefile.postamble (révision 1551) +++ sope-appserver/NGObjWeb/GNUmakefile.postamble (copie de travail) @@ -23,14 +23,20 @@ @@ -760,7 +921,7 @@ Index: sope-appserver/NGObjWeb/GNUmakefile.postamble -endif Index: sope-appserver/NGObjWeb/WOContext.m =================================================================== ---- sope-appserver/NGObjWeb/WOContext.m (révision 1548) +--- sope-appserver/NGObjWeb/WOContext.m (révision 1551) +++ sope-appserver/NGObjWeb/WOContext.m (copie de travail) @@ -64,11 +64,13 @@ static BOOL testNSURLs = NO; @@ -800,7 +961,7 @@ Index: sope-appserver/NGObjWeb/WOContext.m serverURL = [@"http://" stringByAppendingString:host]; Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m =================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (révision 1548) +--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (révision 1551) +++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (copie de travail) @@ -216,6 +216,12 @@ assocCount++; @@ -817,7 +978,7 @@ Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m =================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (révision 1548) +--- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (révision 1551) +++ sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m (copie de travail) @@ -40,6 +40,7 @@ WOAssociation *string; @@ -847,7 +1008,7 @@ Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m return YES; Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h =================================================================== ---- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (révision 1548) +--- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (révision 1551) +++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h (copie de travail) @@ -41,7 +41,8 @@ WOAssociation *pageName; @@ -861,7 +1022,7 @@ Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h /* 'ivar' associations */ Index: sope-appserver/NGObjWeb/SoObjects/SoObject.m =================================================================== ---- sope-appserver/NGObjWeb/SoObjects/SoObject.m (révision 1548) +--- sope-appserver/NGObjWeb/SoObjects/SoObject.m (révision 1551) +++ sope-appserver/NGObjWeb/SoObjects/SoObject.m (copie de travail) @@ -39,22 +39,34 @@ static int debugLookup = -1; @@ -1012,7 +1173,7 @@ Index: sope-appserver/NGObjWeb/SoObjects/SoObject.m Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m =================================================================== ---- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (révision 1548) +--- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (révision 1551) +++ sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m (copie de travail) @@ -31,6 +31,7 @@ #include diff --git a/SoObjects/Mailer/SOGoMailBodyPart.m b/SoObjects/Mailer/SOGoMailBodyPart.m index fd4ebf41..c3bcf78d 100644 --- a/SoObjects/Mailer/SOGoMailBodyPart.m +++ b/SoObjects/Mailer/SOGoMailBodyPart.m @@ -360,7 +360,8 @@ static BOOL debugOn = NO; || [mimeType isEqualToString: @"image/jpg"] || [mimeType isEqualToString: @"image/jpeg"]) classString = @"SOGoImageMailBodyPart"; - else if ([mimeType isEqualToString: @"text/calendar"]) + else if ([mimeType isEqualToString: @"text/calendar"] + || [mimeType isEqualToString: @"application/ics"]) classString = @"SOGoCalendarMailBodyPart"; else if ([mimeType isEqualToString: @"text/x-vcard"]) classString = @"SOGoVCardMailBodyPart"; diff --git a/SoObjects/Mailer/SOGoMailObject.m b/SoObjects/Mailer/SOGoMailObject.m index 086bdfb4..f59ab0f0 100644 --- a/SoObjects/Mailer/SOGoMailObject.m +++ b/SoObjects/Mailer/SOGoMailObject.m @@ -585,7 +585,8 @@ static BOOL debugSoParts = NO; NSArray *types; types = [NSArray arrayWithObjects: @"text/plain", @"text/html", - @"text/calendar", @"application/pgp-signature", nil]; + @"text/calendar", @"application/ics", + @"application/pgp-signature", nil]; ma = [NSMutableArray arrayWithCapacity: 4]; [self addRequiredKeysOfStructure: [self bodyStructure] path: @"" toArray: ma acceptedTypes: types]; diff --git a/UI/Contacts/Toolbars/SOGoContactFolder.toolbar b/UI/Contacts/Toolbars/SOGoContactFolder.toolbar index 6c6971f5..7822b1a0 100644 --- a/UI/Contacts/Toolbars/SOGoContactFolder.toolbar +++ b/UI/Contacts/Toolbars/SOGoContactFolder.toolbar @@ -28,7 +28,7 @@ { link = "delete"; label="Delete"; onclick = "return uixDeleteSelectedContacts(this);"; - image="delete.png"; + image="tb-mail-delete-flat-24x24.png"; tooltip = "Delete selected card or address book"; } ) ) diff --git a/UI/MailPartViewers/English.lproj/Localizable.strings b/UI/MailPartViewers/English.lproj/Localizable.strings index 78f7a101..c87e44c6 100644 --- a/UI/MailPartViewers/English.lproj/Localizable.strings +++ b/UI/MailPartViewers/English.lproj/Localizable.strings @@ -13,7 +13,7 @@ cancel_info_text = "Your invitation or the whole event was canceled."; request_info_no_attendee = "is proposing a meeting to the attendees. You receive this mail as a notification, you are not scheduled as a participant."; Appointment = "Appointment"; -Organizer = "Organisateur"; +Organizer = "Organizer"; Time = "Time"; Attendees = "Attendees"; request_info = "invites you to participate in a meeting."; diff --git a/UI/MailPartViewers/UIxMailPartHTMLViewer.m b/UI/MailPartViewers/UIxMailPartHTMLViewer.m index c88f04d5..835de070 100644 --- a/UI/MailPartViewers/UIxMailPartHTMLViewer.m +++ b/UI/MailPartViewers/UIxMailPartHTMLViewer.m @@ -546,8 +546,6 @@ preparsedContent = [super decodedFlatContent]; parser = [[SaxXMLReaderFactory standardXMLReaderFactory] createXMLReaderForMimeType: @"text/html"]; - [parser setValue: [NSNumber numberWithBool: NO] - forKey: @"encodeEntities"]; handler = [_UIxHTMLMailContentHandler new]; [handler setAttachmentIds: [self _attachmentIds]]; diff --git a/UI/MailPartViewers/UIxMailRenderingContext.m b/UI/MailPartViewers/UIxMailRenderingContext.m index 74494f4d..a82097f6 100644 --- a/UI/MailPartViewers/UIxMailRenderingContext.m +++ b/UI/MailPartViewers/UIxMailRenderingContext.m @@ -265,22 +265,22 @@ static BOOL showNamedTextAttachmentsInline = NO; else if ([st isEqualToString:@"alternative"]) return [self alternativeViewer]; - if ([st isEqualToString:@"report"]) - /* this is used by mail-delivery reports */ - return [self mixedViewer]; + if ([st isEqualToString:@"report"]) + /* this is used by mail-delivery reports */ + return [self mixedViewer]; } else if ([mt isEqualToString:@"text"]) { - if ([st isEqualToString:@"plain"] || [st isEqualToString:@"html"]) { - if (!showNamedTextAttachmentsInline && [self _shouldDisplayAsAttachment: _info]) - return [self linkViewer]; + if ([st isEqualToString:@"plain"] || [st isEqualToString:@"html"]) { + if (!showNamedTextAttachmentsInline && [self _shouldDisplayAsAttachment: _info]) + return [self linkViewer]; - return [st isEqualToString:@"html"] - ? [self htmlViewer] : [self textViewer]; - } + return [st isEqualToString:@"html"] + ? [self htmlViewer] : [self textViewer]; + } - if ([st isEqualToString:@"calendar"]) - return [self iCalViewer]; + if ([st isEqualToString:@"calendar"]) + return [self iCalViewer]; } if ([mt isEqualToString:@"image"]) @@ -307,7 +307,7 @@ static BOOL showNamedTextAttachmentsInline = NO; Action: failed Status: 5.0.0 Diagnostic-Code: X-Postfix; host plop.com[64.39.31.55] said: 550 5.7.1 - ... Relaying denied + ... Relaying denied */ // Note: we cannot use the text viewer because the body is not pre-fetched return [self linkViewer]; @@ -317,28 +317,30 @@ static BOOL showNamedTextAttachmentsInline = NO; { // octet-stream (generate download link?, autodetect type?) - if ([st hasPrefix:@"x-vnd.kolab."]) - { - if ([st isEqualToString:@"x-vnd.kolab.contact"]) - return [self kolabContactViewer]; - if ([st isEqualToString:@"x-vnd.kolab.event"]) - return [self kolabEventViewer]; - if ([st isEqualToString:@"x-vnd.kolab.task"]) - return [self kolabTodoViewer]; - if ([st isEqualToString:@"x-vnd.kolab.note"]) - return [self kolabNoteViewer]; - if ([st isEqualToString:@"x-vnd.kolab.journal"]) - return [self kolabJournalViewer]; - if ([st isEqualToString:@"x-vnd.kolab.contact.distlist"]) - return [self kolabDistributionListViewer]; + if ([st hasPrefix:@"x-vnd.kolab."]) + { + if ([st isEqualToString:@"x-vnd.kolab.contact"]) + return [self kolabContactViewer]; + if ([st isEqualToString:@"x-vnd.kolab.event"]) + return [self kolabEventViewer]; + if ([st isEqualToString:@"x-vnd.kolab.task"]) + return [self kolabTodoViewer]; + if ([st isEqualToString:@"x-vnd.kolab.note"]) + return [self kolabNoteViewer]; + if ([st isEqualToString:@"x-vnd.kolab.journal"]) + return [self kolabJournalViewer]; + if ([st isEqualToString:@"x-vnd.kolab.contact.distlist"]) + return [self kolabDistributionListViewer]; - [self errorWithFormat:@"found no viewer for Kolab type: %@/%@", mt, st]; - return [self linkViewer]; - } - + [self errorWithFormat:@"found no viewer for Kolab type: %@/%@", mt, st]; + return [self linkViewer]; + } + else if ([st isEqualToString:@"ics"]) /* Cooqle K4lendahr - Google Calendar */ + return [self iCalViewer]; + #if 0 /* the link viewer looks better than plain text ;-) */ - if ([st isEqualToString:@"pgp-signature"]) // TODO: real PGP viewer - return [self textViewer]; + if ([st isEqualToString:@"pgp-signature"]) // TODO: real PGP viewer + return [self textViewer]; #endif } diff --git a/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar b/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar index b50fa350..d23428f1 100644 --- a/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar +++ b/UI/Scheduler/Toolbars/SOGoAppointmentFolders.toolbar @@ -19,7 +19,7 @@ { link = "delete"; label="Delete"; onclick = "return deleteEvent(this);"; - image = "delete.png"; + image = "tb-mail-delete-flat-24x24.png"; tooltip = "Delete this event or task"; } ), ( { link = "today"; label="Go to Today"; -- 2.39.5