From b3acd2e2add97681606d1ee811282adf38c3bcdc Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Sun, 1 Jul 2012 20:58:46 +0000 Subject: [PATCH] Monotone-Parent: 0ad1e10fb7587b8444bd502de4908d1aabf70c96 Monotone-Revision: a6b977673a1cc94b1269e19c469101dca9fd17bc Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2012-07-01T20:58:46 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 8 ++ ...Native Microsoft Outlook Configuration.odt | Bin 27917 -> 27917 bytes OpenChange/MAPIStoreAppointmentWrapper.m | 86 ++++++++---------- OpenChange/MAPIStoreRecurrenceUtils.h | 11 ++- OpenChange/MAPIStoreRecurrenceUtils.m | 48 ++++++++-- 5 files changed, 98 insertions(+), 55 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0787be8c6..43598829b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2012-07-01 Wolfgang Sourdeau + * OpenChange/MAPIStoreRecurrenceUtils.m + (-setupRecurrenceWithMasterEntity:fromRecurrencePattern:): add + exception dates to master entity based on the + "DeletedInstanceDates" member of the struct. + (-fillRecurrencePattern:withEvent:inTimeZone:inMemCtx:): new name + for fillRecurrencePattern:withStartDate:andEndDate:, add exception + dates to struct. + * OpenChange/NSDate+MAPIStore.m (NSDateCompare): new comparison function for sorting array of NSDate instances. diff --git a/Documentation/SOGo Native Microsoft Outlook Configuration.odt b/Documentation/SOGo Native Microsoft Outlook Configuration.odt index a350de392a22f7c89e179aeacef624755b9329af..3761cc8329c4bc0bb68370d8af7f6d7cb5d83a0a 100644 GIT binary patch delta 19554 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 delta 19545 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 diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index 7862980aa..d306e3c8f 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -28,11 +28,8 @@ #import #import #import -#import #import #import -#import -#import #import #import #import @@ -580,7 +577,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagMessageClass: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { const char *className; @@ -633,7 +630,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagStartDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; @@ -827,7 +824,7 @@ static NSCharacterSet *hexCharacterSet = nil; /* sender (organizer) */ - (int) getPidTagSenderEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddress: data forICalPerson: [event organizer] @@ -835,7 +832,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagSenderAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getAddrType: data forICalPerson: [event organizer] @@ -843,7 +840,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagSenderName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getName: data forICalPerson: [event organizer] @@ -851,7 +848,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagSenderEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryId: data forICalPerson: [event organizer] @@ -860,7 +857,7 @@ static NSCharacterSet *hexCharacterSet = nil; /* attendee */ - (int) getPidTagReceivedByEmailAddress: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEmailAddress: data forICalPerson: [event userAsAttendee: user] @@ -868,7 +865,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagReceivedByAddressType: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getAddrType: data forICalPerson: [event userAsAttendee: user] @@ -876,7 +873,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagReceivedByName: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getName: data forICalPerson: [event userAsAttendee: user] @@ -884,7 +881,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagReceivedByEntryId: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { return [self _getEntryId: data forICalPerson: [event userAsAttendee: user] @@ -893,7 +890,7 @@ static NSCharacterSet *hexCharacterSet = nil; /* /attendee */ - (int) getPidTagEndDate: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { NSCalendarDate *dateValue; NSInteger offset; @@ -995,7 +992,8 @@ static NSCharacterSet *hexCharacterSet = nil; return [self getPidLidLocation: data inMemCtx: memCtx]; } -- (int) getPidLidServerProcessed: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidLidServerProcessed: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { /* TODO: we need to check whether the event has been processed internally by SOGo or if it was received only by mail. We only assume the SOGo case @@ -1003,7 +1001,8 @@ static NSCharacterSet *hexCharacterSet = nil; return [self getYes: data inMemCtx: memCtx]; } -- (int) getPidLidServerProcessingActions: (void **) data inMemCtx: (TALLOC_CTX *) memCtx +- (int) getPidLidServerProcessingActions: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx { *data = MAPILongValue (memCtx, 0x00000010 /* cpsCreatedOnPrincipal */ @@ -1020,14 +1019,14 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagSensitivity: (void **) data // not implemented, depends on CLASS - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { // normal = 0, personal?? = 1, private = 2, confidential = 3 return [self getLongZero: data inMemCtx: memCtx]; } - (int) getPidTagImportance: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { uint32_t v; if ([[event priority] isEqualToString: @"9"]) @@ -1043,7 +1042,7 @@ static NSCharacterSet *hexCharacterSet = nil; } - (int) getPidTagBody: (void **) data - inMemCtx: (TALLOC_CTX *) memCtx + inMemCtx: (TALLOC_CTX *) memCtx { int rc = MAPISTORE_SUCCESS; NSString *stringValue; @@ -1074,29 +1073,6 @@ static NSCharacterSet *hexCharacterSet = nil; return MAPISTORE_SUCCESS; } -static void -_fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, - NSCalendarDate *startDate, NSTimeInterval duration, - NSCalendarDate * endDate, iCalRecurrenceRule *rule) -{ - uint32_t startMinutes; - - [rule fillRecurrencePattern: &arp->RecurrencePattern - withStartDate: startDate andEndDate: endDate]; - arp->ReaderVersion2 = 0x00003006; - arp->WriterVersion2 = 0x00003009; - - startMinutes = ([startDate hourOfDay] * 60 + [startDate minuteOfHour]); - arp->StartTimeOffset = startMinutes; - arp->EndTimeOffset = startMinutes + (uint32_t) (duration / 60); - - arp->ExceptionCount = 0; - arp->ReservedBlock1Size = 0; - - /* Currently ignored in property.idl: - arp->ReservedBlock2Size = 0; */ -} - - (struct SBinary_short *) _computeAppointmentRecurInMemCtx: (TALLOC_CTX *) memCtx { @@ -1105,6 +1081,7 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, struct SBinary_short *sBin; NSCalendarDate *firstStartDate; iCalRecurrenceRule *rule; + NSUInteger startMinutes; rule = [[event recurrenceRules] objectAtIndex: 0]; @@ -1114,10 +1091,27 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, [firstStartDate setTimeZone: timeZone]; arp = talloc_zero (memCtx, struct AppointmentRecurrencePattern); - _fillAppointmentRecurrencePattern (arp, firstStartDate, - [event durationAsTimeInterval], - [event lastPossibleRecurrenceStartDate], - rule); + [rule fillRecurrencePattern: &arp->RecurrencePattern + withEvent: event + inTimeZone: timeZone + inMemCtx: arp]; + arp->ReaderVersion2 = 0x00003006; + arp->WriterVersion2 = 0x00003009; + + startMinutes = ([firstStartDate hourOfDay] * 60 + + [firstStartDate minuteOfHour]); + arp->StartTimeOffset = startMinutes; + arp->EndTimeOffset = (startMinutes + + (NSUInteger) ([event durationAsTimeInterval] + / 60)); + + arp->ExceptionCount = 0; + arp->ReservedBlock1Size = 0; + + /* Currently ignored in property.idl: arp->ReservedBlock2Size = 0; */ + + + /* convert struct to blob */ sBin = talloc_zero (memCtx, struct SBinary_short); bin = set_AppointmentRecurrencePattern (sBin, arp); sBin->cb = bin->cb; diff --git a/OpenChange/MAPIStoreRecurrenceUtils.h b/OpenChange/MAPIStoreRecurrenceUtils.h index 4fdf8c54e..a72a23af8 100644 --- a/OpenChange/MAPIStoreRecurrenceUtils.h +++ b/OpenChange/MAPIStoreRecurrenceUtils.h @@ -23,10 +23,14 @@ #ifndef MAPISTORERECURRENCEUTILS_H #define MAPISTORERECURRENCEUTILS_H +#include + #import #import -@class NSCalendarDate; +@class NSTimeZone; + +@class iCalEvent; @class iCalRepeatableEntityObject; @class iCalRecurrenceRule; @@ -44,8 +48,9 @@ @interface iCalRecurrenceRule (MAPIStoreRecurrence) - (void) fillRecurrencePattern: (struct RecurrencePattern *) rp - withStartDate: (NSCalendarDate *) startDate - andEndDate: (NSCalendarDate *) endDate; + withEvent: (iCalEvent *) event + inTimeZone: (NSTimeZone *) timeZone + inMemCtx: (TALLOC_CTX *) memCtx; @end diff --git a/OpenChange/MAPIStoreRecurrenceUtils.m b/OpenChange/MAPIStoreRecurrenceUtils.m index 09d6ce793..00ddf437a 100644 --- a/OpenChange/MAPIStoreRecurrenceUtils.m +++ b/OpenChange/MAPIStoreRecurrenceUtils.m @@ -21,17 +21,22 @@ */ #import +#import #import #import #import +#import +#import +#import #import #import -#import +#import #import "NSDate+MAPIStore.h" #import "MAPIStoreRecurrenceUtils.h" +#import "MAPIStoreTypes.h" #include #include @@ -43,7 +48,7 @@ - (void) setupRecurrenceWithMasterEntity: (iCalRepeatableEntityObject *) entity fromRecurrencePattern: (struct RecurrencePattern *) rp { - NSCalendarDate *startDate, *olEndDate, *untilDate; + NSCalendarDate *startDate, *olEndDate, *untilDate, *exDate; NSString *monthDay, *month; iCalRecurrenceRule *rule; iCalByDayMask *byDayMask; @@ -203,6 +208,17 @@ [self errorWithFormat: @"invalid value for EndType: %.4x", rp->EndType]; } + + /* exception dates */ + for (count = 0; count < rp->DeletedInstanceCount; count++) + { + exDate + = [NSDate dateFromMinutesSince1601: rp->DeletedInstanceDates[count]]; + exDate = [exDate hour: [startDate hourOfDay] + minute: [startDate minuteOfHour] + second: [startDate secondOfMinute]]; + [entity addToExceptionDates: exDate]; + } } @end @@ -210,17 +226,24 @@ @implementation iCalRecurrenceRule (MAPIStoreRecurrence) - (void) fillRecurrencePattern: (struct RecurrencePattern *) rp - withStartDate: (NSCalendarDate *) startDate - andEndDate: (NSCalendarDate *) endDate + withEvent: (iCalEvent *) event + inTimeZone: (NSTimeZone *) timeZone + inMemCtx: (TALLOC_CTX *) memCtx { iCalRecurrenceFrequency freq; iCalByDayMask *byDayMask; NSString *byMonthDay, *bySetPos; - NSCalendarDate *untilDate, *beginOfWeek, *minimumDate, *moduloDate, *midnight; + NSCalendarDate *startDate, *endDate, *untilDate, *beginOfWeek, *minimumDate, *moduloDate, *midnight; iCalWeekOccurrences *days; - NSInteger dayOfWeek, repeatInterval, repeatCount, count, firstOccurrence; + NSInteger dayOfWeek, repeatInterval, repeatCount, count, firstOccurrence, max; uint32_t nbrMonths, mask; + NSArray *exDates; + startDate = [event firstRecurrenceStartDate]; + [startDate setTimeZone: timeZone]; + endDate = [event lastPossibleRecurrenceStartDate]; + [endDate setTimeZone: timeZone]; + rp->ReaderVersion = 0x3004; rp->WriterVersion = 0x3004; @@ -370,6 +393,19 @@ [self errorWithFormat: @"rule for an event that never occurs"]; } } + + + exDates = [[event exceptionDatesWithTimeZone: utcTZ] + sortedArrayUsingFunction: NSDateCompare + context: NULL]; + max = [exDates count]; + rp->DeletedInstanceCount = max; + rp->DeletedInstanceDates = talloc_array (memCtx, uint32_t, max); + for (count = 0; count < max; count++) + { + startDate = [[exDates objectAtIndex: count] hour: 0 minute: 0 second: 0]; + *(rp->DeletedInstanceDates + count) = [startDate asMinutesSince1601]; + } } @end