From f15be9f23b41550b200351a43cd3bd3521825a70 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 11 Oct 2011 19:35:41 +0000 Subject: [PATCH 1/2] Monotone-Parent: 4aa646b0faf339f31cde63a356f16e3c5e98e28a Monotone-Revision: ec16bdb7ba63858784457e5200d914d15be4c55e Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-10-11T19:35:41 Monotone-Branch: ca.inverse.sogo --- UI/Scheduler/French.lproj/Localizable.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/Scheduler/French.lproj/Localizable.strings b/UI/Scheduler/French.lproj/Localizable.strings index ab0a944e0..16dc38f90 100644 --- a/UI/Scheduler/French.lproj/Localizable.strings +++ b/UI/Scheduler/French.lproj/Localizable.strings @@ -402,7 +402,7 @@ "reminder_DAYS" = "jours"; "reminder_BEFORE" = "avant"; "reminder_AFTER" = "après"; -"reminder_START" = "le début de 'événement"; +"reminder_START" = "le début de l'événement"; "reminder_END" = "la fin de l'événement"; "Reminder Details" = "Détails du rappel"; From 8c929bc16bc45c58d63010a1b232c9dd818d4a75 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 11 Oct 2011 19:46:02 +0000 Subject: [PATCH 2/2] Monotone-Parent: ec16bdb7ba63858784457e5200d914d15be4c55e Monotone-Revision: bae3f2d15f56ace2300155adab60e9293a29ea32 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-10-11T19:46:02 Monotone-Branch: ca.inverse.sogo --- ChangeLog | 26 +++- OpenChange/MAPIStoreAppointmentWrapper.h | 21 +++ OpenChange/MAPIStoreAppointmentWrapper.m | 158 ++++++++++++++++++++++- OpenChange/MAPIStoreCalendarMessage.m | 104 +++++++++++++++ 4 files changed, 307 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index df4e3f35d..495016dd5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,28 @@ -2011-10-09 Wolfgang Sourdeau +2011-10-11 Wolfgang Sourdeau + + * OpenChange/MAPIStoreAppointmentWrapper.m + (-getPidLidReminderSet:inMemCtx:) + (-getPidLidReminderDelta:inMemCtx:) + (-getPidLidReminderTime:inMemCtx:) + (-getPidLidReminderSignalTime:inMemCtx:) + (-getPidLidReminderOverride:inMemCtx:) + (-getPidLidReminderType:inMemCtx:) + (-getPidLidReminderPlaySound:inMemCtx:) + (-getPidLidReminderFileParameter:inMemCtx:): implemented those + alarm-related getters (see OXORMDR). + + * OpenChange/MAPIStoreCalendarMessage.m (_setupAlarmDataInEvent:): + new method invoked from -save that sets VALARM elements on the + current event based on the PidLidReminder* properties. + (-getPidLidReminderSet:inMemCtx:) + (-getPidLidReminderDelta:inMemCtx:) + (-getPidLidReminderTime:inMemCtx:) + (-getPidLidReminderSignalTime:inMemCtx:) + (-getPidLidReminderOverride:inMemCtx:) + (-getPidLidReminderType:inMemCtx:) + (-getPidLidReminderPlaySound:inMemCtx:) + (-getPidLidReminderFileParameter:inMemCtx:): new alarm-related + forwarders to homonymous methods in MAPIStoreAppointmentWrapper. * OpenChange/MAPIStoreMailFolder.m (-synchroniseCache): improved method to only fetch non-deleted messages in part 1, and to diff --git a/OpenChange/MAPIStoreAppointmentWrapper.h b/OpenChange/MAPIStoreAppointmentWrapper.h index b2be82db4..aecf91e40 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.h +++ b/OpenChange/MAPIStoreAppointmentWrapper.h @@ -29,6 +29,7 @@ @class NSTimeZone; +@class iCalAlarm; @class iCalCalendar; @class iCalEvent; @@ -44,6 +45,8 @@ extern NSTimeZone *utcTZ; NSData *globalObjectId; NSData *cleanGlobalObjectId; SOGoUser *user; + BOOL alarmSet; + iCalAlarm *alarm; } + (id) wrapperWithICalEvent: (iCalEvent *) newEvent @@ -137,6 +140,24 @@ extern NSTimeZone *utcTZ; - (int) getPidLidAppointmentReplyTime: (void **) data inMemCtx: (TALLOC_CTX *) memCtx; +/* reminders */ +- (int) getPidLidReminderSet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidReminderDelta: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidReminderTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidReminderSignalTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidReminderOverride: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidReminderType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidReminderPlaySound: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; +- (int) getPidLidReminderFileParameter: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx; + @end #endif /* MAPISTORECALENDARWRAPPER_H */ diff --git a/OpenChange/MAPIStoreAppointmentWrapper.m b/OpenChange/MAPIStoreAppointmentWrapper.m index c05dab7ac..e67229e6e 100644 --- a/OpenChange/MAPIStoreAppointmentWrapper.m +++ b/OpenChange/MAPIStoreAppointmentWrapper.m @@ -27,11 +27,14 @@ #import #import #import +#import #import #import +#import #import #import -#import +#import +#import #import #import "MAPIStoreMessage.h" @@ -96,6 +99,8 @@ static NSCharacterSet *hexCharacterSet = nil; globalObjectId = nil; cleanGlobalObjectId = nil; user = nil; + alarmSet = NO; + alarm = nil; } return self; @@ -124,6 +129,7 @@ static NSCharacterSet *hexCharacterSet = nil; [globalObjectId release]; [cleanGlobalObjectId release]; [user release]; + [alarm release]; [super dealloc]; } @@ -1176,4 +1182,154 @@ _fillAppointmentRecurrencePattern (struct AppointmentRecurrencePattern *arp, return rc; } +/* reminders */ +- (void) _setupAlarm +{ + NSArray *alarms; + NSUInteger count, max; + iCalAlarm *currentAlarm; + NSString *action; + + alarms = [event alarms]; + max = [alarms count]; + for (count = 0; !alarm && count < max; count++) + { + currentAlarm = [alarms objectAtIndex: count]; + action = [[currentAlarm action] lowercaseString]; + if (!action || [action isEqualToString: @"display"]) + ASSIGN (alarm, currentAlarm); + } + + alarmSet = YES; +} + +- (int) getPidLidReminderSet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + if (!alarmSet) + [self _setupAlarm]; + + *data = MAPIBoolValue (memCtx, (alarm != nil)); + + return MAPISTORE_SUCCESS; +} + +- (int) getPidLidReminderTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + if (!alarmSet) + [self _setupAlarm]; + + return (alarm + ? [self getPrStartDate: data inMemCtx: memCtx] + : MAPISTORE_ERR_NOT_FOUND); +} + +- (int) getPidLidReminderDelta: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + int rc = MAPISTORE_ERR_NOT_FOUND; + iCalTrigger *trigger; + NSCalendarDate *startDate, *relationDate, *alarmDate; + NSTimeInterval interval; + NSString *relation; + + if (!alarmSet) + [self _setupAlarm]; + + if (alarm) + { + trigger = [alarm trigger]; + if ([[trigger valueType] caseInsensitiveCompare: @"DURATION"] == NSOrderedSame) + { + startDate = [event startDate]; + relation = [[trigger relationType] lowercaseString]; + interval = [[trigger value] durationAsTimeInterval]; + if ([relation isEqualToString: @"end"]) + relationDate = [event endDate]; + else + relationDate = startDate; + + // Compute the next alarm date with respect to the reference date + if (relationDate) + { + alarmDate = [relationDate addTimeInterval: interval]; + interval = [startDate timeIntervalSinceDate: alarmDate]; + *data = MAPILongValue (memCtx, (int) (interval / 60)); + rc = MAPISTORE_SUCCESS; + } + } + } + + return rc; +} + +- (int) getPidLidReminderSignalTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + int rc = MAPISTORE_SUCCESS; + NSCalendarDate *alarmDate; + + if (!alarmSet) + [self _setupAlarm]; + + if (alarm) + { + alarmDate = [alarm nextAlarmDate]; + [alarmDate setTimeZone: utcTZ]; + *data = [alarmDate asFileTimeInMemCtx: memCtx]; + } + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; +} + +- (int) getPidLidReminderOverride: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + int rc = MAPISTORE_SUCCESS; + + if (!alarmSet) + [self _setupAlarm]; + + if (alarm) + *data = MAPIBoolValue (memCtx, YES); + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; +} + +- (int) getPidLidReminderPlaySound: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + int rc = MAPISTORE_SUCCESS; + + if (!alarmSet) + [self _setupAlarm]; + + if (alarm) + *data = MAPIBoolValue (memCtx, YES); + else + rc = MAPISTORE_ERR_NOT_FOUND; + + return rc; +} + +- (int) getPidLidReminderFileParameter: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + // if (!alarmSet) + // [self _setupAlarm]; + + return MAPISTORE_ERR_NOT_FOUND; +} + +- (int) getPidLidReminderType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return MAPISTORE_ERR_NOT_FOUND; +} + @end diff --git a/OpenChange/MAPIStoreCalendarMessage.m b/OpenChange/MAPIStoreCalendarMessage.m index 52a4a751e..9bb87e88e 100644 --- a/OpenChange/MAPIStoreCalendarMessage.m +++ b/OpenChange/MAPIStoreCalendarMessage.m @@ -34,11 +34,13 @@ #import #import #import +#import #import #import #import #import #import +#import #import #import #import @@ -417,6 +419,63 @@ return [self getYes: data inMemCtx: memCtx]; } +/* alarms */ +- (int) getPidLidReminderSet: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderSet: data + inMemCtx: memCtx]; +} + +- (int) getPidLidReminderDelta: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderDelta: data + inMemCtx: memCtx]; +} + +- (int) getPidLidReminderTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderTime: data + inMemCtx: memCtx]; +} + +- (int) getPidLidReminderSignalTime: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderSignalTime: data + inMemCtx: memCtx]; +} + +- (int) getPidLidReminderOverride: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderOverride: data + inMemCtx: memCtx]; +} + +- (int) getPidLidReminderType: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderType: data + inMemCtx: memCtx]; +} + +- (int) getPidLidReminderPlaySound: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderPlaySound: data + inMemCtx: memCtx]; +} + +- (int) getPidLidReminderFileParameter: (void **) data + inMemCtx: (TALLOC_CTX *) memCtx +{ + return [[self appointmentWrapper] getPidLidReminderFileParameter: data + inMemCtx: memCtx]; +} + /* attendee */ - (void) _setupRecurrenceInCalendar: (iCalCalendar *) calendar withEvent: (iCalEvent *) event @@ -505,6 +564,48 @@ } } +- (void) _setupAlarmDataInEvent: (iCalEvent *) newEvent +{ + NSArray *alarms; + iCalAlarm *currentAlarm, *alarm = nil; + iCalTrigger *trigger; + NSNumber *delta; + NSString *action; + NSUInteger count, max; + + /* find and remove first display alarm */ + alarms = [newEvent alarms]; + max = [alarms count]; + for (count = 0; !alarm && count < max; count++) + { + currentAlarm = [alarms objectAtIndex: count]; + action = [[currentAlarm action] lowercaseString]; + if (!action || [action isEqualToString: @"display"]) + alarm = currentAlarm; + } + + if (alarm) + [newEvent removeChild: alarm]; + + if ([[newProperties objectForKey: MAPIPropertyKey (PidLidReminderSet)] + boolValue]) + { + delta = [newProperties + objectForKey: MAPIPropertyKey (PidLidReminderDelta)]; + if (delta) + { + alarm = [iCalAlarm new]; + [alarm setAction: @"DISPLAY"]; + trigger = [iCalTrigger elementWithTag: @"trigger"]; + [trigger setValueType: @"DURATION"]; + [trigger setValue: [NSString stringWithFormat: @"-PT%@M", delta]]; + [alarm setTrigger: trigger]; + [newEvent addToAlarms: alarm]; + [alarm release]; + } + } +} + - (void) save { iCalCalendar *vCalendar; @@ -688,6 +789,9 @@ [newEvent setOrganizer: nil]; [newEvent removeAllAttendees]; + /* alarm */ + [self _setupAlarmDataInEvent: newEvent]; + // Organizer value = [newProperties objectForKey: @"recipients"]; if (value)