0012514: CalDAV - add synctoken support to Inbox
authorPaul Mehrer <p.mehrer@metaways.de>
Fri, 6 Jan 2017 11:27:37 +0000 (12:27 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Mon, 16 Jan 2017 12:27:47 +0000 (13:27 +0100)
the dummy inbox gets a dummy synctoken
and a static ctag by the way

Change-Id: Id9d9f293c18e9a3331743686016c5f8a233a8b26
Reviewed-on: http://gerrit.tine20.com/customers/4052
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
tine20/Calendar/Frontend/CalDAV/ScheduleInbox.php
tine20/Tinebase/Container.php
tine20/Tinebase/WebDav/Container/Abstract.php

index 0de2ca3..0d9ccc7 100644 (file)
@@ -159,7 +159,8 @@ class Calendar_Frontend_CalDAV_ScheduleInbox extends \Sabre\DAV\Collection imple
     public function getProperties($requestedProperties)
     {
         $properties = array(
-            '{http://calendarserver.org/ns/}getctag' => round(time()/60),
+            // static ctag as this inbox implementation actually does nothing, it is a dummy
+            '{http://calendarserver.org/ns/}getctag' => 'samesame',
             'id'                => 'schedule-inbox',
             'uri'               => 'schedule-inbox',
             '{DAV:}resource-id'    => 'urn:uuid:schedule-inbox',
@@ -167,6 +168,8 @@ class Calendar_Frontend_CalDAV_ScheduleInbox extends \Sabre\DAV\Collection imple
             #'principaluri'      => $principalUri,
             '{DAV:}displayname' => 'Schedule Inbox',
             '{http://apple.com/ns/ical/}calendar-color' => '#666666',
+            // static sync-token, only -1 works!
+            '{DAV:}sync-token'  => Tinebase_WebDav_Plugin_SyncToken::SYNCTOKEN_PREFIX . '-1',
             
             '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new \Sabre\CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT')),
             '{' . \Sabre\CalDAV\Plugin::NS_CALDAV . '}supported-calendar-data'          => new \Sabre\CalDAV\Property\SupportedCalendarData(),
@@ -314,4 +317,30 @@ class Calendar_Frontend_CalDAV_ScheduleInbox extends \Sabre\DAV\Collection imple
     {
         return null;
     }
+
+    /**
+     * indicates whether the concrete class supports sync-token
+     *
+     * @return bool
+     */
+    public function supportsSyncToken()
+    {
+        return true;
+    }
+
+    /**
+     * returns the changes happened since the provided syncToken which is the content sequence
+     *
+     * @param string $syncToken
+     * @return array
+     */
+    public function getChanges($syncToken)
+    {
+        return array(
+            'syncToken' => '-1',
+            Tinebase_Model_ContainerContent::ACTION_CREATE => array(),
+            Tinebase_Model_ContainerContent::ACTION_UPDATE => array(),
+            Tinebase_Model_ContainerContent::ACTION_DELETE => array(),
+        );
+    }
 }
index adb3986..73e383b 100644 (file)
@@ -1735,11 +1735,15 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract implements Tineba
     }
     
     /**
-     * get content history since given content_seq 
+     * get content history since given content_seq
+     *
+     * returns null if the lastContentSeq was not found in DB and was not -1 or 0
+     * -1 is used when paging or for inbox which actually doesnt have a sync token
+     * 0 is the initial container content_seq, thus the initial sync token for an empty container
      * 
      * @param integer|Tinebase_Model_Container $containerId
      * @param integer $lastContentSeq
-     * @return Tinebase_Record_RecordSet
+     * @return Tinebase_Record_RecordSet|null
      */
     public function getContentHistory($containerId, $lastContentSeq = -1)
     {
@@ -1751,7 +1755,7 @@ class Tinebase_Container extends Tinebase_Backend_Sql_Abstract implements Tineba
             'sort' => 'content_seq'
         ));
         $result = $this->getContentBackend()->search($filter, $pagination);
-        if ($lastContentSeq != -1) {
+        if ($lastContentSeq != -1 && $lastContentSeq != 0) {
             if ($result->count() === 0) {
                 return null;
             }
index 9bfe301..18a6dff 100644 (file)
@@ -548,7 +548,8 @@ abstract class Tinebase_WebDav_Container_Abstract extends \Sabre\DAV\Collection
      */
     public function getSyncToken()
     {
-       return Tinebase_Container::getInstance()->getContentSequence($this->_container);
+        // this only returns null if the container is not found or if container.content_seq = NULL, this does not look up the content history!
+        return Tinebase_Container::getInstance()->getContentSequence($this->_container);
     }
 
     /**
@@ -566,6 +567,11 @@ abstract class Tinebase_WebDav_Container_Abstract extends \Sabre\DAV\Collection
             Tinebase_Model_ContainerContent::ACTION_DELETE => array(),
         );
 
+        // if the sync token did not change, we don't mind anything and return. Probably clients never send such requests, but better save than sorry
+        if ($result['syncToken'] == $syncToken) {
+            return $result;
+        }
+
         $resultSet = Tinebase_Container::getInstance()->getContentHistory($this->_container, $syncToken);
         if (null === $resultSet) {
             return null;