lib/kolab_sync_data_calendar.php

Aleksander Machniak machniak at kolabsys.com
Fri Mar 27 12:45:37 CET 2015


 lib/kolab_sync_data_calendar.php |   50 +++++++++++++++++++++++++++------------
 1 file changed, 35 insertions(+), 15 deletions(-)

New commits:
commit f2751bb877f87a1b921095383d4671b5438bf34f
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Fri Mar 27 07:44:50 2015 -0400

    Fix event alarms/reminders synchronization from Kolab to activesync device (#4889)

diff --git a/lib/kolab_sync_data_calendar.php b/lib/kolab_sync_data_calendar.php
index 359821b..785c9d0 100644
--- a/lib/kolab_sync_data_calendar.php
+++ b/lib/kolab_sync_data_calendar.php
@@ -254,7 +254,7 @@ class kolab_sync_data_calendar extends kolab_sync_data implements Syncroton_Data
         }
 
         // Event reminder time
-        if ($config['ALARMS'] && ($minutes = $this->from_kolab_alarm($event['alarms']))) {
+        if ($config['ALARMS'] && ($minutes = $this->from_kolab_alarm($event))) {
             $result['reminder'] = $minutes;
         }
 
@@ -426,7 +426,7 @@ class kolab_sync_data_calendar extends kolab_sync_data implements Syncroton_Data
         // Reminder
         // @TODO: should alarms be used when importing event from phone?
         if ($config['ALARMS']) {
-            $event['alarms'] = $this->to_kolab_alarm($data->reminder, $event);
+            $event['valarms'] = $this->to_kolab_alarm($data->reminder, $event);
         }
 
         $event['attendees']  = array();
@@ -530,13 +530,20 @@ class kolab_sync_data_calendar extends kolab_sync_data implements Syncroton_Data
     }
 
     /**
-     * Converts libkolab alarms string into number of minutes
+     * Converts libkolab alarms spec. into a number of minutes
      */
-    protected function from_kolab_alarm($value)
+    protected function from_kolab_alarm($event)
     {
-        // e.g. '-15M:DISPLAY'
-        // Ignore EMAIL alarms
-        if (preg_match('/^-([0-9]+)([WDHMS]):(DISPLAY|AUDIO)$/', $value, $matches)) {
+        if (isset($event['valarms'])) {
+            foreach ($event['valarms'] as $alarm) {
+                if (in_array($alarm['action'], array('DISPLAY', 'AUDIO'))) {
+                    $value = $alarm['trigger'];
+                    break;
+                }
+            }
+        }
+
+        if ($value && preg_match('/^-[PT]*([0-9]+)([WDHMS])$/', $value, $matches)) {
             $value = intval($matches[1]);
 
             switch ($matches[2]) {
@@ -551,24 +558,37 @@ class kolab_sync_data_calendar extends kolab_sync_data implements Syncroton_Data
     }
 
     /**
-     * Converts ActiveSync libkolab alarms string into number of minutes
+     * Converts ActiveSync reminder into libkolab alarms spec.
      */
     protected function to_kolab_alarm($value, $event)
     {
-        // Get alarm type from old event object if exists
-        if (!empty($event['alarms']) && preg_match('/:(.*)$/', $event['alarms'], $matches)) {
-            $type = $matches[1];
+        $valarms     = array();
+        $unsupported = array();
+
+        if (!empty($event['valarms'])) {
+            foreach ($event['valarms'] as $alarm) {
+                if (!$current && in_array($alarm['action'], array('DISPLAY', 'AUDIO'))) {
+                    $current = $alarm;
+                }
+                else {
+                    $unsupported[] = $alarm;
+                }
+            }
         }
 
         if ($value) {
-            return sprintf('-%dM:%s', $value, $type ? $type : 'DISPLAY');
+            $valarms[] = array(
+                'action'      => $current['action'] ?: 'DISPLAY',
+                'description' => $current['description'] ?: '',
+                'trigger'     => sprintf('-PT%dM', $value),
+            );
         }
 
-        if ($type == 'DISPLAY' || $type == 'AUDIO') {
-            return null;
+        if (!empty($unsupported)) {
+            $valarms = array_merge($valarms, $unsupported);
         }
 
-        return $event['alarms'];
+        return $valarms;
     }
 
 }




More information about the commits mailing list