Пример #1
0
 /**
  * Synchronizes events of given calendar.
  *
  * @param int Calendar id.
  */
 private function _sync_calendar($cal_id)
 {
     self::debug_log("Syncing calendar id \"{$cal_id}\".");
     if (!($cal_sync = $this->sync_clients[$cal_id])) {
         self::debug_log("No sync client for calendar id \"{$cal_id}\".");
         return;
     }
     $events = array();
     // Ignore recurrence events
     foreach ($this->_load_all_events($cal_id) as $event) {
         if ($event["recurrence_id"] == 0) {
             array_push($events, $event);
         }
     }
     $updates = $cal_sync->get_updates($events);
     if ($updates) {
         list($updates, $synced_event_ids) = $updates;
         $updated_event_ids = $this->_perform_updates($updates);
         // Delete events that are not in sync or updated.
         foreach ($events as $event) {
             if (array_search($event["id"], $updated_event_ids) === false && array_search($event["id"], $synced_event_ids) === false) {
                 // Assume: Event was not updated, so delete!
                 parent::remove_event($event, true);
                 self::debug_log("Remove event \"" . $event["id"] . "\".");
             }
         }
         $cal_props = $this->_get_ical_props($cal_id, self::OBJ_TYPE_ICAL);
         $cal_props["tag"] = $cal_sync->get_etag();
         $this->_set_ical_props($cal_id, self::OBJ_TYPE_ICAL, $cal_props);
     }
     self::debug_log("Successfully synced calendar id \"{$cal_id}\".");
 }
Пример #2
0
 /**
  * Remove a single event from the database and from caldav server.
  *
  * @param array Hash array with event properties
  * @param boolean Remove record irreversible
  *
  * @see calendar_driver::remove_event()
  */
 public function remove_event($obj, $force = true)
 {
     $obj = $this->_get_id($obj);
     $event_id = (int) $obj['id'];
     $cal_id = (int) $obj['calendar'];
     $savemode = $obj['_savemode'] ? $obj['_savemode'] : 'all';
     $event = parent::get_master($obj);
     if ($event['recurrence_id']) {
         $event_id = (int) $event['recurrence_id'];
         $event['id'] = $event_id;
         unset($event['recurrence_id']);
     }
     if (!($props = $this->_get_caldav_props($event_id, self::OBJ_TYPE_VEVENT))) {
         $savemode = 'current';
         $event = parent::get_event($event['uid']);
         $props = $this->_get_caldav_props($event['id'], self::OBJ_TYPE_VEVENT);
     }
     if (parent::remove_event($obj, $force) && is_array($props)) {
         $sync_client = $this->sync_clients[$cal_id];
         switch ($savemode) {
             case 'current':
             case 'future':
                 $event = parent::get_master($event);
                 $event = $this->_save_preprocess($event);
                 $success = $sync_client->update_event($event, $props);
                 break;
             default:
                 // all is default
                 $success = $sync_client->remove_event($props);
                 break;
         }
         if ($success === true) {
             self::debug_log("Successfully removed event \"{$event_id}\".");
         } else {
             self::debug_log("Unkown error while removing caldav event \"{$event_id}\", force sync calendar \"{$cal_id}\"!");
         }
         // Trigger calendar sync to update ctags and etags.
         $this->_sync_calendar($cal_id);
         return $success;
     }
     return false;
     // Unkown error.
 }