View Issue Details

IDProjectCategoryView StatusLast Update
0002681SOGoActiveSyncpublic2014-03-28 14:44
Reportertfu Assigned Toludovic  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Platform[Client] MicrosoftOSWindowsOS Version7
Product Version2.2.3 
Fixed in Version2.2.3 
Summary0002681: calender events don't support reminders yet
Description

Reminders are currently not supported for calendar events. Attached patch provides a simple implementation. There is additional work needed when exceptions with recurring events are supported/implemented but it could be a starting point.

TagsPatch

Activities

tfu

tfu

2014-03-24 17:08

reporter  

0001-basic-reminder.patch (3,969 bytes)   
From 36e39eb7e12c67acbdca4f45316e079c69a35588 Mon Sep 17 00:00:00 2001
From: root <root@example.com>
Date: Mon, 24 Mar 2014 21:57:23 +0100
Subject: [PATCH] basic reminder

---
 ActiveSync/iCalEvent+ActiveSync.m |   65 +++++++++++++++++++++++++++++++++++++
 1 file changed, 65 insertions(+)

diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m
index 05f18a3..df7a78b 100644
--- a/ActiveSync/iCalEvent+ActiveSync.m
+++ b/ActiveSync/iCalEvent+ActiveSync.m
@@ -55,6 +55,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "NSDate+ActiveSync.h"
 #include "NSString+ActiveSync.h"
 
+#import <NGCards/iCalAlarm.h>
+
+
 @implementation iCalEvent (ActiveSync)
 
 - (int) _attendeeStatus: (iCalPerson *) attendee
@@ -210,6 +213,26 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   
   // Reminder -- http://msdn.microsoft.com/en-us/library/ee219691(v=exchg.80).aspx
   // TODO
+  if ([self hasAlarms] ) {
+    NSLog(@"tfu reminder hasAlarm=True");
+    NSLog(@"tfu reminder startDate %@", [[self startDate] activeSyncRepresentationWithoutSeparatorsInContext: context]);
+
+    iCalAlarm *anAlarm;
+    NSCalendarDate  *nextAlarmDate;
+    NSInteger delta;
+	
+    anAlarm = [[self alarms] objectAtIndex: 0];
+    if ([[anAlarm action] caseInsensitiveCompare: @"DISPLAY"] == NSOrderedSame)  {
+          nextAlarmDate = [anAlarm nextAlarmDate];
+          delta = (int)(([[self startDate] timeIntervalSince1970] - [nextAlarmDate timeIntervalSince1970]  )/60);
+
+          NSLog(@"tfu reminder nextAlarmDate %@", [nextAlarmDate activeSyncRepresentationWithoutSeparatorsInContext: context]);
+          NSLog(@"tfu reminder Reminder %d",   delta);
+          // don't send negative reminder - not supported
+          if (delta >0)
+              [s appendFormat: @"<Reminder xmlns=\"Calendar:\">%d</Reminder>", delta];
+    }
+  }
 
   // Recurrence rules
   if ([self isRecurrent])
@@ -390,6 +413,48 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
         }
     }
 
