From 9f74010f9947ba92a347c26b9b9f7d746a72478b Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 13:42:40 +0000 Subject: [PATCH 1/8] Monotone-Parent: 618681307a4cbc2f326ac0bdd3eb6077cb9a22f4 Monotone-Revision: 4adb09f9c02af62ea07b317c5c6a14100b8204e1 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T13:42:40 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 ++++++ OpenChange/MAPIStoreTypes.h | 2 +- OpenChange/MAPIStoreTypes.m | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index c51b99e2d..8f9d93bb1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-03-20 Wolfgang Sourdeau + + * OpenChange/MAPIStoreTypes.m (MAPIChangeKeyGUIDCompare): NSData + arguments passed as "id" due to the pickiness of some versions of + gcc. + 2012-03-19 Wolfgang Sourdeau * Main/SOGo+DAV.m (_fillCollections:where:matches:inContext:): diff --git a/OpenChange/MAPIStoreTypes.h b/OpenChange/MAPIStoreTypes.h index 1fec6a6a7..286c0b298 100644 --- a/OpenChange/MAPIStoreTypes.h +++ b/OpenChange/MAPIStoreTypes.h @@ -43,7 +43,7 @@ id NSObjectFromMAPISPropValue (const struct mapi_SPropValue *); id NSObjectFromValuePointer (enum MAPITAGS, const void *); NSComparisonResult MAPICNCompare (uint64_t cn1, uint64_t cn2, void *); -NSComparisonResult MAPIChangeKeyGUIDCompare (NSData *ck1, NSData *ck2, void *); +NSComparisonResult MAPIChangeKeyGUIDCompare (id ck1, id ck2, void *); static inline NSNumber * MAPIPropertyKey (enum MAPITAGS propTag) diff --git a/OpenChange/MAPIStoreTypes.m b/OpenChange/MAPIStoreTypes.m index c294dd429..bcef90ae1 100644 --- a/OpenChange/MAPIStoreTypes.m +++ b/OpenChange/MAPIStoreTypes.m @@ -298,7 +298,8 @@ MAPICNCompare (uint64_t cn1, uint64_t cn2, void *unused) return result; } -NSComparisonResult MAPIChangeKeyGUIDCompare (NSData *ck1, NSData *ck2, void *unused) +NSComparisonResult +MAPIChangeKeyGUIDCompare (id ck1, id ck2, void *unused) { NSUInteger count; const unsigned char *ptr1, *ptr2; From 73ad59a633b3d6c0cfd800b69e453ea987b87dd6 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 18:46:05 +0000 Subject: [PATCH 2/8] Monotone-Parent: 4adb09f9c02af62ea07b317c5c6a14100b8204e1 Monotone-Revision: cbe26077e3038a934e225a1903e28b89cf90c61d Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T18:46:05 Monotone-Branch: ca.inverse.sogo --- OpenChange/NSObject+MAPIStore.m | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/OpenChange/NSObject+MAPIStore.m b/OpenChange/NSObject+MAPIStore.m index 198e1969a..7fc75a74d 100644 --- a/OpenChange/NSObject+MAPIStore.m +++ b/OpenChange/NSObject+MAPIStore.m @@ -38,14 +38,15 @@ @implementation NSObject (MAPIStoreTallocHelpers) -static int MAPIStoreTallocWrapperDestroy (void *data) +static int +MAPIStoreTallocWrapperDestroy (void *data) { struct MAPIStoreTallocWrapper *wrapper; NSAutoreleasePool *pool; pool = [NSAutoreleasePool new]; wrapper = data; - NSLog (@"destroying wrapped object (wrapper: %p; object: %p)...\n", wrapper, wrapper->MAPIStoreSOGoObject); + // NSLog (@"destroying wrapped object (wrapper: %p; object: %p)...\n", wrapper, wrapper->MAPIStoreSOGoObject); [wrapper->MAPIStoreSOGoObject release]; [pool release]; @@ -57,10 +58,10 @@ static int MAPIStoreTallocWrapperDestroy (void *data) struct MAPIStoreTallocWrapper *wrapper; wrapper = talloc_zero (tallocCtx, struct MAPIStoreTallocWrapper); - wrapper->MAPIStoreSOGoObject = self; - [wrapper->MAPIStoreSOGoObject retain]; talloc_set_destructor ((void *) wrapper, MAPIStoreTallocWrapperDestroy); - NSLog (@"returning wrapper: %p; object: %p", wrapper, self); + wrapper->MAPIStoreSOGoObject = self; + [self retain]; + // NSLog (@"returning wrapper: %p; object: %p", wrapper, self); return wrapper; } From 4d60fa4dc31186fff961c0a2e9c0eb01ac4226c8 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 18:47:05 +0000 Subject: [PATCH 3/8] Monotone-Parent: cbe26077e3038a934e225a1903e28b89cf90c61d Monotone-Revision: cbef49b9665bb4860d576825ae411fd212ee0d08 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T18:47:05 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 +++ OpenChange/NSDate+MAPIStore.h | 2 ++ OpenChange/NSDate+MAPIStore.m | 13 +++++++++++++ 3 files changed, 18 insertions(+) diff --git a/ChangeLog b/ChangeLog index 8f9d93bb1..6e915207a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2012-03-20 Wolfgang Sourdeau + * OpenChange/NSDate+MAPIStore.m (-isNever): new accessor for dates + occurring in 4500. + * OpenChange/MAPIStoreTypes.m (MAPIChangeKeyGUIDCompare): NSData arguments passed as "id" due to the pickiness of some versions of gcc. diff --git a/OpenChange/NSDate+MAPIStore.h b/OpenChange/NSDate+MAPIStore.h index a36fb5e16..3c7809f79 100644 --- a/OpenChange/NSDate+MAPIStore.h +++ b/OpenChange/NSDate+MAPIStore.h @@ -33,6 +33,8 @@ + (id) dateFromFileTime: (const struct FILETIME *) timeValue; - (struct FILETIME *) asFileTimeInMemCtx: (void *) memCtx; +- (BOOL) isNever; /* occurs on 4500-12-31 */ + @end #endif /* NSCALENDARDATE+MAPISTORE_H */ diff --git a/OpenChange/NSDate+MAPIStore.m b/OpenChange/NSDate+MAPIStore.m index d36ff6729..1c09fd0a2 100644 --- a/OpenChange/NSDate+MAPIStore.m +++ b/OpenChange/NSDate+MAPIStore.m @@ -114,4 +114,17 @@ _setupRefDate () return timeValue; } +- (BOOL) isNever /* occurs on 4500-12-31 */ +{ + NSCalendarDate *calDate; + + if ([self isKindOfClass: [NSCalendarDate class]]) + calDate = (NSCalendarDate *) self; + else + calDate = [NSCalendarDate dateWithTimeIntervalSince1970: + [self timeIntervalSince1970]]; + + return [calDate yearOfCommonEra] == 4500; +} + @end From 96c6581dfe71cecd530db5584b43775057fb098c Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 18:50:09 +0000 Subject: [PATCH 4/8] Monotone-Parent: cbef49b9665bb4860d576825ae411fd212ee0d08 Monotone-Revision: c80a840b806ab1a13914a35d5bde6a6668427240 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T18:50:09 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 6 ++++++ OpenChange/MAPIStoreAppointmentWrapper.h | 2 ++ OpenChange/MAPIStoreAppointmentWrapper.m | 8 ++++++++ OpenChange/MAPIStoreCalendarMessage.m | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/ChangeLog b/ChangeLog index 6e915207a..c3fa5ac93 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2012-03-20 Wolfgang Sourdeau + * OpenChange/MAPIStoreCalendarMessage.m + (-getPidLidAppointmentSequence:inMemCtx:): new getter. + + * OpenChange/MAPIStoreAppointmentWrapper.m + (-getPidLidAppointmentSequence:inMemCtx:): new getter. + * OpenChange/NSDate+MAPIStore.m (-isNever): new accessor for dates occurring in 4500. diff --git a/OpenChange/MAPIStoreAppointmentWrapper.h b/OpenChange/MAPIStoreAppointmentWrapper.h index 7f68e82e0..efb5ac2a1 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.h +++ b/OpenChange/MAPIStoreAppointmentWrapper.h @@ -97,6 +97,8 @@ extern NSTimeZone *utcTZ; inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidTagStartDate: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidAppointmentSequence: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidAppointmentStateFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; - (int) getPidLidResponseStatus: (void **) data diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 808acfe2b..76d5a0a30 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -657,6 +657,14 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } +- (int) getPidLidAppointmentSequence: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + *data = MAPILongValue (memCtx, [[event sequence] unsignedIntValue]); + + return MAPISTORE_SUCCESS; +} + - (int) getPidLidAppointmentStateFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 150838384..15ccb6437 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -166,6 +166,13 @@ return [[self appointmentWrapper] getPidTagStartDate: data inMemCtx: memCtx]; } +- (int) getPidLidAppointmentSequence: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidAppointmentSequence: data + inMemCtx: memCtx]; +} + - (int) getPidLidAppointmentStateFlags: (void **) data inMemCtx: (TALLOC_CTX *) memCtx { From 3a315446b092106d06cca4c04702da4d0f8a90f7 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 18:56:44 +0000 Subject: [PATCH 5/8] Monotone-Parent: c80a840b806ab1a13914a35d5bde6a6668427240 Monotone-Revision: 0917b3278898caa0cb56a12a960275816f5ab396 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T18:56:44 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 2 ++ OpenChange/MAPIStoreCalendarMessage.m | 28 ++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index c3fa5ac93..92f50891c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ * OpenChange/MAPIStoreCalendarMessage.m (-getPidLidAppointmentSequence:inMemCtx:): new getter. + (-save): properly initialize CREATED, LAST-MODIFIED, DTSTAMP and + SEQUENCE from MAPI properties. * OpenChange/MAPIStoreAppointmentWrapper.m (-getPidLidAppointmentSequence:inMemCtx:): new getter. diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 15ccb6437..004a30afc 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -725,14 +725,28 @@ vCalendar = [newEvent parent]; [vCalendar setProdID: @"-//Inverse inc.//OpenChange+SOGo//EN"]; [newEvent setCreated: now]; + // CREATED = PidTagCreationTime + value = [properties objectForKey: MAPIPropertyKey (PidTagCreationTime)]; + if (value) + [newEvent setCreated: value]; [newEvent setUid: uid]; content = [vCalendar versitString]; } vCalendar = [iCalCalendar parseSingleFromSource: content]; newEvent = [[vCalendar events] objectAtIndex: 0]; - [newEvent setTimeStampAsDate: now]; - [newEvent setLastModified: now]; + + // DTSTAMP = PidLidOwnerCriticalChange or PidLidAttendeeCriticalChange + value = [properties objectForKey: MAPIPropertyKey (PidLidOwnerCriticalChange)]; + if (!value || [value isNever]) + value = now; + [newEvent setTimeStampAsDate: value]; + + // LAST-MODIFIED = PidTagLastModificationTime + value = [properties objectForKey: MAPIPropertyKey (PidTagLastModificationTime)]; + if (!value) + value = now; + [newEvent setLastModified: value]; // summary value = [properties @@ -980,6 +994,11 @@ [newEvent setOrganizer: nil]; else { + // SEQUENCE = PidLidAppointmentSequence + value = [properties objectForKey: MAPIPropertyKey (PidLidAppointmentSequence)]; + if (value) + [newEvent setSequence: value]; + ownerUser = [[self userContext] sogoUser]; if (organizerIsSet) { @@ -1016,7 +1035,10 @@ } [person setParticipationStatus: newPartStat]; newParticipationStatus = [person partStatWithDefault]; - + + value = [properties objectForKey: MAPIPropertyKey (PidLidAttendeeCriticalChange)]; + if (value && ![value isNever]) + [newEvent setTimeStampAsDate: value]; // if (newPartStat // != iCalPersonPartStatUndefined // ) // { From 81fb0f41e7488020e3ee5e15a2e4bee52f047c33 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 20:30:51 +0000 Subject: [PATCH 6/8] Monotone-Parent: 73343e195be838a68cfbeb8edc978d8273b1e6da Monotone-Revision: 769d14eff848857403688bfa5bdf37f12459a7f1 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T20:30:51 Monotone-Branch: ca.inverse.sogo --- Version | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Version b/Version index edc60fbcd..09503ebca 100644 --- a/Version +++ b/Version @@ -2,6 +2,6 @@ # This file is included by library makefiles to set the version information # of the executable. -MAJOR_VERSION=1 -MINOR_VERSION=3 -SUBMINOR_VERSION=14 +MAJOR_VERSION=2 +MINOR_VERSION=0 +SUBMINOR_VERSION=0 From 4d1900e52222a5515f37a9673315964960365343 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 20:31:36 +0000 Subject: [PATCH 7/8] Monotone-Parent: 769d14eff848857403688bfa5bdf37f12459a7f1 Monotone-Revision: edf1f1831a73df9eb13881bab5ebdbcfa7c40a23 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T20:31:36 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 +++ OpenChange/MAPIStoreAppointmentWrapper.m | 1 + 2 files changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index c303dd634..0159c67c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,9 @@ 2012-03-20 Wolfgang Sourdeau + * OpenChange/MAPIStoreAppointmentWrapper.m (-_setupITIPContext): + ensure method is uppercase. + * OpenChange/MAPIStoreCalendarMessage.m (-getPidLidAppointmentSequence:inMemCtx:): new getter. (-save): properly initialize CREATED, LAST-MODIFIED, DTSTAMP and diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 76d5a0a30..b3eb8df02 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -162,6 +162,7 @@ static NSCharacterSet *hexCharacterSet = nil; method = [[event parent] method]; if ([method length] > 0) { + method = [method uppercaseString]; [method retain]; if ([method isEqualToString: @"REPLY"]) { From 107728db4b7227985cbc712c140b2a1e870bb121 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 20 Mar 2012 21:07:16 +0000 Subject: [PATCH 8/8] Monotone-Parent: edf1f1831a73df9eb13881bab5ebdbcfa7c40a23 Monotone-Revision: d93bbab8d949fa50be1d182af68b2eecf4c79105 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-03-20T21:07:16 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 3 +++ SoObjects/SOGo/SOGoUserFolder.m | 48 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/ChangeLog b/ChangeLog index 0159c67c8..3a628972f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,9 @@ 2012-03-20 Wolfgang Sourdeau + * SoObjects/SOGo/SOGoUserFolder.m (-davLastName, -davFirstName): + quick and dirty implementation of those getters. + * OpenChange/MAPIStoreAppointmentWrapper.m (-_setupITIPContext): ensure method is uppercase. diff --git a/SoObjects/SOGo/SOGoUserFolder.m b/SoObjects/SOGo/SOGoUserFolder.m index 862525153..c450dc0cf 100644 --- a/SoObjects/SOGo/SOGoUserFolder.m +++ b/SoObjects/SOGo/SOGoUserFolder.m @@ -635,6 +635,54 @@ getCNForUID: nameInContainer]; } +/* For firstname and lastname, we handle "Firstname Blabla Lastname" and + "Lastname, Firstname Blabla" */ +- (NSString *) davLastName +{ + NSArray *parts; + NSString *cn, *lastName; + NSRange comma; + + cn = [self davDisplayName]; + comma = [cn rangeOfString: @","]; + if (comma.location != NSNotFound) + lastName = [[cn substringToIndex: comma.location] + stringByTrimmingSpaces]; + else + { + parts = [cn componentsSeparatedByString: @" "]; + if ([parts count] > 0) + lastName = [parts lastObject]; + else + lastName = nil; + } + + return lastName; +} + +- (NSString *) davFirstName +{ + NSArray *parts; + NSString *subtext, *cn, *firstName; + NSRange comma; + + cn = [self davDisplayName]; + comma = [cn rangeOfString: @","]; + if (comma.location != NSNotFound) + subtext = [[cn substringFromIndex: comma.location] + stringByTrimmingSpaces]; + else + subtext = cn; + + parts = [subtext componentsSeparatedByString: @" "]; + if ([parts count] > 0) + firstName = [parts objectAtIndex: 0]; + else + firstName = nil; + + return firstName; +} + - (NSString *) davResourceId { return [NSString stringWithFormat: @"urn:uuid:%@", nameInContainer];