xref: /plugin/davcal/helper.php (revision b269830cf3e89c42b8ecae39a10754fa0b08d2ca)
1a1a3b679SAndreas Boehler<?php
2a1a3b679SAndreas Boehler/**
3a1a3b679SAndreas Boehler  * Helper Class for the tagrevisions plugin
4a1a3b679SAndreas Boehler  * This helper does the actual work.
5a1a3b679SAndreas Boehler  *
6a1a3b679SAndreas Boehler  * Configurable in DokuWiki's configuration
7a1a3b679SAndreas Boehler  */
8a1a3b679SAndreas Boehler
9a1a3b679SAndreas Boehler// must be run within Dokuwiki
10a1a3b679SAndreas Boehlerif(!defined('DOKU_INC')) die();
11a1a3b679SAndreas Boehler
12a1a3b679SAndreas Boehlerclass helper_plugin_davcal extends DokuWiki_Plugin {
13a1a3b679SAndreas Boehler
14a1a3b679SAndreas Boehler  protected $sqlite = null;
15a1a3b679SAndreas Boehler
16a1a3b679SAndreas Boehler  /**
17a1a3b679SAndreas Boehler    * Constructor to load the configuration
18a1a3b679SAndreas Boehler    */
19a1a3b679SAndreas Boehler  public function helper_plugin_davcal() {
20a1a3b679SAndreas Boehler    $this->sqlite =& plugin_load('helper', 'sqlite');
21a1a3b679SAndreas Boehler    if(!$this->sqlite)
22a1a3b679SAndreas Boehler    {
23a1a3b679SAndreas Boehler        msg('This plugin requires the sqlite plugin. Please install it.');
24a1a3b679SAndreas Boehler        return;
25a1a3b679SAndreas Boehler    }
26a1a3b679SAndreas Boehler
27a1a3b679SAndreas Boehler    if(!$this->sqlite->init('davcal', DOKU_PLUGIN.'davcal/db/'))
28a1a3b679SAndreas Boehler    {
29a1a3b679SAndreas Boehler        return;
30a1a3b679SAndreas Boehler    }
31a1a3b679SAndreas Boehler  }
32a1a3b679SAndreas Boehler
33a1a3b679SAndreas Boehler  public function setCalendarNameForPage($name, $description, $id = null, $userid = null)
34a1a3b679SAndreas Boehler  {
35a1a3b679SAndreas Boehler      if(is_null($id))
36a1a3b679SAndreas Boehler      {
37a1a3b679SAndreas Boehler          global $ID;
38a1a3b679SAndreas Boehler          $id = $ID;
39a1a3b679SAndreas Boehler      }
40a1a3b679SAndreas Boehler      if(is_null($userid))
41a1a3b679SAndreas Boehler        $userid = $_SERVER['REMOTE_USER'];
42a1a3b679SAndreas Boehler      $calid = $this->getCalendarIdForPage($id);
43a1a3b679SAndreas Boehler      if($calid === false)
44a1a3b679SAndreas Boehler        return $this->createCalendarForPage($name, $description, $id, $userid);
45a1a3b679SAndreas Boehler
46*b269830cSAndreas Boehler      $query = "UPDATE calendars SET displayname=".$this->sqlite->quote_string($name).", ".
47*b269830cSAndreas Boehler               "description=".$this->sqlite->quote_string($description)." WHERE ".
48*b269830cSAndreas Boehler               "id=".$this->sqlite->quote_string($calid);
49*b269830cSAndreas Boehler      $res = $this->sqlite->query($query);
50*b269830cSAndreas Boehler      if($res !== false)
51*b269830cSAndreas Boehler        return true;
52*b269830cSAndreas Boehler      return false;
53a1a3b679SAndreas Boehler  }
54a1a3b679SAndreas Boehler
55a495d34cSAndreas Boehler  public function savePersonalSettings($settings, $userid = null)
56a495d34cSAndreas Boehler  {
57a495d34cSAndreas Boehler      if(is_null($userid))
58a495d34cSAndreas Boehler          $userid = $_SERVER['REMOTE_USER'];
59a495d34cSAndreas Boehler      $this->sqlite->query("BEGIN TRANSACTION");
60a495d34cSAndreas Boehler
61bd883736SAndreas Boehler      $query = "DELETE FROM calendarsettings WHERE userid=".$this->sqlite->quote_string($userid);
62bd883736SAndreas Boehler      $this->sqlite->query($query);
63bd883736SAndreas Boehler
64a495d34cSAndreas Boehler      foreach($settings as $key => $value)
65a495d34cSAndreas Boehler      {
66bd883736SAndreas Boehler          $query = "INSERT INTO calendarsettings (userid, key, value) VALUES (".
67a495d34cSAndreas Boehler                   $this->sqlite->quote_string($userid).", ".
68a495d34cSAndreas Boehler                   $this->sqlite->quote_string($key).", ".
69a495d34cSAndreas Boehler                   $this->sqlite->quote_string($value).")";
70a495d34cSAndreas Boehler          $res = $this->sqlite->query($query);
71a495d34cSAndreas Boehler          if($res === false)
72a495d34cSAndreas Boehler              return false;
73a495d34cSAndreas Boehler      }
74a495d34cSAndreas Boehler      $this->sqlite->query("COMMIT TRANSACTION");
75a495d34cSAndreas Boehler      return true;
76a495d34cSAndreas Boehler  }
77a495d34cSAndreas Boehler
78a495d34cSAndreas Boehler  public function getPersonalSettings($userid = null)
79a495d34cSAndreas Boehler  {
80a495d34cSAndreas Boehler      if(is_null($userid))
81a495d34cSAndreas Boehler        $userid = $_SERVER['REMOTE_USER'];
82bd883736SAndreas Boehler      // Some sane default settings
83bd883736SAndreas Boehler      $settings = array(
84bd883736SAndreas Boehler        'timezone' => 'local',
85bd883736SAndreas Boehler        'weeknumbers' => '0',
86bd883736SAndreas Boehler        'workweek' => '0'
87bd883736SAndreas Boehler      );
88a495d34cSAndreas Boehler      $query = "SELECT key, value FROM calendarsettings WHERE userid=".$this->sqlite->quote_string($userid);
89a495d34cSAndreas Boehler      $res = $this->sqlite->query($query);
90a495d34cSAndreas Boehler      $arr = $this->sqlite->res2arr($res);
91a495d34cSAndreas Boehler      foreach($arr as $row)
92a495d34cSAndreas Boehler      {
93a495d34cSAndreas Boehler          $settings[$row['key']] = $row['value'];
94a495d34cSAndreas Boehler      }
95a495d34cSAndreas Boehler      return $settings;
96a495d34cSAndreas Boehler  }
97a495d34cSAndreas Boehler
98a1a3b679SAndreas Boehler  public function getCalendarIdForPage($id = null)
99a1a3b679SAndreas Boehler  {
100a1a3b679SAndreas Boehler      if(is_null($id))
101a1a3b679SAndreas Boehler      {
102a1a3b679SAndreas Boehler          global $ID;
103a1a3b679SAndreas Boehler          $id = $ID;
104a1a3b679SAndreas Boehler      }
105a1a3b679SAndreas Boehler
106a1a3b679SAndreas Boehler      $query = "SELECT calid FROM pagetocalendarmapping WHERE page=".$this->sqlite->quote_string($id);
107a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
108a1a3b679SAndreas Boehler      $row = $this->sqlite->res2row($res);
109a1a3b679SAndreas Boehler      if(isset($row['calid']))
110a1a3b679SAndreas Boehler        return $row['calid'];
111a1a3b679SAndreas Boehler      else
112a1a3b679SAndreas Boehler        return false;
113a1a3b679SAndreas Boehler  }
114a1a3b679SAndreas Boehler
115a1a3b679SAndreas Boehler  public function getCalendarIdToPageMapping()
116a1a3b679SAndreas Boehler  {
117a1a3b679SAndreas Boehler      $query = "SELECT calid, page FROM pagetocalendarmapping";
118a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
119a1a3b679SAndreas Boehler      $arr = $this->sqlite->res2arr($res);
120a1a3b679SAndreas Boehler      return $arr;
121a1a3b679SAndreas Boehler  }
122a1a3b679SAndreas Boehler
123a1a3b679SAndreas Boehler  public function getCalendarIdsForUser($principalUri)
124a1a3b679SAndreas Boehler  {
125a1a3b679SAndreas Boehler      $user = explode('/', $principalUri);
126a1a3b679SAndreas Boehler      $user = end($user);
127a1a3b679SAndreas Boehler      $mapping = $this->getCalendarIdToPageMapping();
128a1a3b679SAndreas Boehler      $calids = array();
129a1a3b679SAndreas Boehler      foreach($mapping as $row)
130a1a3b679SAndreas Boehler      {
131a1a3b679SAndreas Boehler          $id = $row['calid'];
132a1a3b679SAndreas Boehler          $page = $row['page'];
133a1a3b679SAndreas Boehler          $acl = auth_quickaclcheck($page);
134a1a3b679SAndreas Boehler          if($acl >= AUTH_READ)
135a1a3b679SAndreas Boehler          {
136a1a3b679SAndreas Boehler              $write = $acl > AUTH_READ;
137a1a3b679SAndreas Boehler              $calids[$id] = array('readonly' => !$write);
138a1a3b679SAndreas Boehler          }
139a1a3b679SAndreas Boehler      }
140a1a3b679SAndreas Boehler      return $calids;
141a1a3b679SAndreas Boehler  }
142a1a3b679SAndreas Boehler
143a1a3b679SAndreas Boehler  public function createCalendarForPage($name, $description, $id = null, $userid = null)
144a1a3b679SAndreas Boehler  {
145a1a3b679SAndreas Boehler      if(is_null($id))
146a1a3b679SAndreas Boehler      {
147a1a3b679SAndreas Boehler          global $ID;
148a1a3b679SAndreas Boehler          $id = $ID;
149a1a3b679SAndreas Boehler      }
150a1a3b679SAndreas Boehler      if(is_null($userid))
151a1a3b679SAndreas Boehler          $userid = $_SERVER['REMOTE_USER'];
152a1a3b679SAndreas Boehler      $values = array('principals/'.$userid,
153a1a3b679SAndreas Boehler                      $name,
154a1a3b679SAndreas Boehler                      str_replace(array('/', ' ', ':'), '_', $id),
155a1a3b679SAndreas Boehler                      $description,
156a1a3b679SAndreas Boehler                      'VEVENT,VTODO',
15755a741c0SAndreas Boehler                      0,
15855a741c0SAndreas Boehler                      1);
15955a741c0SAndreas Boehler      $query = "INSERT INTO calendars (principaluri, displayname, uri, description, components, transparent, synctoken) VALUES (".$this->sqlite->quote_and_join($values, ',').");";
160a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
16155a741c0SAndreas Boehler      if($res === false)
16255a741c0SAndreas Boehler        return false;
163a1a3b679SAndreas Boehler      $query = "SELECT id FROM calendars WHERE principaluri=".$this->sqlite->quote_string($values[0])." AND ".
164a1a3b679SAndreas Boehler               "displayname=".$this->sqlite->quote_string($values[1])." AND ".
165a1a3b679SAndreas Boehler               "uri=".$this->sqlite->quote_string($values[2])." AND ".
166a1a3b679SAndreas Boehler               "description=".$this->sqlite->quote_string($values[3]);
167a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
168a1a3b679SAndreas Boehler      $row = $this->sqlite->res2row($res);
169a1a3b679SAndreas Boehler      if(isset($row['id']))
170a1a3b679SAndreas Boehler      {
171a1a3b679SAndreas Boehler          $values = array($id, $row['id']);
172a1a3b679SAndreas Boehler          $query = "INSERT INTO pagetocalendarmapping (page, calid) VALUES (".$this->sqlite->quote_and_join($values, ',').")";
173a1a3b679SAndreas Boehler          $res = $this->sqlite->query($query);
17455a741c0SAndreas Boehler          return ($res !== false);
175a1a3b679SAndreas Boehler      }
176a1a3b679SAndreas Boehler
177a1a3b679SAndreas Boehler      return false;
178a1a3b679SAndreas Boehler  }
179a1a3b679SAndreas Boehler
180a1a3b679SAndreas Boehler  public function addCalendarEntryToCalendarForPage($id, $user, $params)
181a1a3b679SAndreas Boehler  {
182bd883736SAndreas Boehler      $settings = $this->getPersonalSettings($user);
183bd883736SAndreas Boehler      if($settings['timezone'] !== '' && $settings['timezone'] !== 'local')
184bd883736SAndreas Boehler          $timezone = new \DateTimeZone($settings['timezone']);
185bd883736SAndreas Boehler      else
186bd883736SAndreas Boehler          $timezone = new \DateTimeZone('UTC');
187*b269830cSAndreas Boehler      $startDate = explode('-', $params['eventfrom']);
188*b269830cSAndreas Boehler      $startTime = explode(':', $params['eventfromtime']);
189*b269830cSAndreas Boehler      $endDate = explode('-', $params['eventto']);
190*b269830cSAndreas Boehler      $endTime = explode(':', $params['eventtotime']);
191a1a3b679SAndreas Boehler      require_once('vendor/autoload.php');
192a1a3b679SAndreas Boehler      $vcalendar = new \Sabre\VObject\Component\VCalendar();
193a1a3b679SAndreas Boehler      $event = $vcalendar->add('VEVENT');
194*b269830cSAndreas Boehler      $uuid = \Sabre\VObject\UUIDUtil::getUUID();
195*b269830cSAndreas Boehler      $event->add('UID', $uuid);
196a1a3b679SAndreas Boehler      $event->summary = $params['eventname'];
197*b269830cSAndreas Boehler      $dtStamp = new \DateTime(null, new \DateTimeZone('UTC'));
198*b269830cSAndreas Boehler      $event->add('DTSTAMP', $dtStamp);
199*b269830cSAndreas Boehler      $event->add('CREATED', $dtStamp);
200*b269830cSAndreas Boehler      $event->add('LAST-MODIFIED', $dtStamp);
201*b269830cSAndreas Boehler      $dtStart = new \DateTime();
202*b269830cSAndreas Boehler      $dtStart->setDate(intval($startDate[0]), intval($startDate[1]), intval($startDate[2]));
203*b269830cSAndreas Boehler      if($params['allday'] != '1')
204*b269830cSAndreas Boehler        $dtStart->setTime(intval($startTime[0]), intval($startTime[1]), 0);
205*b269830cSAndreas Boehler      $dtStart->setTimezone($timezone);
206*b269830cSAndreas Boehler      $dtEnd = new \DateTime();
207*b269830cSAndreas Boehler      $dtEnd->setDate(intval($endDate[0]), intval($endDate[1]), intval($endDate[2]));
208*b269830cSAndreas Boehler      if($params['allday'] != '1')
209*b269830cSAndreas Boehler        $dtEnd->setTime(intval($endTime[0]), intval($endTime[1]), 0);
210*b269830cSAndreas Boehler      $dtEnd->setTimezone($timezone);
211*b269830cSAndreas Boehler      // According to the VCal spec, we need to add a whole day here
212*b269830cSAndreas Boehler      if($params['allday'] == '1')
213*b269830cSAndreas Boehler          $dtEnd->add(new \DateInterval('P1D'));
214*b269830cSAndreas Boehler      $dtStartEv = $event->add('DTSTART', $dtStart);
215*b269830cSAndreas Boehler      $dtEndEv = $event->add('DTEND', $dtEnd);
216*b269830cSAndreas Boehler      if($params['allday'] == '1')
217*b269830cSAndreas Boehler      {
218*b269830cSAndreas Boehler          $dtStartEv['VALUE'] = 'DATE';
219*b269830cSAndreas Boehler          $dtEndEv['VALUE'] = 'DATE';
220*b269830cSAndreas Boehler      }
221a1a3b679SAndreas Boehler      $calid = $this->getCalendarIdForPage($id);
222a1a3b679SAndreas Boehler      $uri = uniqid('dokuwiki-').'.ics';
223a1a3b679SAndreas Boehler      $now = new DateTime();
224a1a3b679SAndreas Boehler      $eventStr = $vcalendar->serialize();
225a1a3b679SAndreas Boehler
226a1a3b679SAndreas Boehler      $values = array($calid,
227a1a3b679SAndreas Boehler                      $uri,
228a1a3b679SAndreas Boehler                      $eventStr,
229a1a3b679SAndreas Boehler                      $now->getTimestamp(),
230a1a3b679SAndreas Boehler                      'VEVENT',
231a1a3b679SAndreas Boehler                      $event->DTSTART->getDateTime()->getTimeStamp(),
232a1a3b679SAndreas Boehler                      $event->DTEND->getDateTime()->getTimeStamp(),
233a1a3b679SAndreas Boehler                      strlen($eventStr),
234a1a3b679SAndreas Boehler                      md5($eventStr),
235a1a3b679SAndreas Boehler                      uniqid()
236a1a3b679SAndreas Boehler      );
237a1a3b679SAndreas Boehler
238a1a3b679SAndreas Boehler      $query = "INSERT INTO calendarobjects (calendarid, uri, calendardata, lastmodified, componenttype, firstoccurence, lastoccurence, size, etag, uid) VALUES (".$this->sqlite->quote_and_join($values, ',').")";
239a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
24055a741c0SAndreas Boehler      if($res !== false)
24155a741c0SAndreas Boehler      {
24255a741c0SAndreas Boehler          $this->updateSyncTokenLog($calid, $uri, 'added');
243a1a3b679SAndreas Boehler          return true;
244a1a3b679SAndreas Boehler      }
24555a741c0SAndreas Boehler      return false;
24655a741c0SAndreas Boehler  }
247a1a3b679SAndreas Boehler
248*b269830cSAndreas Boehler  public function getCalendarSettings($calid)
249*b269830cSAndreas Boehler  {
250*b269830cSAndreas Boehler      $query = "SELECT principaluri, displayname, uri, description, components, transparent, synctoken FROM calendars WHERE id=".$this->sqlite->quote_string($calid);
251*b269830cSAndreas Boehler      $res = $this->sqlite->query($query);
252*b269830cSAndreas Boehler      $row = $this->sqlite->res2row($res);
253*b269830cSAndreas Boehler      return $row;
254*b269830cSAndreas Boehler  }
255*b269830cSAndreas Boehler
256a1a3b679SAndreas Boehler  public function getEventsWithinDateRange($id, $user, $startDate, $endDate)
257a1a3b679SAndreas Boehler  {
258bd883736SAndreas Boehler      $settings = $this->getPersonalSettings($user);
259bd883736SAndreas Boehler      if($settings['timezone'] !== '' && $settings['timezone'] !== 'local')
260bd883736SAndreas Boehler          $timezone = new \DateTimeZone($settings['timezone']);
261bd883736SAndreas Boehler      else
262bd883736SAndreas Boehler          $timezone = new \DateTimeZone('UTC');
263a1a3b679SAndreas Boehler      $data = array();
264a1a3b679SAndreas Boehler      require_once('vendor/autoload.php');
265a1a3b679SAndreas Boehler      $calid = $this->getCalendarIdForPage($id);
266a1a3b679SAndreas Boehler      $startTs = new \DateTime($startDate);
267a1a3b679SAndreas Boehler      $endTs = new \DateTime($endDate);
268*b269830cSAndreas Boehler      $query = "SELECT calendardata, componenttype, uid FROM calendarobjects WHERE (calendarid=".
269a1a3b679SAndreas Boehler                $this->sqlite->quote_string($calid)." AND firstoccurence > ".
270a1a3b679SAndreas Boehler                $this->sqlite->quote_string($startTs->getTimestamp())." AND firstoccurence < ".
271*b269830cSAndreas Boehler                $this->sqlite->quote_string($endTs->getTimestamp()).") OR (calendarid=".
272*b269830cSAndreas Boehler                $this->sqlite->quote_string($calid)." AND lastoccurence > ".
273*b269830cSAndreas Boehler                $this->sqlite->quote_string($startTs->getTimestamp())." AND lastoccurence < ".
274*b269830cSAndreas Boehler                $this->sqlite->quote_string($endTs->getTimestamp()).")";
275a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
276a1a3b679SAndreas Boehler      $arr = $this->sqlite->res2arr($res);
277a1a3b679SAndreas Boehler      foreach($arr as $row)
278a1a3b679SAndreas Boehler      {
279a1a3b679SAndreas Boehler          if(isset($row['calendardata']))
280a1a3b679SAndreas Boehler          {
281*b269830cSAndreas Boehler              $entry = array();
282a1a3b679SAndreas Boehler              $vcal = \Sabre\VObject\Reader::read($row['calendardata']);
283*b269830cSAndreas Boehler              $start = $vcal->VEVENT->DTSTART;
284*b269830cSAndreas Boehler              if($start !== null)
285*b269830cSAndreas Boehler              {
286*b269830cSAndreas Boehler                $dtStart = $start->getDateTime();
287*b269830cSAndreas Boehler                $dtStart->setTimezone($timezone);
288*b269830cSAndreas Boehler                $entry['start'] = $dtStart->format(\DateTime::ATOM);
289*b269830cSAndreas Boehler                if($start['VALUE'] == 'DATE')
290*b269830cSAndreas Boehler                  $entry['allDay'] = true;
291*b269830cSAndreas Boehler                else
292*b269830cSAndreas Boehler                  $entry['allDay'] = false;
293*b269830cSAndreas Boehler              }
294*b269830cSAndreas Boehler              $end = $vcal->VEVENT->DTEND;
295*b269830cSAndreas Boehler              if($end !== null)
296*b269830cSAndreas Boehler              {
297*b269830cSAndreas Boehler                $dtEnd = $end->getDateTime();
298*b269830cSAndreas Boehler                $dtEnd->setTimezone($timezone);
299*b269830cSAndreas Boehler                // Subtract the plus one day that was added earlier
300*b269830cSAndreas Boehler                //if($entry['allDay'] === true)
301*b269830cSAndreas Boehler                //  $dtEnd->sub(new \DateInterval('P1D'));
302*b269830cSAndreas Boehler                $entry['end'] = $dtEnd->format(\DateTime::ATOM);
303*b269830cSAndreas Boehler              }
304*b269830cSAndreas Boehler              $entry['title'] = (string)$vcal->VEVENT->summary;
305*b269830cSAndreas Boehler              $entry['id'] = $row['uid'];
306*b269830cSAndreas Boehler              $data[] = $entry;
307a1a3b679SAndreas Boehler          }
308a1a3b679SAndreas Boehler      }
309a1a3b679SAndreas Boehler      return $data;
310a1a3b679SAndreas Boehler  }
311a1a3b679SAndreas Boehler
312a1a3b679SAndreas Boehler  public function getEventWithUid($uid)
313a1a3b679SAndreas Boehler  {
31455a741c0SAndreas Boehler      $query = "SELECT calendardata, calendarid, componenttype, uri FROM calendarobjects WHERE uid=".
315a1a3b679SAndreas Boehler                $this->sqlite->quote_string($uid);
316a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
317a1a3b679SAndreas Boehler      $row = $this->sqlite->res2row($res);
318a1a3b679SAndreas Boehler      return $row;
319a1a3b679SAndreas Boehler  }
320a1a3b679SAndreas Boehler
321a1a3b679SAndreas Boehler  public function editCalendarEntryForPage($id, $user, $params)
322a1a3b679SAndreas Boehler  {
323bd883736SAndreas Boehler      $settings = $this->getPersonalSettings($user);
324bd883736SAndreas Boehler      if($settings['timezone'] !== '' && $settings['timezone'] !== 'local')
325bd883736SAndreas Boehler          $timezone = new \DateTimeZone($settings['timezone']);
326bd883736SAndreas Boehler      else
327bd883736SAndreas Boehler          $timezone = new \DateTimeZone('UTC');
328*b269830cSAndreas Boehler      $startDate = explode('-', $params['eventfrom']);
329*b269830cSAndreas Boehler      $startTime = explode(':', $params['eventfromtime']);
330*b269830cSAndreas Boehler      $endDate = explode('-', $params['eventto']);
331*b269830cSAndreas Boehler      $endTime = explode(':', $params['eventtotime']);
33255a741c0SAndreas Boehler      $uid = $params['uid'];
33355a741c0SAndreas Boehler      $event = $this->getEventWithUid($uid);
334a1a3b679SAndreas Boehler      require_once('vendor/autoload.php');
335a1a3b679SAndreas Boehler      if(!isset($event['calendardata']))
336a1a3b679SAndreas Boehler        return false;
33755a741c0SAndreas Boehler      $uri = $event['uri'];
33855a741c0SAndreas Boehler      $calid = $event['calendarid'];
339a1a3b679SAndreas Boehler      $vcal = \Sabre\VObject\Reader::read($event['calendardata']);
340*b269830cSAndreas Boehler      $vevent = $vcal->VEVENT;
341*b269830cSAndreas Boehler      $vevent->summary = $params['eventname'];
342*b269830cSAndreas Boehler      $dtStamp = new \DateTime(null, new \DateTimeZone('UTC'));
343*b269830cSAndreas Boehler      $vevent->remove('DTSTAMP');
344*b269830cSAndreas Boehler      $vevent->remove('LAST-MODIFIED');
345*b269830cSAndreas Boehler      $vevent->add('DTSTAMP', $dtStamp);
346*b269830cSAndreas Boehler      $vevent->add('LAST-MODIFIED', $dtStamp);
347*b269830cSAndreas Boehler      $dtStart = new \DateTime();
348*b269830cSAndreas Boehler      $dtStart->setDate(intval($startDate[0]), intval($startDate[1]), intval($startDate[2]));
349*b269830cSAndreas Boehler      if($params['allday'] != '1')
350*b269830cSAndreas Boehler        $dtStart->setTime(intval($startTime[0]), intval($startTime[1]), 0);
351*b269830cSAndreas Boehler      $dtStart->setTimezone($timezone);
352*b269830cSAndreas Boehler      $dtEnd = new \DateTime();
353*b269830cSAndreas Boehler      $dtEnd->setDate(intval($endDate[0]), intval($endDate[1]), intval($endDate[2]));
354*b269830cSAndreas Boehler      if($params['allday'] != '1')
355*b269830cSAndreas Boehler        $dtEnd->setTime(intval($endTime[0]), intval($endTime[1]), 0);
356*b269830cSAndreas Boehler      $dtEnd->setTimezone($timezone);
357*b269830cSAndreas Boehler      // According to the VCal spec, we need to add a whole day here
358*b269830cSAndreas Boehler      if($params['allday'] == '1')
359*b269830cSAndreas Boehler          $dtEnd->add(new \DateInterval('P1D'));
360*b269830cSAndreas Boehler      $vevent->remove('DTSTART');
361*b269830cSAndreas Boehler      $vevent->remove('DTEND');
362*b269830cSAndreas Boehler      $dtStartEv = $vevent->add('DTSTART', $dtStart);
363*b269830cSAndreas Boehler      $dtEndEv = $vevent->add('DTEND', $dtEnd);
364*b269830cSAndreas Boehler      if($params['allday'] == '1')
365*b269830cSAndreas Boehler      {
366*b269830cSAndreas Boehler          $dtStartEv['VALUE'] = 'DATE';
367*b269830cSAndreas Boehler          $dtEndEv['VALUE'] = 'DATE';
368*b269830cSAndreas Boehler      }
369a1a3b679SAndreas Boehler      $now = new DateTime();
370a1a3b679SAndreas Boehler      $eventStr = $vcal->serialize();
371a1a3b679SAndreas Boehler
372a1a3b679SAndreas Boehler      $query = "UPDATE calendarobjects SET calendardata=".$this->sqlite->quote_string($eventStr).
373a1a3b679SAndreas Boehler               ", lastmodified=".$this->sqlite->quote_string($now->getTimestamp()).
374a1a3b679SAndreas Boehler               ", firstoccurence=".$this->sqlite->quote_string($dtStart->getTimestamp()).
375a1a3b679SAndreas Boehler               ", lastoccurence=".$this->sqlite->quote_string($dtEnd->getTimestamp()).
376a1a3b679SAndreas Boehler               ", size=".strlen($eventStr).
377a1a3b679SAndreas Boehler               ", etag=".$this->sqlite->quote_string(md5($eventStr)).
37855a741c0SAndreas Boehler               " WHERE uid=".$this->sqlite->quote_string($uid);
379a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
38055a741c0SAndreas Boehler      if($res !== false)
38155a741c0SAndreas Boehler      {
38255a741c0SAndreas Boehler          $this->updateSyncTokenLog($calid, $uri, 'modified');
383a1a3b679SAndreas Boehler          return true;
384a1a3b679SAndreas Boehler      }
38555a741c0SAndreas Boehler      return false;
38655a741c0SAndreas Boehler  }
387a1a3b679SAndreas Boehler
388a1a3b679SAndreas Boehler  public function deleteCalendarEntryForPage($id, $params)
389a1a3b679SAndreas Boehler  {
390a1a3b679SAndreas Boehler      $uid = $params['uid'];
39155a741c0SAndreas Boehler      $event = $this->getEventWithUid($uid);
3922c14b82bSAndreas Boehler      $calid = $event['calendarid'];
39355a741c0SAndreas Boehler      $uri = $event['uri'];
394a1a3b679SAndreas Boehler      $query = "DELETE FROM calendarobjects WHERE uid=".$this->sqlite->quote_string($uid);
395a1a3b679SAndreas Boehler      $res = $this->sqlite->query($query);
39655a741c0SAndreas Boehler      if($res !== false)
39755a741c0SAndreas Boehler      {
39855a741c0SAndreas Boehler          $this->updateSyncTokenLog($calid, $uri, 'deleted');
39955a741c0SAndreas Boehler      }
400a1a3b679SAndreas Boehler      return true;
401a1a3b679SAndreas Boehler  }
402a1a3b679SAndreas Boehler
40355a741c0SAndreas Boehler  public function getSyncTokenForCalendar($calid)
40455a741c0SAndreas Boehler  {
405*b269830cSAndreas Boehler      $row = $this->getCalendarSettings($calid);
40655a741c0SAndreas Boehler      if(isset($row['synctoken']))
40755a741c0SAndreas Boehler          return $row['synctoken'];
40855a741c0SAndreas Boehler      return false;
40955a741c0SAndreas Boehler  }
41055a741c0SAndreas Boehler
41155a741c0SAndreas Boehler  public function operationNameToOperation($operationName)
41255a741c0SAndreas Boehler  {
41355a741c0SAndreas Boehler      switch($operationName)
41455a741c0SAndreas Boehler      {
41555a741c0SAndreas Boehler          case 'added':
41655a741c0SAndreas Boehler              return 1;
41755a741c0SAndreas Boehler          break;
41855a741c0SAndreas Boehler          case 'modified':
41955a741c0SAndreas Boehler              return 2;
42055a741c0SAndreas Boehler          break;
42155a741c0SAndreas Boehler          case 'deleted':
42255a741c0SAndreas Boehler              return 3;
42355a741c0SAndreas Boehler          break;
42455a741c0SAndreas Boehler      }
42555a741c0SAndreas Boehler      return false;
42655a741c0SAndreas Boehler  }
42755a741c0SAndreas Boehler
42855a741c0SAndreas Boehler  private function updateSyncTokenLog($calid, $uri, $operation)
42955a741c0SAndreas Boehler  {
43055a741c0SAndreas Boehler      $currentToken = $this->getSyncTokenForCalendar($calid);
43155a741c0SAndreas Boehler      $operationCode = $this->operationNameToOperation($operation);
43255a741c0SAndreas Boehler      if(($operationCode === false) || ($currentToken === false))
43355a741c0SAndreas Boehler          return false;
43455a741c0SAndreas Boehler      $values = array($uri,
43555a741c0SAndreas Boehler                      $currentToken,
43655a741c0SAndreas Boehler                      $calid,
43755a741c0SAndreas Boehler                      $operationCode
43855a741c0SAndreas Boehler      );
43955a741c0SAndreas Boehler      $query = "INSERT INTO calendarchanges (uri, synctoken, calendarid, operation) VALUES(".
44055a741c0SAndreas Boehler               $this->sqlite->quote_and_join($values, ',').")";
44155a741c0SAndreas Boehler      $res = $this->sqlite->query($query);
44255a741c0SAndreas Boehler      if($res === false)
44355a741c0SAndreas Boehler        return false;
44455a741c0SAndreas Boehler      $currentToken++;
44555a741c0SAndreas Boehler      $query = "UPDATE calendars SET synctoken=".$this->sqlite->quote_string($currentToken)." WHERE id=".
44655a741c0SAndreas Boehler               $this->sqlite->quote_string($calid);
44755a741c0SAndreas Boehler      $res = $this->sqlite->query($query);
44855a741c0SAndreas Boehler      return ($res !== false);
44955a741c0SAndreas Boehler  }
45055a741c0SAndreas Boehler
451*b269830cSAndreas Boehler  public function getSyncUrlForPage($id, $user = null)
452*b269830cSAndreas Boehler  {
453*b269830cSAndreas Boehler      if(is_null($user))
454*b269830cSAndreas Boehler        $user = $_SERVER['REMOTE_USER'];
455*b269830cSAndreas Boehler
456*b269830cSAndreas Boehler      $calid = $this->getCalendarIdForPage($id);
457*b269830cSAndreas Boehler      if($calid === false)
458*b269830cSAndreas Boehler        return false;
459*b269830cSAndreas Boehler
460*b269830cSAndreas Boehler      $calsettings = $this->getCalendarSettings($calid);
461*b269830cSAndreas Boehler      if(!isset($calsettings['uri']))
462*b269830cSAndreas Boehler        return false;
463*b269830cSAndreas Boehler
464*b269830cSAndreas Boehler      $syncurl = DOKU_URL.'lib/plugins/davcal/calendarserver.php/calendars/'.$user.'/'.$calsettings['uri'];
465*b269830cSAndreas Boehler      return $syncurl;
466*b269830cSAndreas Boehler  }
467*b269830cSAndreas Boehler
468a1a3b679SAndreas Boehler}
469