(fix) email alarms are sent too many times (fixes #4100)

This commit is contained in:
Ludovic Marcotte
2017-06-09 15:17:32 -04:00
parent 5fd8c9d2d0
commit a86f8a8a0a
5 changed files with 56 additions and 38 deletions
+4 -1
View File
@@ -1,6 +1,6 @@
/* iCalAlarm+SOGo.h - this file is part of SOGo
*
* Copyright (C) 2015 Inverse inc.
* Copyright (C) 2015-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,6 +21,7 @@
#import <NGCards/iCalAlarm.h>
@class iCalEntityObject;
@class SOGoUser;
@interface iCalAlarm (SOGoExtensions)
@@ -34,4 +35,6 @@
emailAttendees: (BOOL) reminderEmailAttendees
emailOrganizer: (BOOL) reminderEmailOrganizer;
- (BOOL) userIsAttendee: (SOGoUser *) user;
@end
+21 -1
View File
@@ -1,6 +1,6 @@
/* iCalAlarm+SOGo.m - this file is part of SOGo
*
* Copyright (C) 2015 Inverse inc.
* Copyright (C) 2015-2017 Inverse inc.
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -125,4 +125,24 @@
return AUTORELEASE(anAlarm);
}
- (BOOL) userIsAttendee: (SOGoUser *) user
{
NSEnumerator *attendees;
iCalPerson *currentAttendee;
BOOL isAttendee;
isAttendee = NO;
attendees = [[self attendees] objectEnumerator];
currentAttendee = [attendees nextObject];
while (!isAttendee
&& currentAttendee)
if ([user hasEmail: [currentAttendee rfc822Email]])
isAttendee = YES;
else
currentAttendee = [attendees nextObject];
return isAttendee;
}
@end
+16 -8
View File
@@ -690,6 +690,7 @@ NSNumber *iCalDistantFutureNumber = nil;
{
NSCalendarDate *nextAlarmDate;
GCSAlarmsFolder *af;
SOGoUser *alarmOwner;
NSString *path;
int email_alarm_number;
@@ -698,11 +699,13 @@ NSNumber *iCalDistantFutureNumber = nil;
{
af = [[GCSFolderManager defaultFolderManager] alarmsFolder];
path = [theContainer ocsPath];
alarmOwner = [SOGoUser userWithLogin: [[path componentsSeparatedByString: @"/"] objectAtIndex: 2]];
}
else
{
af = nil;
path = nil;
alarmOwner = nil;
}
nextAlarmDate = nil;
@@ -736,7 +739,8 @@ NSNumber *iCalDistantFutureNumber = nil;
email_alarm_number = [[self alarms] indexOfObject: anAlarm];
// The email alarm is too old, let's just remove it
if ([nextAlarmDate earlierDate: [NSDate date]] == nextAlarmDate)
if ([nextAlarmDate earlierDate: [NSDate date]] == nextAlarmDate ||
![anAlarm userIsAttendee: alarmOwner])
nextAlarmDate = nil;
else
{
@@ -831,17 +835,21 @@ NSNumber *iCalDistantFutureNumber = nil;
nextAlarmDate = [NSDate dateWithTimeIntervalSince1970: [[[alarms objectAtIndex: i] objectForKey: @"c_nextalarm"] intValue]];
}
else if ((anAlarm = [self firstEmailAlarm]) && af)
{
nextAlarmDate = [NSDate dateWithTimeIntervalSince1970: [[[alarms objectAtIndex: i] objectForKey: @"c_nextalarm"] intValue]];
email_alarm_number = [[self alarms] indexOfObject: anAlarm];
[af writeRecordForEntryWithCName: nameInContainer
inCalendarAtPath: path
forUID: [self uid]
recurrenceId: [self recurrenceId]
alarmNumber: [NSNumber numberWithInt: email_alarm_number]
andAlarmDate: nextAlarmDate];
}
if ([anAlarm userIsAttendee: alarmOwner])
[af writeRecordForEntryWithCName: nameInContainer
inCalendarAtPath: path
forUID: [self uid]
recurrenceId: [self recurrenceId]
alarmNumber: [NSNumber numberWithInt: email_alarm_number]
andAlarmDate: nextAlarmDate];
else
nextAlarmDate = nil;
}
}
}
} // for ( ... )