From af14ffbbe5d2d15da457fa3b26e053613dac5453 Mon Sep 17 00:00:00 2001 From: wolfgang Date: Mon, 17 Dec 2007 20:50:34 +0000 Subject: [PATCH] git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1307 d1b88da0-ebda-0310-925b-ed51d893ca5b --- ChangeLog | 35 ++++- SOPE/sope-patchset-r1557.diff | 139 +++++++++++------- SoObjects/Mailer/SOGoDraftObject.m | 5 + SoObjects/Mailer/SOGoMailBodyPart.h | 1 + SoObjects/Mailer/SOGoMailBodyPart.m | 84 ++++++----- UI/MailPartViewers/UIxMailPartImageViewer.m | 24 +-- UI/MailPartViewers/UIxMailPartViewer.h | 8 +- UI/MailPartViewers/UIxMailPartViewer.m | 79 +++++----- UI/MailerUI/UIxMailEditor.m | 6 +- UI/Scheduler/UIxCalListingActions.m | 8 +- .../UIxMailPartImageViewer.wox | 2 +- UI/Templates/MailerUI/UIxMailEditor.wox | 30 ++-- 12 files changed, 249 insertions(+), 172 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d5fba87..2e2565e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,40 @@ -2007-12-17 Francis Lachapelle +2007-12-17 Wolfgang Sourdeau - * UI/MailerUI/UIxMailMainFrame.m ([UIxMailMainFrame - -composeAction]): fixed URL when no recipient is specified. + * UI/MailerUI/UIxMailEditor.m ([UIxMailEditor -attachmentNames]): + initialize "attachmentNames" if it was NOT initialized... I think + this was a typo. -2007-12-17 Wolfgang Sourdeau + * SoObjects/Mailer/SOGoDraftObject.m ([SOGoDraftObject + -fetchMailForForwarding:sourceMail]): append the signature to + mails forwarded as attachment. + + * UI/MailPartViewers/UIxMailPartViewer.m ([UIxMailPartViewer + -clientPart]): new method that returns the corresponding + SOGoMailPart instance. + ([UIxMailPartViewer -pathToAttachment]): simplified method, ensure + the filename is present. If the part has none, create one with the + "Untitled-" prefix. Add an extension if none is found. + + * UI/MailPartViewers/UIxMailPartImageViewer.m + ([UIxMailPartImageViewer -pathToImage]): removed method since it + implementents exactly the same functionality as + [UIxMailPartViewer -pathToAttachment]. + + * SoObjects/Mailer/SOGoMailBodyPart.m ([SOGoMailBodyPart + -filename]): new method that returns the filename to the current + part by taking the different mime implementations into account. + [SOGoMailBodyPart -isBodyPartKey:inContext:]: commented out method + because we need to handle the part recognition in a different way, + by using the prefix "part" for example. One day we will do that. * UI/Scheduler/NSArray+Scheduler.m ([NSMutableArray -reverseArray]): new category method. +2007-12-17 Francis Lachapelle + + * UI/MailerUI/UIxMailMainFrame.m ([UIxMailMainFrame + -composeAction]): fixed URL when no recipient is specified. + 2007-12-14 Ludovic Marcotte * SoObjects/Appointments/SOGoCalendarComponent.m diff --git a/SOPE/sope-patchset-r1557.diff b/SOPE/sope-patchset-r1557.diff index 85c2064b..126d44d3 100644 --- a/SOPE/sope-patchset-r1557.diff +++ b/SOPE/sope-patchset-r1557.diff @@ -1,47 +1,3 @@ -Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m -=================================================================== ---- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1557) -+++ 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 1557) @@ -153,7 +109,14 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m return address; } -@@ -1627,6 +1650,29 @@ +@@ -1620,13 +1643,35 @@ + return str; + } + +- + static NSString *_parseBodyString(NGImap4ResponseParser *self, + BOOL _convertString) + { return _parseBodyDecodeString(self, _convertString, NO /* no decode */); } @@ -183,7 +146,16 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m static NSDictionary *_parseBodyParameterList(NGImap4ResponseParser *self) { NSMutableDictionary *list; -@@ -1734,10 +1780,11 @@ +@@ -1646,7 +1691,7 @@ + _consumeIfMatch(self, ' '); + value = _parseBodyDecodeString(self, YES, YES); + +- [list setObject:value forKey:[key lowercaseString]]; ++ if (value) [list setObject:value forKey:[key lowercaseString]]; + } + _consumeIfMatch(self, ')'); + } +@@ -1734,10 +1779,11 @@ *encoding, *bodysize; NSDictionary *parameterList; NSMutableDictionary *dict; @@ -196,7 +168,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m _consumeIfMatch(self, ' '); parameterList = _parseBodyParameterList(self); _consumeIfMatch(self, ' '); -@@ -1762,7 +1809,8 @@ +@@ -1762,7 +1808,8 @@ _consumeIfMatch(self, ' '); [dict setObject:_parseBodyString(self, YES) forKey:@"lines"]; } @@ -206,7 +178,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m if (_la(self, 0) != ')') { _consumeIfMatch(self, ' '); _consumeIfMatch(self, '('); -@@ -1805,14 +1853,9 @@ +@@ -1805,14 +1852,9 @@ forKey: @"disposition"]; if (_la(self, 0) != ')') { _consume(self,1); @@ -224,7 +196,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m if (_la(self, 0) != ')') { _consume(self,1); [dict setObject: _parseBodyString(self, YES) -@@ -1829,6 +1872,7 @@ +@@ -1829,6 +1871,7 @@ static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self, BOOL isBodyStructure) { NSMutableArray *parts; @@ -232,7 +204,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m NSString *kind; NSMutableDictionary *dict; -@@ -1854,14 +1898,9 @@ +@@ -1854,14 +1897,9 @@ forKey: @"disposition"]; if (_la(self, 0) != ')') { _consume(self,1); @@ -250,7 +222,7 @@ Index: sope-mime/NGImap4/NGImap4ResponseParser.m if (_la(self, 0) != ')') { _consume(self,1); [dict setObject: _parseBodyString(self, YES) -@@ -2170,6 +2209,21 @@ +@@ -2170,6 +2208,21 @@ } } @@ -1155,6 +1127,50 @@ Index: sope-mime/NGMime/NGMimeContentDispositionHeaderFieldGenerator.m } return data; } +Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m +=================================================================== +--- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m (révision 1557) ++++ 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 1557) @@ -1515,6 +1531,27 @@ Index: sope-appserver/NGObjWeb/WOContext.m if ((serverURL = [rq headerForKey:@"x-webobjects-server-url"]) == nil) { if ((host = [rq headerForKey:@"host"])) serverURL = [@"http://" stringByAppendingString:host]; +Index: sope-appserver/NGObjWeb/DAVPropMap.plist +=================================================================== +--- sope-appserver/NGObjWeb/DAVPropMap.plist (révision 1557) ++++ sope-appserver/NGObjWeb/DAVPropMap.plist (copie de travail) +@@ -123,11 +123,14 @@ + + /* CalDAV */ + "{urn:ietf:params:xml:ns:caldav}calendar-home-set" = davCalendarHomeSet; ++ "{urn:ietf:params:xml:ns:caldav}calendar-user-address-set" = davCalendarUserAddressSet; ++ "{urn:ietf:params:xml:ns:caldav}schedule-inbox-URL" = davCalendarScheduleInboxURL; ++ "{urn:ietf:params:xml:ns:caldav}schedule-outbox-URL" = davCalendarScheduleOutboxURL; + + /* Apple CalServer */ +- "{http://apple.com/ns/calendarserver/}dropbox-home-URL" = ++ "{http://calendarserver.org/ns/}dropbox-home-URL" = + davDropboxHomeURL; +- "{http://apple.com/ns/calendarserver/}notifications-URL" = ++ "{http://calendarserver.org/ns/}notifications-URL" = + davNotificationsURL; + "{com.apple.ical:}calendarcolor" = davCalendarColor; + } Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m =================================================================== --- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m (révision 1557) diff --git a/SoObjects/Mailer/SOGoDraftObject.m b/SoObjects/Mailer/SOGoDraftObject.m index 8a921562..2e210e01 100644 --- a/SoObjects/Mailer/SOGoDraftObject.m +++ b/SoObjects/Mailer/SOGoDraftObject.m @@ -634,6 +634,7 @@ static BOOL showTextAttachmentsInline = NO; { NSDictionary *info, *attachment; SOGoUser *currentUser; + NSString *signature; [sourceMail fetchCoreInfos]; @@ -659,6 +660,9 @@ static BOOL showTextAttachmentsInline = NO; { // TODO: use subject for filename? // error = [newDraft saveAttachment:content withName:@"forward.mail"]; + signature = [currentUser signature]; + if ([signature length]) + [self setText: [NSString stringWithFormat: @"\n-- \n%@", signature]]; attachment = [NSDictionary dictionaryWithObjectsAndKeys: [sourceMail filenameForForward], @"filename", @"message/rfc822", @"mimetype", @@ -666,6 +670,7 @@ static BOOL showTextAttachmentsInline = NO; [self saveAttachment: [sourceMail content] withMetadata: attachment]; } + [self storeInfo]; } diff --git a/SoObjects/Mailer/SOGoMailBodyPart.h b/SoObjects/Mailer/SOGoMailBodyPart.h index 4234074d..76cc84db 100644 --- a/SoObjects/Mailer/SOGoMailBodyPart.h +++ b/SoObjects/Mailer/SOGoMailBodyPart.h @@ -53,6 +53,7 @@ - (NSString *) bodyPartName; - (NSArray *) bodyPartPath; - (NSString *) bodyPartIdentifier; +- (NSString *) filename; /* part info */ diff --git a/SoObjects/Mailer/SOGoMailBodyPart.m b/SoObjects/Mailer/SOGoMailBodyPart.m index 6fac084d..970abbb8 100644 --- a/SoObjects/Mailer/SOGoMailBodyPart.m +++ b/SoObjects/Mailer/SOGoMailBodyPart.m @@ -73,9 +73,9 @@ static BOOL debugOn = NO; - (void) dealloc { - [self->partInfo release]; - [self->identifier release]; - [self->pathToPart release]; + [partInfo release]; + [identifier release]; + [pathToPart release]; [super dealloc]; } @@ -108,8 +108,8 @@ static BOOL debugOn = NO; NSMutableArray *p; id obj; - if (self->pathToPart != nil) - return [self->pathToPart isNotNull] ? self->pathToPart : nil; + if (pathToPart != nil) + return [pathToPart isNotNull] ? pathToPart : nil; p = [[NSMutableArray alloc] initWithCapacity:8]; for (obj = self; [obj isKindOfClass:[SOGoMailBodyPart class]]; @@ -117,18 +117,18 @@ static BOOL debugOn = NO; [p insertObject:[obj bodyPartName] atIndex:0]; } - self->pathToPart = [p copy]; + pathToPart = [p copy]; [p release]; - return self->pathToPart; + return pathToPart; } - (NSString *)bodyPartIdentifier { - if (self->identifier != nil) - return [self->identifier isNotNull] ? self->identifier : nil; + if (identifier != nil) + return [identifier isNotNull] ? identifier : nil; - self->identifier = + identifier = [[[self bodyPartPath] componentsJoinedByString:@"."] copy]; - return self->identifier; + return identifier; } - (NSURL *)imap4URL { @@ -139,12 +139,12 @@ static BOOL debugOn = NO; /* part info */ - (id)partInfo { - if (self->partInfo != nil) - return [self->partInfo isNotNull] ? self->partInfo : nil; + if (partInfo != nil) + return [partInfo isNotNull] ? partInfo : nil; - self->partInfo = + partInfo = [[[self mailObject] lookupInfoForBodyPart:[self bodyPartPath]] retain]; - return self->partInfo; + return partInfo; } /* name lookup */ @@ -160,25 +160,40 @@ static BOOL debugOn = NO; return [clazz objectWithName: _key inContainer: self]; } +- (NSString *) filename +{ + NSString *filename; + NSDictionary *parameters; + + [self partInfo]; + + filename = [[partInfo objectForKey: @"parameterList"] + objectForKey: @"name"]; + if (!filename) + { + parameters = [[partInfo objectForKey: @"disposition"] + objectForKey: @"parameterList"]; + filename = [parameters objectForKey: @"filename"]; + } + + return filename; +} + /* We overwrite the super's class method in order to make sure we aren't dealing with our actual filename as the _key. That could lead to problems if we weren't doing this as our filename could start with a digit, leading to a wrong assumption in the super class */ -- (BOOL)isBodyPartKey:(NSString *)_key inContext:(id)_ctx -{ - NSString *s; - - s = [[[self partInfo] objectForKey: @"parameterList"] objectForKey: @"name"]; +// - (BOOL)isBodyPartKey:(NSString *)_key inContext:(id)_ctx +// { +// NSString *s; - if (!s) - s = [[[[self partInfo] objectForKey: @"disposition"] objectForKey: @"parameterList"] objectForKey: @"filename"]; - - if (s && [s isEqualToString: _key]) return NO; +// s = [self filename]; +// if (s && [s isEqualToString: _key]) return NO; - return [super isBodyPartKey: _key inContext: _ctx]; -} +// return [super isBodyPartKey: _key inContext: _ctx]; +// } - (id) lookupName: (NSString *) _key inContext: (id) _ctx @@ -355,16 +370,13 @@ static BOOL debugOn = NO; [r setHeader: [NSString stringWithFormat:@"%d", [data length]] forKey: @"content-length"]; - if (asAttachment) { - fileName = [[[self partInfo] objectForKey: @"parameterList"] objectForKey: @"name"]; - if (!fileName) - fileName = [[[[self partInfo] objectForKey: @"disposition"] - objectForKey: @"parameterList"] - objectForKey: @"filename"]; - if ([fileName length]) - [r setHeader: [NSString stringWithFormat: @"attachment; filename=%@", fileName] - forKey: @"content-disposition"]; - } + if (asAttachment) + { + fileName = [self filename]; + if ([fileName length]) + [r setHeader: [NSString stringWithFormat: @"attachment; filename=%@", fileName] + forKey: @"content-disposition"]; + } if ((etag = [self davEntityTag]) != nil) [r setHeader:etag forKey:@"etag"]; diff --git a/UI/MailPartViewers/UIxMailPartImageViewer.m b/UI/MailPartViewers/UIxMailPartImageViewer.m index cb9b82e5..bb05b1a2 100644 --- a/UI/MailPartViewers/UIxMailPartImageViewer.m +++ b/UI/MailPartViewers/UIxMailPartImageViewer.m @@ -19,6 +19,8 @@ 02111-1307, USA. */ +#import + #import "UIxMailPartViewer.h" @interface UIxMailPartImageViewer : UIxMailPartViewer @@ -29,26 +31,4 @@ @implementation UIxMailPartImageViewer -/* URLs */ - -- (NSString *) pathToImage -{ - NSMutableString *url; - NSString *s; - - s = [[self clientObject] baseURLInContext: [self context]]; - url = [NSMutableString stringWithString: s]; - if (![url hasSuffix: @"/"]) - [url appendString: @"/"]; - - s = [[self partPath] componentsJoinedByString:@"/"]; - [url appendString: s]; - - s = [self preferredPathExtension]; - if (s) - [url appendFormat: @".%@", s]; - - return url; -} - @end /* UIxMailPartImageViewer */ diff --git a/UI/MailPartViewers/UIxMailPartViewer.h b/UI/MailPartViewers/UIxMailPartViewer.h index 5cd25944..fd042320 100644 --- a/UI/MailPartViewers/UIxMailPartViewer.h +++ b/UI/MailPartViewers/UIxMailPartViewer.h @@ -41,7 +41,11 @@ content. */ -@class NSData, NSArray, NSFormatter; +@class NSArray; +@class NSData; +@class NSFormatter; + +@class SOGoMailBodyPart; @interface UIxMailPartViewer : UIxComponent { @@ -58,6 +62,8 @@ - (void)setBodyInfo:(id)_info; - (id)bodyInfo; +- (SOGoMailBodyPart *) clientPart; + - (NSData *)flatContent; - (NSData *)decodedFlatContent; - (NSString *)flatContentAsString; diff --git a/UI/MailPartViewers/UIxMailPartViewer.m b/UI/MailPartViewers/UIxMailPartViewer.m index f3a44db7..96b9e50a 100644 --- a/UI/MailPartViewers/UIxMailPartViewer.m +++ b/UI/MailPartViewers/UIxMailPartViewer.m @@ -134,29 +134,25 @@ return [self flatContent]; } -- (NSData *) content +- (SOGoMailBodyPart *) clientPart { - NSData *content; - NSEnumerator *parts; id currentObject; NSString *currentPart; - - content = nil; + NSEnumerator *parts; currentObject = [self clientObject]; parts = [partPath objectEnumerator]; - currentPart = [parts nextObject]; - while (currentPart) - { - currentObject = [currentObject lookupName: currentPart - inContext: context - acquire: NO]; - currentPart = [parts nextObject]; - } + while ((currentPart = [parts nextObject])) + currentObject = [currentObject lookupName: currentPart + inContext: context + acquire: NO]; - content = [currentObject fetchBLOB]; + return currentObject; +} - return content; +- (NSData *) content +{ + return [[self clientPart] fetchBLOB]; } - (NSString *) flatContentAsString @@ -323,32 +319,41 @@ return url; } -- (NSString *) pathToAttachment +- (NSString *) _filenameForAttachment: (SOGoMailBodyPart *) bodyPart { - /* this generates a more beautiful 'download' URL for a part */ - NSString *fn; - NSMutableString *url; + NSMutableString *filename; + NSString *extension; + + filename = [NSMutableString stringWithString: [bodyPart filename]]; + if (![filename length]) + [filename appendFormat: @"%@-%@", + [self labelForKey: @"Untitled"], + [bodyPart nameInContainer]]; - fn = [self filename]; - if ([fn length] > 0) + if (![[filename pathExtension] length]) { - /* get basic URL */ - url = [NSMutableString stringWithString: [self pathToAttachmentObject]]; - - /* - If we have an attachment name, we attach it, this is properly handled by - SOGoMailBodyPart. - */ - - if (![url hasSuffix: @"/"]) - [url appendString: @"/"]; - if (isdigit([url characterAtIndex: 0])) - [url appendString: @"fn-"]; - [url appendString: [fn stringByEscapingURL]]; - // TODO: should we check for a proper extension? + extension = [self preferredPathExtension]; + if (extension) + [filename appendFormat: @".%@", extension]; } - else - url = nil; + + return [filename stringByEscapingURL]; +} + +- (NSString *) pathToAttachment +{ + NSMutableString *url; + NSString *s; + SOGoMailBodyPart *bodyPart; + + bodyPart = [self clientPart]; + s = [bodyPart baseURLInContext: [self context]]; + url = [NSMutableString stringWithString: s]; + if (![url hasSuffix: @"/"]) + [url appendString: @"/"]; + +// s = [[self partPath] componentsJoinedByString: @"/"]; + [url appendString: [self _filenameForAttachment: bodyPart]]; return url; } diff --git a/UI/MailerUI/UIxMailEditor.m b/UI/MailerUI/UIxMailEditor.m index c9c41dc2..fd45643c 100644 --- a/UI/MailerUI/UIxMailEditor.m +++ b/UI/MailerUI/UIxMailEditor.m @@ -396,11 +396,11 @@ static NSArray *infoKeys = nil; { NSArray *a; - if (attachmentNames) + if (!attachmentNames) { a = [[self clientObject] fetchAttachmentNames]; - a = [a sortedArrayUsingSelector: @selector (compare:)]; - attachmentNames = [a copy]; + ASSIGN (attachmentNames, + [a sortedArrayUsingSelector: @selector (compare:)]); } return attachmentNames; diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index a44c818f..04e3355d 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -249,6 +249,8 @@ { [newInfo setObject: [currentFolder nameInContainer] forKey: @"c_folder"]; + [newInfo setObject: [currentFolder ownerInContext: context] + forKey: @"c_owner"]; if (![[newInfo objectForKey: @"c_title"] length]) [self _fixComponentTitle: newInfo withType: component]; [infos addObject: [newInfo objectsForKeys: fields @@ -322,10 +324,10 @@ newEvents = [NSMutableArray array]; fields = [NSArray arrayWithObjects: @"c_name", @"c_folder", @"c_status", @"c_title", @"c_startdate", @"c_enddate", @"c_location", - @"c_isallday", @"c_classification", @"c_partmails", @"c_partstates", nil]; + @"c_isallday", @"c_classification", @"c_partmails", @"c_partstates", + @"c_owner", nil]; events = [[self _fetchFields: fields forComponentOfType: @"vevent"] objectEnumerator]; - user = [[self context] activeUser]; oldEvent = [events nextObject]; while (oldEvent) { @@ -351,6 +353,7 @@ participants = [[oldEvent objectAtIndex: 9] componentsSeparatedByString: @"\n"]; states = [[oldEvent objectAtIndex: 10] componentsSeparatedByString: @"\n"]; for (i = 0; i < [participants count]; i++) { + user = [SOGoUser userWithLogin: [oldEvent objectAtIndex: 11] roles: nil]; participant = [participants objectAtIndex: i]; if ([user hasEmail: participant]) { switch ([[states objectAtIndex: i] intValue]) { @@ -372,6 +375,7 @@ if (participants == nil || i == [participants count]) [newEvent replaceObjectAtIndex: 9 withObject: @""]; [newEvent removeObjectAtIndex: 10]; + [newEvent removeObjectAtIndex: 11]; [newEvents addObject: newEvent]; diff --git a/UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox b/UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox index 1590d7a0..57da0493 100644 --- a/UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox +++ b/UI/Templates/MailPartViewers/UIxMailPartImageViewer.wox @@ -3,7 +3,7 @@ xmlns="http://www.w3.org/1999/xhtml" xmlns:var="http://www.skyrix.com/od/binding" - var:src="pathToImage" + var:src="pathToAttachment" var:title="filenameForDisplay" class="mailer_imagecontent" > diff --git a/UI/Templates/MailerUI/UIxMailEditor.wox b/UI/Templates/MailerUI/UIxMailEditor.wox index 4609c7b9..abda2830 100644 --- a/UI/Templates/MailerUI/UIxMailEditor.wox +++ b/UI/Templates/MailerUI/UIxMailEditor.wox @@ -23,15 +23,15 @@
-
- -
    -
  • -
-
+
+ +
    +
  • +
+
: : -
-
+ +