Skip to content

Commit

Permalink
(fix) improved alarms syncing with EAS devices (fixes #4351)
Browse files Browse the repository at this point in the history
  • Loading branch information
extrafu committed Mar 14, 2018
1 parent f799716 commit c495e14
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 30 deletions.
43 changes: 24 additions & 19 deletions ActiveSync/iCalAlarm+ActiveSync.m
Expand Up @@ -45,27 +45,23 @@ @implementation iCalAlarm (ActiveSync)
- (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: @"<Reminder xmlns=\"Calendar:\">%d</Reminder>", (int)delta];
}
else
{
[s appendFormat: @"<ReminderTime xmlns=\"Task:\">%@</ReminderTime>", [nextAlarmDate activeSyncRepresentationInContext: context]];
}
// don't send negative reminder - not supported
if (delta > 0)
[s appendFormat: @"<Reminder xmlns=\"Calendar:\">%d</Reminder>", (int)delta];
}
else
{
[s appendFormat: @"<ReminderTime xmlns=\"Task:\">%@</ReminderTime>", [nextAlarmDate activeSyncRepresentationInContext: context]];
}

return s;
Expand All @@ -86,7 +82,8 @@ - (void) takeActiveSyncValues: (NSDictionary *) theValues
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
Expand Down Expand Up @@ -115,8 +112,16 @@ - (void) takeActiveSyncValues: (NSDictionary *) theValues
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"];
}
}

Expand Down
19 changes: 8 additions & 11 deletions ActiveSync/iCalEvent+ActiveSync.m
Expand Up @@ -321,7 +321,7 @@ - (NSString *) activeSyncRepresentationInContext: (WOContext *) context
{
iCalAlarm *alarm;

alarm = [self firstDisplayOrAudioAlarm];
alarm = [self firstSupportedAlarm];
[s appendString: [alarm activeSyncRepresentationInContext: context]];
}

Expand Down Expand Up @@ -447,6 +447,7 @@ - (void) takeActiveSyncValues: (NSDictionary *) theValues
NSCalendarDate *oldstart;
NSTimeZone *userTimeZone;
iCalTimeZone *tz;
iCalAlarm *alarm;
id o;
int deltasecs;

Expand Down Expand Up @@ -582,23 +583,19 @@ - (void) takeActiveSyncValues: (NSDictionary *) theValues
}
}

//
// 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];
Expand Down
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -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)
------------------
Expand Down

0 comments on commit c495e14

Please sign in to comment.