From c495e14cd74c26f26a224946049bcfaf89d9095c Mon Sep 17 00:00:00 2001 From: Ludovic Marcotte Date: Wed, 14 Mar 2018 13:16:53 -0400 Subject: [PATCH] (fix) improved alarms syncing with EAS devices (fixes #4351) --- ActiveSync/iCalAlarm+ActiveSync.m | 43 +++++++++++++++++-------------- ActiveSync/iCalEvent+ActiveSync.m | 19 ++++++-------- NEWS | 1 + 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/ActiveSync/iCalAlarm+ActiveSync.m b/ActiveSync/iCalAlarm+ActiveSync.m index f50ec5572..a74b70726 100644 --- a/ActiveSync/iCalAlarm+ActiveSync.m +++ b/ActiveSync/iCalAlarm+ActiveSync.m @@ -45,27 +45,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - (NSString *) activeSyncRepresentationInContext: (WOContext *) context { NSMutableString *s; + NSCalendarDate *nextAlarmDate; + NSInteger delta; s = [NSMutableString string]; + + nextAlarmDate = [self nextAlarmDate]; + delta = (int)(([[(iCalEvent *)parent startDate] timeIntervalSince1970] - [nextAlarmDate timeIntervalSince1970])/60); - if ([[self action] caseInsensitiveCompare: @"DISPLAY"] == NSOrderedSame) + if ([parent isKindOfClass: [iCalEvent class]]) { - NSCalendarDate *nextAlarmDate; - NSInteger delta; - - nextAlarmDate = [self nextAlarmDate]; - delta = (int)(([[(iCalEvent *)parent startDate] timeIntervalSince1970] - [nextAlarmDate timeIntervalSince1970])/60); - - if ([parent isKindOfClass: [iCalEvent class]]) - { - // don't send negative reminder - not supported - if (delta > 0) - [s appendFormat: @"%d", (int)delta]; - } - else - { - [s appendFormat: @"%@", [nextAlarmDate activeSyncRepresentationInContext: context]]; - } + // don't send negative reminder - not supported + if (delta > 0) + [s appendFormat: @"%d", (int)delta]; + } + else + { + [s appendFormat: @"%@", [nextAlarmDate activeSyncRepresentationInContext: context]]; } return s; @@ -86,7 +82,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. trigger = [iCalTrigger elementWithTag: @"TRIGGER"]; [trigger setValueType: @"DURATION"]; [self setTrigger: trigger]; - [self setAction: @"DISPLAY"]; + if (![self action]) + [self setAction: @"DISPLAY"]; // SOGo web ui only supports 1w but not 2w (custom reminder only supports min/hours/days) // 1week = -P1W @@ -115,8 +112,16 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. trigger = [iCalTrigger elementWithTag: @"TRIGGER"]; [trigger setValueType: @"DATE-TIME"]; [trigger setSingleValue: [NSString stringWithFormat: @"%@Z", [o iCalFormattedDateTimeString]] forKey: @""]; + + if ((o = [theValues objectForKey: @"ReminderSet"])) + { + if ([o intValue] == 0) + [trigger setValue: 0 ofAttribute: @"x-webstatus" to: @"triggered"]; + } + [self setTrigger: trigger]; - [self setAction: @"DISPLAY"]; + if (![self action]) + [self setAction: @"DISPLAY"]; } } diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m index 86881aad7..9143665fd 100644 --- a/ActiveSync/iCalEvent+ActiveSync.m +++ b/ActiveSync/iCalEvent+ActiveSync.m @@ -321,7 +321,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. { iCalAlarm *alarm; - alarm = [self firstDisplayOrAudioAlarm]; + alarm = [self firstSupportedAlarm]; [s appendString: [alarm activeSyncRepresentationInContext: context]]; } @@ -447,6 +447,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NSCalendarDate *oldstart; NSTimeZone *userTimeZone; iCalTimeZone *tz; + iCalAlarm *alarm; id o; int deltasecs; @@ -582,23 +583,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. } } - // - // If an alarm is deinfed with an action != DISPLAY, we ignore the alarm - don't want to overwrite. - // - if ([self hasAlarms] && [[[[self alarms] objectAtIndex: 0] action] caseInsensitiveCompare: @"DISPLAY"] != NSOrderedSame) - { - // Ignore the alarm for now - } - else if ((o = [theValues objectForKey: @"Reminder"]) && [o length]) + if ((o = [theValues objectForKey: @"Reminder"]) && [o length]) { + if ([self hasAlarms]) + alarm = [[self firstSupportedAlarm] mutableCopy]; + else + alarm = [[iCalAlarm alloc] init]; + // NOTE: Outlook sends a 15 min reminder (18 hour for allday) if no reminder is specified // although no default reminder is defined (File -> Options -> Clendar -> Calendar Options - > Default Reminders) // // http://answers.microsoft.com/en-us/office/forum/office_2013_release-outlook/desktop-outlook-calendar-creates-entries-with/9aef72d8-81bb-4a32-a6ab-bf7d216fb811?page=5&tm=1395690285088 // - iCalAlarm *alarm; - alarm = [[iCalAlarm alloc] init]; [alarm takeActiveSyncValues: theValues inContext: context]; [self removeAllAlarms]; diff --git a/NEWS b/NEWS index 5c5c49467..403cd5234 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ Bug fixes - [web] prevent deletion of special folders using del key + - [eas] improved alarms syncing with EAS devices (#4351) 4.0.0 (2018-03-07) ------------------