Copy CadDav driver from https://github.com/fasterit/roundcube_calendar
This commit is contained in:
parent
e11e26ed24
commit
21e3fff576
8 changed files with 2595 additions and 0 deletions
92
drivers/caldav/SQL/mysql.initial.sql
Normal file
92
drivers/caldav/SQL/mysql.initial.sql
Normal file
|
@ -0,0 +1,92 @@
|
|||
/**
|
||||
* CalDAV Client
|
||||
*
|
||||
* @version @package_version@
|
||||
* @author Daniel Morlock <daniel.morlock@awesome-it.de>
|
||||
*
|
||||
* Copyright (C) Awesome IT GbR <info@awesome-it.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `caldav_calendars` (
|
||||
`calendar_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`name` varchar(255) NOT NULL,
|
||||
`color` varchar(8) NOT NULL,
|
||||
`showalarms` tinyint(1) NOT NULL DEFAULT '1',
|
||||
|
||||
`caldav_url` varchar(255) NOT NULL,
|
||||
`caldav_tag` varchar(255) DEFAULT NULL,
|
||||
`caldav_user` varchar(255) DEFAULT NULL,
|
||||
`caldav_pass` varchar(1024) DEFAULT NULL,
|
||||
`caldav_last_change` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
PRIMARY KEY(`calendar_id`),
|
||||
INDEX `caldav_user_name_idx` (`user_id`, `name`),
|
||||
CONSTRAINT `fk_caldav_calendars_user_id` FOREIGN KEY (`user_id`)
|
||||
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `caldav_events` (
|
||||
`event_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`calendar_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`recurrence_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`uid` varchar(255) NOT NULL DEFAULT '',
|
||||
`instance` varchar(16) NOT NULL DEFAULT '',
|
||||
`isexception` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`sequence` int(1) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`start` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`end` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`recurrence` varchar(255) DEFAULT NULL,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`description` text NOT NULL,
|
||||
`location` varchar(255) NOT NULL DEFAULT '',
|
||||
`categories` varchar(255) NOT NULL DEFAULT '',
|
||||
`url` varchar(255) NOT NULL DEFAULT '',
|
||||
`all_day` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`free_busy` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`priority` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`sensitivity` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`status` varchar(32) NOT NULL DEFAULT '',
|
||||
`alarms` text NULL DEFAULT NULL,
|
||||
`attendees` text DEFAULT NULL,
|
||||
`notifyat` datetime DEFAULT NULL,
|
||||
|
||||
`caldav_url` varchar(255) NOT NULL,
|
||||
`caldav_tag` varchar(255) DEFAULT NULL,
|
||||
`caldav_last_change` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
PRIMARY KEY(`event_id`),
|
||||
INDEX `caldav_uid_idx` (`uid`),
|
||||
INDEX `caldav_recurrence_idx` (`recurrence_id`),
|
||||
INDEX `caldav_calendar_notify_idx` (`calendar_id`,`notifyat`),
|
||||
CONSTRAINT `fk_caldav_events_calendar_id` FOREIGN KEY (`calendar_id`)
|
||||
REFERENCES `caldav_calendars`(`calendar_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `caldav_attachments` (
|
||||
`attachment_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`event_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`filename` varchar(255) NOT NULL DEFAULT '',
|
||||
`mimetype` varchar(255) NOT NULL DEFAULT '',
|
||||
`size` int(11) NOT NULL DEFAULT '0',
|
||||
`data` longtext NOT NULL,
|
||||
PRIMARY KEY(`attachment_id`),
|
||||
CONSTRAINT `fk_caldav_attachments_event_id` FOREIGN KEY (`event_id`)
|
||||
REFERENCES `caldav_events`(`event_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
||||
REPLACE INTO `system` (`name`, `value`) VALUES ('calendar-caldav-version', '2015022700');
|
0
drivers/caldav/SQL/mysql/.keep_dir
Normal file
0
drivers/caldav/SQL/mysql/.keep_dir
Normal file
24
drivers/caldav/SQL/mysql/2014081300.sql
Normal file
24
drivers/caldav/SQL/mysql/2014081300.sql
Normal file
|
@ -0,0 +1,24 @@
|
|||
/**
|
||||
* CalDAV Client
|
||||
*
|
||||
* @version @package_version@
|
||||
* @author Daniel Morlock <daniel.morlock@awesome-it.de>
|
||||
*
|
||||
* Copyright (C) Awesome IT GbR <info@awesome-it.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
ALTER TABLE `caldav_props` change `user` `username` varchar(255);
|
||||
ALTER TABLE `events` ADD `status` VARCHAR(32) NOT NULL DEFAULT '' AFTER `sensitivity`;
|
125
drivers/caldav/SQL/mysql/2015022500.sql
Normal file
125
drivers/caldav/SQL/mysql/2015022500.sql
Normal file
|
@ -0,0 +1,125 @@
|
|||
/**
|
||||
* CalDAV Client
|
||||
*
|
||||
* @version @package_version@
|
||||
* @author Daniel Morlock <daniel.morlock@awesome-it.de>
|
||||
*
|
||||
* Copyright (C) Awesome IT GbR <info@awesome-it.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Create new tables */
|
||||
CREATE TABLE IF NOT EXISTS `caldav_calendars` (
|
||||
`calendar_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`name` varchar(255) NOT NULL,
|
||||
`color` varchar(8) NOT NULL,
|
||||
`showalarms` tinyint(1) NOT NULL DEFAULT '1',
|
||||
|
||||
`caldav_url` varchar(255) NOT NULL,
|
||||
`caldav_tag` varchar(255) DEFAULT NULL,
|
||||
`caldav_user` varchar(255) DEFAULT NULL,
|
||||
`caldav_pass` varchar(1024) DEFAULT NULL,
|
||||
`caldav_last_change` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
PRIMARY KEY(`calendar_id`),
|
||||
INDEX `caldav_user_name_idx` (`user_id`, `name`),
|
||||
CONSTRAINT `fk_caldav_calendars_user_id` FOREIGN KEY (`user_id`)
|
||||
REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `caldav_events` (
|
||||
`event_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`calendar_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`recurrence_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`uid` varchar(255) NOT NULL DEFAULT '',
|
||||
`created` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`changed` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`sequence` int(1) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`start` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`end` datetime NOT NULL DEFAULT '1000-01-01 00:00:00',
|
||||
`recurrence` varchar(255) DEFAULT NULL,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`description` text NOT NULL,
|
||||
`location` varchar(255) NOT NULL DEFAULT '',
|
||||
`categories` varchar(255) NOT NULL DEFAULT '',
|
||||
`url` varchar(255) NOT NULL DEFAULT '',
|
||||
`all_day` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`free_busy` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`priority` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`sensitivity` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`status` varchar(32) NOT NULL DEFAULT '',
|
||||
`alarms` varchar(255) DEFAULT NULL,
|
||||
`attendees` text DEFAULT NULL,
|
||||
`notifyat` datetime DEFAULT NULL,
|
||||
|
||||
`caldav_url` varchar(255) NOT NULL,
|
||||
`caldav_tag` varchar(255) DEFAULT NULL,
|
||||
`caldav_last_change` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
PRIMARY KEY(`event_id`),
|
||||
INDEX `caldav_uid_idx` (`uid`),
|
||||
INDEX `caldav_recurrence_idx` (`recurrence_id`),
|
||||
INDEX `caldav_calendar_notify_idx` (`calendar_id`,`notifyat`),
|
||||
CONSTRAINT `fk_caldav_events_calendar_id` FOREIGN KEY (`calendar_id`)
|
||||
REFERENCES `calendars`(`calendar_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `caldav_attachments` (
|
||||
`attachment_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`event_id` int(11) UNSIGNED NOT NULL DEFAULT '0',
|
||||
`filename` varchar(255) NOT NULL DEFAULT '',
|
||||
`mimetype` varchar(255) NOT NULL DEFAULT '',
|
||||
`size` int(11) NOT NULL DEFAULT '0',
|
||||
`data` longtext NOT NULL,
|
||||
PRIMARY KEY(`attachment_id`),
|
||||
CONSTRAINT `fk_caldav_attachments_event_id` FOREIGN KEY (`event_id`)
|
||||
REFERENCES `events`(`event_id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */;
|
||||
|
||||
/* Migrate Data */
|
||||
INSERT INTO caldav_calendars SELECT calendar_id, user_id, `name`, color, showalarms, url as caldav_url,
|
||||
tag as caldav_tag, username as caldav_user, pass as caldav_pass,
|
||||
last_change as caldav_last_change
|
||||
FROM calendars cal, caldav_props dav
|
||||
WHERE dav.obj_id = cal.calendar_id
|
||||
AND dav.obj_type = 'vcal';
|
||||
|
||||
INSERT INTO caldav_events SELECT e.*, dav.url as caldav_url, dav.tag as caldav_tag, dav.last_change as caldav_last_change
|
||||
FROM `events` e, caldav_props dav
|
||||
WHERE dav.obj_id = e.event_id
|
||||
AND dav.obj_type = 'vevent';
|
||||
|
||||
INSERT INTO caldav_attachments SELECT * FROM attachments a
|
||||
WHERE a.event_id IN (
|
||||
SELECT obj_id FROM caldav_props dav
|
||||
WHERE dav.obj_type = 'vevent'
|
||||
);
|
||||
|
||||
/* Drop deprecated data */
|
||||
DELETE FROM `events` WHERE event_id IN (
|
||||
SELECT obj_id FROM caldav_props dav
|
||||
WHERE dav.obj_type = 'vevent'
|
||||
);
|
||||
DELETE FROM calendars WHERE calendar_id IN (
|
||||
SELECT obj_id FROM caldav_props dav
|
||||
WHERE dav.obj_type = 'vcal'
|
||||
);
|
||||
DELETE FROM attachments WHERE event_id IN (
|
||||
SELECT obj_id FROM caldav_props dav
|
||||
WHERE dav.obj_type = 'vevent'
|
||||
);
|
||||
DROP TABLE caldav_props;
|
||||
|
14
drivers/caldav/SQL/mysql/2015022700.sql
Normal file
14
drivers/caldav/SQL/mysql/2015022700.sql
Normal file
|
@ -0,0 +1,14 @@
|
|||
-- add identifier for recurring instances and exceptions
|
||||
|
||||
ALTER TABLE `caldav_events` ADD `instance` varchar(16) NOT NULL DEFAULT '' AFTER `uid`;
|
||||
ALTER TABLE `caldav_events` ADD `isexception` tinyint(1) NOT NULL DEFAULT '0' AFTER `instance`;
|
||||
|
||||
UPDATE `caldav_events` SET `instance` = DATE_FORMAT(`start`, '%Y%m%d')
|
||||
WHERE `recurrence_id` != 0 AND `instance` = '' AND `all_day` = 1;
|
||||
|
||||
UPDATE `caldav_events` SET `instance` = DATE_FORMAT(`start`, '%Y%m%dT%k%i%s')
|
||||
WHERE `recurrence_id` != 0 AND `instance` = '' AND `all_day` = 0;
|
||||
|
||||
-- extend alarms columns for multiple values
|
||||
|
||||
ALTER TABLE `caldav_events` CHANGE `alarms` `alarms` TEXT NULL DEFAULT NULL;
|
51
drivers/caldav/SQL/postgres.initial.sql
Normal file
51
drivers/caldav/SQL/postgres.initial.sql
Normal file
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
* CalDAV Client
|
||||
*
|
||||
* @version @package_version@
|
||||
* @author Hugo Slabbert <hugo@slabnet.com>
|
||||
*
|
||||
* Copyright (C) 2014, Hugo Slabbert <hugo@slabnet.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
CREATE TYPE caldav_type AS ENUM ('vcal','vevent','vtodo','');
|
||||
|
||||
CREATE TABLE IF NOT EXISTS caldav_props (
|
||||
obj_id int NOT NULL,
|
||||
obj_type caldav_type NOT NULL,
|
||||
url varchar(255) NOT NULL,
|
||||
tag varchar(255) DEFAULT NULL,
|
||||
username varchar(255) DEFAULT NULL,
|
||||
pass varchar(1024) DEFAULT NULL,
|
||||
last_change timestamp without time zone DEFAULT now() NOT NULL,
|
||||
PRIMARY KEY (obj_id, obj_type)
|
||||
);
|
||||
|
||||
CREATE OR REPLACE FUNCTION upd_timestamp() RETURNS TRIGGER
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
NEW.last_change = CURRENT_TIMESTAMP;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$;
|
||||
|
||||
CREATE TRIGGER update_timestamp
|
||||
BEFORE INSERT OR UPDATE
|
||||
ON caldav_props
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE upd_timestamp();
|
||||
|
2036
drivers/caldav/caldav_driver.php
Normal file
2036
drivers/caldav/caldav_driver.php
Normal file
File diff suppressed because it is too large
Load diff
253
drivers/caldav/caldav_sync.php
Normal file
253
drivers/caldav/caldav_sync.php
Normal file
|
@ -0,0 +1,253 @@
|
|||
<?php
|
||||
/**
|
||||
* CalDAV sync for the Calendar plugin
|
||||
*
|
||||
* @version @package_version@
|
||||
* @author Daniel Morlock <daniel.morlock@awesome-it.de>
|
||||
*
|
||||
* Copyright (C) Awesome IT GbR <info@awesome-it.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
require_once (dirname(__FILE__).'/../../lib/caldav-client.php');
|
||||
|
||||
class caldav_sync
|
||||
{
|
||||
const ACTION_NONE = 1;
|
||||
const ACTION_UPDATE = 2;
|
||||
const ACTION_CREATE = 4;
|
||||
|
||||
private $cal_id = null;
|
||||
private $ctag = null;
|
||||
private $username = null;
|
||||
private $pass = null;
|
||||
private $url = null;
|
||||
|
||||
/**
|
||||
* Default constructor for calendar synchronization adapter.
|
||||
*
|
||||
* @param array Hash array with caldav properties at least the following:
|
||||
* id: Calendar ID
|
||||
* caldav_url: Caldav calendar URL.
|
||||
* caldav_user: Caldav http basic auth user.
|
||||
* caldav_pass: Password für caldav user.
|
||||
* caldav_tag: Caldav ctag for calendar.
|
||||
*/
|
||||
public function __construct($cal)
|
||||
{
|
||||
$this->cal_id = $cal["id"];
|
||||
$this->url = $cal["caldav_url"];
|
||||
$this->ctag = isset($cal["caldav_tag"]) ? $cal["caldav_tag"] : null;
|
||||
$this->username = isset($cal["caldav_user"]) ? $cal["caldav_user"] : null;
|
||||
$this->pass = isset($cal["caldav_pass"]) ? $cal["caldav_pass"] : null;
|
||||
|
||||
$this->caldav = new caldav_client($this->url, $this->username, $this->pass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for current calendar ctag.
|
||||
* @return string
|
||||
*/
|
||||
public function get_ctag()
|
||||
{
|
||||
return $this->ctag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether current calendar needs to be synced
|
||||
* regarding the CalDAV ctag.
|
||||
*
|
||||
* @return True if the current calendar ctag differs from the CalDAV tag which
|
||||
* indicates that there are changes that must be synched. Returns false
|
||||
* if the calendar is up to date, no sync necesarry.
|
||||
*/
|
||||
public function is_synced()
|
||||
{
|
||||
$is_synced = $this->ctag == $this->caldav->get_ctag() && $this->ctag;
|
||||
caldav_driver::debug_log("Ctag indicates that calendar \"$this->cal_id\" ".($is_synced ? "is synced." : "needs update!"));
|
||||
|
||||
return $is_synced;
|
||||
}
|
||||
|
||||
/**
|
||||
* Synchronizes given events with caldav server and returns updates.
|
||||
*
|
||||
* @param array List of hash arrays with event properties, must include "caldav_url" and "tag".
|
||||
* @return array Tuple containing the following lists:
|
||||
*
|
||||
* Caldav properties for events to be created or to be updated with the keys:
|
||||
* url: Event ical URL relative to calendar URL
|
||||
* etag: Remote etag of the event
|
||||
* local_event: The local event in case of an update.
|
||||
* remote_event: The current event retrieved from caldav server.
|
||||
*
|
||||
* A list of event ids that are in sync.
|
||||
*/
|
||||
public function get_updates($events)
|
||||
{
|
||||
$ctag = $this->caldav->get_ctag();
|
||||
|
||||
if($ctag)
|
||||
{
|
||||
$this->ctag = $ctag;
|
||||
$etags = $this->caldav->get_etags();
|
||||
|
||||
list($updates, $synced_event_ids) = $this->_get_event_updates($events, $etags);
|
||||
return array($this->_get_event_data($updates), $synced_event_ids);
|
||||
}
|
||||
else
|
||||
{
|
||||
caldav_driver::debug_log("Unkown error while fetching calendar ctag for calendar \"$this->cal_id\"!");
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines sync status and requried updates for the given events using given list of etags.
|
||||
*
|
||||
* @param array List of hash arrays with event properties, must include "caldav_url" and "caldav_tag".
|
||||
* @param array List of current remote etags.
|
||||
* @return array Tuple containing the following lists:
|
||||
*
|
||||
* Caldav properties for events to be created or to be updated with the keys:
|
||||
* url: Event ical URL relative to calendar URL
|
||||
* etag: Remote etag of the event
|
||||
* local_event: The local event in case of an update.
|
||||
*
|
||||
* A list of event ids that are in sync.
|
||||
*/
|
||||
private function _get_event_updates($events, $etags)
|
||||
{
|
||||
$updates = array();
|
||||
$in_sync = array();
|
||||
|
||||
foreach ($etags as $etag)
|
||||
{
|
||||
$url = $etag["url"];
|
||||
$etag = $etag["etag"];
|
||||
$event_found = false;
|
||||
foreach($events as $event)
|
||||
{
|
||||
if ($event["caldav_url"] == $url)
|
||||
{
|
||||
$event_found = true;
|
||||
|
||||
if ($event["caldav_tag"] != $etag)
|
||||
{
|
||||
caldav_driver::debug_log("Event ".$event["uid"]." needs update.");
|
||||
|
||||
array_push($updates, array(
|
||||
"local_event" => $event,
|
||||
"etag" => $etag,
|
||||
"url" => $url
|
||||
));
|
||||
}
|
||||
else
|
||||
{
|
||||
array_push($in_sync, $event["id"]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$event_found)
|
||||
{
|
||||
caldav_driver::debug_log("Found new event ".$url);
|
||||
|
||||
array_push($updates, array(
|
||||
"url" => $url,
|
||||
"etag" => $etag
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
return array($updates, $in_sync);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches event data and attaches it to the given update properties.
|
||||
*
|
||||
* @param $updates List of update properties.
|
||||
* @return array List of update properties with additional key "remote_event" containing the current caldav event.
|
||||
*/
|
||||
private function _get_event_data($updates)
|
||||
{
|
||||
$urls = array();
|
||||
|
||||
foreach ($updates as $update)
|
||||
{
|
||||
array_push($urls, $update["url"]);
|
||||
}
|
||||
|
||||
$events = $this->caldav->get_events($urls);
|
||||
foreach($updates as &$update)
|
||||
{
|
||||
// Attach remote events to the appropriate updates.
|
||||
// Note that this assumes unique event URL's!
|
||||
$url = $update["url"];
|
||||
if($events[$url]) {
|
||||
$update["remote_event"] = $events[$url];
|
||||
$update["remote_event"]["calendar"] = $this->cal_id;
|
||||
}
|
||||
}
|
||||
|
||||
return $updates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the given event on the CalDAV server.
|
||||
*
|
||||
* @param array Hash array with event properties.
|
||||
* @return Event with updated "caldav_url" and "caldav_tag" attributes, false on error.
|
||||
*/
|
||||
public function create_event($event)
|
||||
{
|
||||
$props = array(
|
||||
"caldav_url" => parse_url($this->url, PHP_URL_PATH)."/".$event["uid"].".ics",
|
||||
"caldav_tag" => null
|
||||
);
|
||||
|
||||
caldav_driver::debug_log("Push new event to url ".$props["caldav_url"]);
|
||||
$result = $this->caldav->put_event($props["caldav_url"], $event);
|
||||
|
||||
if($result == false || $result < 0) return false;
|
||||
return array_merge($event, $props);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the given event on the CalDAV server.
|
||||
*
|
||||
* @param array Hash array with event properties to update, must include "uid", "caldav_url" and "caldav_tag".
|
||||
* @return True on success, false on error, -1 if the given event/etag is not up to date.
|
||||
*/
|
||||
public function update_event($event)
|
||||
{
|
||||
caldav_driver::debug_log("Updating event uid \"".$event["uid"]."\".");
|
||||
return $this->caldav->put_event($event["caldav_url"], $event, $event["caldav_tag"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the given event from the caldav server.
|
||||
*
|
||||
* @param array Hash array with events properties, must include "caldav_url".
|
||||
* @return True on success, false on error.
|
||||
*/
|
||||
public function remove_event($event)
|
||||
{
|
||||
caldav_driver::debug_log("Removing event uid \"".$event["uid"]."\".");
|
||||
return $this->caldav->remove_event($event["caldav_url"]);
|
||||
}
|
||||
};
|
||||
?>
|
Loading…
Reference in a new issue