/** * 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}\"."); }
/** * 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. }