diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index b8083235..5f7d1fd3 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -1264,7 +1264,47 @@ class calendar extends rcube_plugin return false; } - + + /** + * Get the next alarm (time & action) for the given event + * + * @param array Event data + * @return array Hash array with alarm time/type or null if no alarms are configured + */ + public static function get_next_alarm($event) + { + if (!$event['alarms']) + return null; + + // TODO: handle multiple alarms (currently not supported) + list($trigger, $action) = explode(':', $event['alarms'], 2); + + $notify = self::parse_alaram_value($trigger); + if (!empty($notify[1])){ // offset + $mult = 1; + switch ($notify[1]) { + case '-S': $mult = -1; break; + case '+S': $mult = 1; break; + case '-M': $mult = -60; break; + case '+M': $mult = 60; break; + case '-H': $mult = -3600; break; + case '+H': $mult = 3600; break; + case '-D': $mult = -86400; break; + case '+D': $mult = 86400; break; + case '-W': $mult = -604800; break; + case '+W': $mult = 604800; break; + } + $offset = $notify[0] * $mult; + $refdate = $mult > 0 ? $event['end'] : $event['start']; + $notify_at = $refdate + $offset; + } + else { // absolute timestamp + $notify_at = $notify[0]; + } + + return array('time' => $notify_at, 'action' => $action ? strtoupper($action) : 'DISPLAY'); + } + /** * Convert the internal structured data into a vcalendar rrule 2.0 string */ diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php index ba7f1e7c..b871d512 100644 --- a/plugins/calendar/drivers/database/database_driver.php +++ b/plugins/calendar/drivers/database/database_driver.php @@ -396,31 +396,13 @@ class database_driver extends calendar_driver */ private function _get_notification($event) { - if ($event['alarms']) { - list($trigger, $action) = explode(':', $event['alarms']); - $notify = calendar::parse_alaram_value($trigger); - if (!empty($notify[1])){ // offset - $mult = 1; - switch ($notify[1]) { - case '-M': $mult = -60; break; - case '+M': $mult = 60; break; - case '-H': $mult = -3600; break; - case '+H': $mult = 3600; break; - case '-D': $mult = -86400; break; - case '+D': $mult = 86400; break; - } - $offset = $notify[0] * $mult; - $refdate = $mult > 0 ? $event['end'] : $event['start']; - $notify_at = $refdate + $offset; - } - else { // absolute timestamp - $notify_at = $notify[0]; - } + if ($event['alarms'] && $event['start'] > time()) { + $alarm = calendar::get_next_alarm($event); - if ($event['start'] > time()) - return date('Y-m-d H:i:s', $notify_at); + if ($alarm['time'] && $alarm['action'] == 'DISPLAY') + return date('Y-m-d H:i:s', $alarm['time']); } - + return null; } diff --git a/plugins/calendar/drivers/kolab/kolab_calendar.php b/plugins/calendar/drivers/kolab/kolab_calendar.php index 6104972c..d0366580 100644 --- a/plugins/calendar/drivers/kolab/kolab_calendar.php +++ b/plugins/calendar/drivers/kolab/kolab_calendar.php @@ -197,16 +197,16 @@ class kolab_calendar * @param integer Event's new start (unix timestamp) * @param integer Event's new end (unix timestamp) * @param string Search query (optional) - * @param boolean Strip virtual events (optional) + * @param boolean Include virtual events (optional) + * @param array Additional parameters to query storage * @return array A list of event records */ - public function list_events($start, $end, $search = null, $virtual = 1) + public function list_events($start, $end, $search = null, $virtual = 1, $query = array()) { // query Kolab storage - $query = array( - array('dtstart', '<=', $end), - array('dtend', '>=', $start), - ); + $query[] = array('dtstart', '<=', $end); + $query[] = array('dtend', '>=', $start); + foreach ((array)$this->storage->select($query) as $record) { $event = $this->_to_rcube_event($record); $this->events[$event['id']] = $event; diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index 6ce7a845..5d1906be 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -765,17 +765,19 @@ class kolab_driver extends calendar_driver $time = $slot + $interval; $events = array(); + $query = array(array('tags', 'LIKE', '% x-has-alarms %')); foreach ($this->calendars as $cid => $calendar) { // skip calendars with alarms disabled if (!$calendar->alarms || ($calendars && !in_array($cid, $calendars))) continue; - foreach ($calendar->list_events($time, $time + 86400 * 365) as $e) { + foreach ($calendar->list_events($time, $time + 86400 * 365, null, 1, $query) as $e) { // add to list if alarm is set - if ($e['_alarm'] && ($notifyat = $e['start'] - $e['_alarm'] * 60) <= $time) { + $alarm = calendar::get_next_alarm($e); + if ($alarm && $alarm['time'] && $alarm['time'] <= $time && $alarm['action'] == 'DISPLAY') { $id = $e['id']; $events[$id] = $e; - $events[$id]['notifyat'] = $notifyat; + $events[$id]['notifyat'] = $alarm['time']; } } }