+  // tfu if an alarm is deinfed with an action != DISPLAY ignore the alarm - don't want to overwrite 
+  if ([self hasAlarms] && [[[[self alarms] objectAtIndex: 0] action] caseInsensitiveCompare: @"DISPLAY"] != NSOrderedSame)  {
+     NSLog(@"tfu reminder received hasAlarms != DISPLAY  ignore client");
+  }
+  else {
+       // tfu add an alarm specified in msg
+       if ((o = [theValues objectForKey: @"Reminder"])) {
+           NSLog(@"tfu reminder received %@", o);
+           
+           // tfu 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 
+
+	   // outlook: if reminder is set to 0 minutes before start save it as 1 minute since -> 0 minutes in not accepted by sogo
+           if ([o isEqualToString: @"0"]) 
+		o=@"1";
+
+           iCalAlarm  *alarm = nil;
+           iCalTrigger *trigger;
+
+           alarm = [iCalAlarm new];
+           trigger = [iCalTrigger elementWithTag: @"TRIGGER"];
+           [trigger setValueType: @"DURATION"];
+           [alarm setTrigger: trigger];
+           [alarm setAction: @"DISPLAY"];
+           [trigger setSingleValue: [NSString stringWithFormat: @"-PT%@M", o] forKey: @""];
+
+          
+           [self  removeAllAlarms];
+
+           [self addToAlarms: alarm];
+           [alarm release];
+           //}
+        } else {
+           // tfu remove existing alarm since no reminder in msg
+           NSLog(@"tfu reminder removeAllAlarms");
+	   [self  removeAllAlarms];
+        }
+
+   }
+
+
   // Recurrence
   if ((o = [theValues objectForKey: @"Recurrence"]))
     {
-- 
1.7.9.5

0001-basic-reminder.patch (3,969 bytes)   
ludovic

ludovic

2014-03-24 20:06

administrator  

alarm.patch (3,185 bytes)   
diff --git a/ActiveSync/GNUmakefile b/ActiveSync/GNUmakefile
index 12f12e5..9695806 100644
--- a/ActiveSync/GNUmakefile
+++ b/ActiveSync/GNUmakefile
@@ -9,6 +9,7 @@ ActiveSync_PRINCIPAL_CLASS = ActiveSyncProduct
 
 ActiveSync_OBJC_FILES =			\
 	ActiveSyncProduct.m		\
+	iCalAlarm+ActiveSync.m		\
 	iCalEvent+ActiveSync.m		\
 	iCalRecurrenceRule+ActiveSync.m \
 	iCalTimeZone+ActiveSync.m	\
@@ -30,7 +31,7 @@ ActiveSync_RESOURCE_FILES +=		\
 
 ADDITIONAL_OBJCFLAGS += -Wno-deprecated-declarations
 ADDITIONAL_INCLUDE_DIRS += -I../SOPE/ -I../SoObjects/
-ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/
+ADDITIONAL_LIB_DIRS += -L../SOPE/GDLContentStore/obj/ -L../SOPE/NGCards/obj/
 ADDITIONAL_INCLUDE_DIRS += -I/usr/include/libwbxml-1.0/
 ADDITIONAL_LDFLAGS += -Wl,--no-as-needed -lwbxml2
 
diff --git a/ActiveSync/iCalEvent+ActiveSync.m b/ActiveSync/iCalEvent+ActiveSync.m
index 05f18a3..a6b4c80 100644
--- a/ActiveSync/iCalEvent+ActiveSync.m
+++ b/ActiveSync/iCalEvent+ActiveSync.m
@@ -50,6 +50,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #import <Appointments/iCalEntityObject+SOGo.h>
 
+#include "iCalAlarm+ActiveSync.h"
 #include "iCalRecurrenceRule+ActiveSync.h"
 #include "iCalTimeZone+ActiveSync.h"
 #include "NSDate+ActiveSync.h"
@@ -209,7 +210,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   [s appendFormat: @"<Sensitivity xmlns=\"Calendar:\">%d</Sensitivity>", v];
   
   // Reminder -- http://msdn.microsoft.com/en-us/library/ee219691(v=exchg.80).aspx
-  // TODO
+  // TODO: improve this to handle more alarm types
+  if ([self hasAlarms]) 
+    {
+      iCalAlarm *alarm;
+      
+      alarm = [[self alarms] objectAtIndex: 0];
+      [s appendString: [alarm activeSyncRepresentationInContext: context]];
+    }
 
   // Recurrence rules
   if ([self isRecurrent])
@@ -390,6 +398,35 @@ 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"]))
+    {           
+      // 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];
+      [self addToAlarms: alarm];
+      RELEASE(alarm);
+    }
+  else
+    {
+      // We remove existing alarm since no reminder in the ActiveSync payload
+      [self removeAllAlarms];
+    }
+  
   // Recurrence
   if ((o = [theValues objectForKey: @"Recurrence"]))
     {
alarm.patch (3,185 bytes)   
ludovic

ludovic

2014-03-24 20:06

administrator  

iCalAlarm+ActiveSync.h (1,876 bytes)
ludovic

ludovic

2014-03-24 20:06

administrator  

iCalAlarm+ActiveSync.m (3,099 bytes)
ludovic

ludovic

2014-03-24 20:07

administrator   ~0006775

Nice work!

Can you try the attached patch (+ 2 new files) based on your work? It fits more the current model to use Objective-C categories on top of existing objects.

This code is totally untested.

tfu

tfu

2014-03-25 15:12

reporter  

tfu

tfu

2014-03-25 15:13

reporter   ~0006780

As fare I was able to test it is working. I added a few lines to iCalAlarm+ActiveSync.m to do a better conversion of the alarm time.

ludovic

ludovic

2014-03-28 14:44

administrator   ~0006802

https://github.com/inverse-inc/sogo/commit/633723a4708db1a807c69aae8204a39213941b54

Issue History

Date Modified Username Field Change
2014-03-24 17:08 tfu New Issue
2014-03-24 17:08 tfu File Added: 0001-basic-reminder.patch
2014-03-24 20:06 ludovic File Added: alarm.patch
2014-03-24 20:06 ludovic File Added: iCalAlarm+ActiveSync.h
2014-03-24 20:06 ludovic File Added: iCalAlarm+ActiveSync.m
2014-03-24 20:07 ludovic Note Added: 0006775
2014-03-25 04:38 Christian Mack Tag Attached: Patch
2014-03-25 15:12 tfu File Added: iCalAlarm+ActiveSync.m_new
2014-03-25 15:13 tfu Note Added: 0006780
2014-03-26 14:31 ludovic Product Version 2.2.2 => 2.2.3
2014-03-28 14:44 ludovic Note Added: 0006802
2014-03-28 14:44 ludovic Status new => closed
2014-03-28 14:44 ludovic Assigned To => ludovic
2014-03-28 14:44 ludovic Resolution open => fixed
2014-03-28 14:44 ludovic Fixed in Version => 2.2.3