diff options
author | Jakob Sack <kde@jakobsack.de> | 2011-08-22 16:59:16 +0200 |
---|---|---|
committer | Jakob Sack <kde@jakobsack.de> | 2011-08-22 16:59:16 +0200 |
commit | fbb63f11e44e14874702808355decb5347c52b95 (patch) | |
tree | 96a7674d681e4f108eda9d36d6e270ea524d59e8 /apps/calendar/lib | |
parent | 09c8cd17cca16e7ca9fa9d556ad8cc017cea3f44 (diff) | |
download | nextcloud-server-fbb63f11e44e14874702808355decb5347c52b95.tar.gz nextcloud-server-fbb63f11e44e14874702808355decb5347c52b95.zip |
Some more work on CalDAV integration
Diffstat (limited to 'apps/calendar/lib')
-rw-r--r-- | apps/calendar/lib/PDO.php | 352 | ||||
-rw-r--r-- | apps/calendar/lib/calendar.php | 102 | ||||
-rw-r--r-- | apps/calendar/lib/connector_sabre.php | 291 | ||||
-rw-r--r-- | apps/calendar/lib/hooks.php | 2 |
4 files changed, 348 insertions, 399 deletions
diff --git a/apps/calendar/lib/PDO.php b/apps/calendar/lib/PDO.php deleted file mode 100644 index d4c8520aa1f..00000000000 --- a/apps/calendar/lib/PDO.php +++ /dev/null @@ -1,352 +0,0 @@ -<?php - -/** - * PDO CalDAV backend - * - * This backend is used to store calendar-data in a PDO database, such as - * sqlite or MySQL - * - * @package Sabre - * @subpackage CalDAV - * @copyright Copyright (C) 2007-2011 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) - * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License - */ -class OC_Connector_Sabre_CalDAV extends Sabre_CalDAV_Backend_Abstract { - /** - * List of CalDAV properties, and how they map to database fieldnames - * - * Add your own properties by simply adding on to this array - * - * @var array - */ - public $propertyMap = array( - '{DAV:}displayname' => 'displayname', - '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', - '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', - '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', - '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', - ); - - /** - * Returns a list of calendars for a principal. - * - * Every project is an array with the following keys: - * * id, a unique id that will be used by other functions to modify the - * calendar. This can be the same as the uri or a database key. - * * uri, which the basename of the uri with which the calendar is - * accessed. - * * principalUri. The owner of the calendar. Almost always the same as - * principalUri passed to this method. - * - * Furthermore it can contain webdav properties in clark notation. A very - * common one is '{DAV:}displayname'. - * - * @param string $principalUri - * @return array - */ - public function getCalendarsForUser($principalUri) { - - $fields = array_values($this->propertyMap); - $fields[] = 'id'; - $fields[] = 'uri'; - $fields[] = 'ctag'; - $fields[] = 'components'; - $fields[] = 'principaluri'; - - // Making fields a comma-delimited list - $fields = implode(', ', $fields); - $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM `".$this->calendarTableName."` WHERE principaluri = ?"); - $stmt->execute(array($principalUri)); - - $calendars = array(); - while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { - - $components = explode(',',$row['components']); - - $calendar = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => $row['principaluri'], - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', - '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components), - ); - - - foreach($this->propertyMap as $xmlName=>$dbName) { - $calendar[$xmlName] = $row[$dbName]; - } - - $calendars[] = $calendar; - - } - - return $calendars; - - } - - /** - * Creates a new calendar for a principal. - * - * If the creation was a success, an id must be returned that can be used to reference - * this calendar in other methods, such as updateCalendar - * - * @param string $principalUri - * @param string $calendarUri - * @param array $properties - * @return mixed - */ - public function createCalendar($principalUri,$calendarUri, array $properties) { - - $fieldNames = array( - 'principaluri', - 'uri', - 'ctag', - ); - $values = array( - ':principaluri' => $principalUri, - ':uri' => $calendarUri, - ':ctag' => 1, - ); - - // Default value - $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; - $fieldNames[] = 'components'; - if (!isset($properties[$sccs])) { - $values[':components'] = 'VEVENT,VTODO'; - } else { - if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) { - throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet'); - } - $values[':components'] = implode(',',$properties[$sccs]->getValue()); - } - - foreach($this->propertyMap as $xmlName=>$dbName) { - if (isset($properties[$xmlName])) { - - $myValue = $properties[$xmlName]; - $values[':' . $dbName] = $properties[$xmlName]; - $fieldNames[] = $dbName; - } - } - - $stmt = $this->pdo->prepare("INSERT INTO `".$this->calendarTableName."` (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")"); - $stmt->execute($values); - - return $this->pdo->lastInsertId(); - - } - - /** - * Updates a calendars properties - * - * The properties array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existant property is always succesful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param string $calendarId - * @param array $properties - * @return bool|array - */ - public function updateCalendar($calendarId, array $properties) { - - $newValues = array(); - $result = array( - 200 => array(), // Ok - 403 => array(), // Forbidden - 424 => array(), // Failed Dependency - ); - - $hasError = false; - - foreach($properties as $propertyName=>$propertyValue) { - - // We don't know about this property. - if (!isset($this->propertyMap[$propertyName])) { - $hasError = true; - $result[403][$propertyName] = null; - unset($properties[$propertyName]); - continue; - } - - $fieldName = $this->propertyMap[$propertyName]; - $newValues[$fieldName] = $propertyValue; - - } - - // If there were any errors we need to fail the request - if ($hasError) { - // Properties has the remaining properties - foreach($properties as $propertyName=>$propertyValue) { - $result[424][$propertyName] = null; - } - - // Removing unused statuscodes for cleanliness - foreach($result as $status=>$properties) { - if (is_array($properties) && count($properties)===0) unset($result[$status]); - } - - return $result; - - } - - // Success - - // Now we're generating the sql query. - $valuesSql = array(); - foreach($newValues as $fieldName=>$value) { - $valuesSql[] = $fieldName . ' = ?'; - } - $valuesSql[] = 'ctag = ctag + 1'; - - $stmt = $this->pdo->prepare("UPDATE `" . $this->calendarTableName . "` SET " . implode(', ',$valuesSql) . " WHERE id = ?"); - $newValues['id'] = $calendarId; - $stmt->execute(array_values($newValues)); - - return true; - - } - - /** - * Delete a calendar and all it's objects - * - * @param string $calendarId - * @return void - */ - public function deleteCalendar($calendarId) { - - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarTableName.'` WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Returns all calendar objects within a calendar object. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calnedar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * @param string $calendarId - * @return array - */ - public function getCalendarObjects($calendarId) { - - $stmt = $this->pdo->prepare('SELECT * FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ?'); - $stmt->execute(array($calendarId)); - return $stmt->fetchAll(); - - } - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param string $calendarId - * @param string $objectUri - * @return array - */ - public function getCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('SELECT * FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId, $objectUri)); - return $stmt->fetch(); - - } - - /** - * Creates a new calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData) { - - $stmt = $this->pdo->prepare('INSERT INTO `'.$this->calendarObjectTableName.'` (calendarid, uri, calendardata, lastmodified) VALUES (?,?,?,?)'); - $stmt->execute(array($calendarId,$objectUri,$calendarData,time())); - $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarTableName.'` SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Updates an existing calendarobject, based on it's uri. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData) { - - $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarObjectTableName.'` SET calendardata = ?, lastmodified = ? WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarData,time(),$calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE `'.$this->calendarTableName.'` SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri) { - - $stmt = $this->pdo->prepare('DELETE FROM `'.$this->calendarObjectTableName.'` WHERE calendarid = ? AND uri = ?'); - $stmt->execute(array($calendarId,$objectUri)); - $stmt = $this->pdo->prepare('UPDATE `'. $this->calendarTableName .'` SET ctag = ctag + 1 WHERE id = ?'); - $stmt->execute(array($calendarId)); - - } - - -} diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php index b7f33b13965..1bd203151cf 100644 --- a/apps/calendar/lib/calendar.php +++ b/apps/calendar/lib/calendar.php @@ -1,6 +1,6 @@ <?php /** - * ownCloud - Addressbook + * ownCloud - Calendar * * @author Jakob Sack * @copyright 2011 Jakob Sack mail@jakobsack.de @@ -52,22 +52,22 @@ */ /** - * This class manages our addressbooks. + * This class manages our calendars */ class OC_Calendar_Calendar{ public static function allCalendars($uid){ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE userid = ?' ); $result = $stmt->execute(array($uid)); - $addressbooks = array(); + $calendars = array(); while( $row = $result->fetchRow()){ - $addressbooks[] = $row; + $calendars[] = $row; } - return $addressbooks; + return $calendars; } - public static function allCakendarsWherePrincipalURIIs($principaluri){ + public static function allCalendarsWherePrincipalURIIs($principaluri){ $uid = self::extractUserID($principaluri); return self::allCalendars($uid); } @@ -79,8 +79,8 @@ class OC_Calendar_Calendar{ return $result->fetchRow(); } - public static function addAddressbook($userid,$name,$description){ - $all = self::allAddressbooks($userid); + public static function addCalendar($userid,$name,$description,$components='VEVENT,VTODO',$timezone=null,$order=0,$color=null){ + $all = self::allCalendars($userid); $uris = array(); foreach($all as $i){ $uris[] = $i['uri']; @@ -88,34 +88,35 @@ class OC_Calendar_Calendar{ $uri = self::createURI($name, $uris ); - $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,description,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?,?)' ); + $result = $stmt->execute(array($userid,$name,$uri,1,$description,$order,$color,$timezone,$components)); return OC_DB::insertid(); } - public static function addAddressbookFromDAVData($principaluri,$uri,$name,$description){ + public static function addCalendarFromDAVData($principaluri,$uri,$name,$description,$components,$timezone,$order,$color){ $userid = self::extractUserID($principaluri); - $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,description,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?,?)' ); + $result = $stmt->execute(array($userid,$name,$uri,1,$description,$order,$color,$timezone,$components)); return OC_DB::insertid(); } - public static function editAddressbook($id,$name,$description){ + public static function editCalendar($id,$name=null,$description=null,$components=null,$timezone=null,$order=null,$color=null){ // Need these ones for checking uri - $addressbook = self::find($id); - - if(is_null($name)){ - $name = $addressbook['name']; - } - if(is_null($description)){ - $description = $addressbook['description']; - } + $calendar = self::find($id); + + // Keep old stuff + if(is_null($name)) $name = $calendar['name']; + if(is_null($description)) $description = $calendar['description']; + if(is_null($components)) $components = $calendar['components']; + if(is_null($timezone)) $timezone = $calendar['timezone']; + if(is_null($order)) $order = $calendar['order']; + if(is_null($color)) $color = $calendar['color']; - $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET displayname=?,description=?, ctag=ctag+1 WHERE id=?' ); - $result = $stmt->execute(array($name,$description,$id)); + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET displayname=?,description=?,calendarorder=?,calendarcolor=?,timezone=?,components=?,ctag=ctag+1 WHERE id=?' ); + $result = $stmt->execute(array($name,$description,$order,$color,$timezone,$components,$id)); return true; } @@ -131,7 +132,7 @@ class OC_Calendar_Calendar{ $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_calendars WHERE id = ?' ); $stmt->execute(array($id)); - $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE addressbookid = ?' ); + $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ?' ); $stmt->execute(array($id)); return true; @@ -141,12 +142,12 @@ class OC_Calendar_Calendar{ $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' ); $result = $stmt->execute(array($id)); - $addressbooks = array(); + $calendarobjects = array(); while( $row = $result->fetchRow()){ - $addressbooks[] = $row; + $calendarobjects[] = $row; } - return $addressbooks; + return $calendarobjects; } public static function findCalendarObject($id){ @@ -163,27 +164,30 @@ class OC_Calendar_Calendar{ return $result->fetchRow(); } - public static function addCard($id,$data){ + public static function addCalendarObject($id,$data){ $object = Sabre_VObject_Reader::read($data); list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - $fn = null; $uri = null; - $card = Sabre_VObject_Reader::read($data); - foreach($card->children as $property){ - if($property->name == 'FN'){ - $fn = $property->value; - } - elseif(is_null($uri) && $property->name == 'UID' ){ - $uri = $property->value.'.vcf'; - } + if(is_null($uri)){ + $uid = self::createUID(); + $object->add('UID',$uid); + $data = $object->serialize(); + $uri = $uid.'.ics'; + } + else{ + $uri = $uid.'.ics'; } - if(is_null($uri)) $uri = self::createUID().'.vcf'; - $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($id,$fn,$data,$uri,time())); + $start = is_null($startdate)?null:$startdate->format('Y-m-d H:i:s'); + $end = is_null($enddate)?null:$enddate->format('Y-m-d H:i:s'); + $type = $object->name; + $time = time(); + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); + $result = $stmt->execute(array($id,$type,$start,$end,$repeating,$summary,$data,$uri,$time)); - self::touchAddressbook($id); + self::touchCalendar($id); return OC_DB::insertid(); } @@ -192,8 +196,14 @@ class OC_Calendar_Calendar{ $object = Sabre_VObject_Reader::read($data); list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttye,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); - $result = $stmt->execute(array($id,$object->name,(is_null($startdate)?null:$startdate->format('Y-m-d H:i:s')),(is_null($enddate)?null:$enddate->format('Y-m-d H:i:s')),$repeating,$summary,$data,$uri,time())); + $start = is_null($startdate)?null:$startdate->format('Y-m-d H:i:s'); + $end = is_null($enddate)?null:$enddate->format('Y-m-d H:i:s'); + $type = $object->name; + $time = time(); + + $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); + // $result = $stmt->execute(array($id,$type,$start,$end,$repeating,$summary,$data,$uri,$time)); + $result = $stmt->execute(array($id,$type,'2011-08-17 14:00:00','2011-08-17 15:00:00',0,'baum',$data,$uri,$time)); self::touchCalendar($id); @@ -206,7 +216,7 @@ class OC_Calendar_Calendar{ $object = Sabre_VObject_Reader::read($data); list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET objecttye=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); $result = $stmt->execute(array($object->name,(is_null($startdate)?null:$startdate->format('Y-m-d H:i:s')),(is_null($enddate)?null:$enddate->format('Y-m-d H:i:s')),$repeating,$summary,$data,time(),$id)); self::touchCalendar($id); @@ -220,7 +230,7 @@ class OC_Calendar_Calendar{ $object = Sabre_VObject_Reader::read($data); list($startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - $stmt = OC_DB::prepare( 'UPDATE *PREFIX*contacts_cards SET objecttye=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); + $stmt = OC_DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); $result = $stmt->execute(array($object->name,(is_null($startdate)?null:$startdate->format('Y-m-d H:i:s')),(is_null($enddate)?null:$enddate->format('Y-m-d H:i:s')),$repeating,$summary,$data,time(),$oldobject['id'])); self::touchCalendar($oldobject['calendarid']); diff --git a/apps/calendar/lib/connector_sabre.php b/apps/calendar/lib/connector_sabre.php new file mode 100644 index 00000000000..199f5011f9f --- /dev/null +++ b/apps/calendar/lib/connector_sabre.php @@ -0,0 +1,291 @@ +<?php + +class OC_Connector_Sabre_CalDAV extends Sabre_CalDAV_Backend_Abstract { + /** + * List of CalDAV properties, and how they map to database fieldnames + * + * Add your own properties by simply adding on to this array + * + * @var array + */ + public $propertyMap = array( + '{DAV:}displayname' => 'displayname', + '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', + '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', + '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', + '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', + ); + + /** + * Returns a list of calendars for a principal. + * + * Every project is an array with the following keys: + * * id, a unique id that will be used by other functions to modify the + * calendar. This can be the same as the uri or a database key. + * * uri, which the basename of the uri with which the calendar is + * accessed. + * * principalUri. The owner of the calendar. Almost always the same as + * principalUri passed to this method. + * + * Furthermore it can contain webdav properties in clark notation. A very + * common one is '{DAV:}displayname'. + * + * @param string $principalUri + * @return array + */ + public function getCalendarsForUser($principalUri) { + $raw = OC_Calendar_Calendar::allCalendarsWherePrincipalURIIs($principalUri); + + $calendars = array(); + foreach( $raw as $row ){ + $components = explode(',',$row['components']); + + $calendar = array( + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => 'principals/'.$row['userid'], + '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', + '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components), + ); + + foreach($this->propertyMap as $xmlName=>$dbName) { + $calendar[$xmlName] = $row[$dbName]; + } + + $calendars[] = $calendar; + } + return $calendars; + } + + /** + * Creates a new calendar for a principal. + * + * If the creation was a success, an id must be returned that can be used to reference + * this calendar in other methods, such as updateCalendar + * + * @param string $principalUri + * @param string $calendarUri + * @param array $properties + * @return mixed + */ + public function createCalendar($principalUri,$calendarUri, array $properties) { + $fieldNames = array( + 'principaluri', + 'uri', + 'ctag', + ); + $values = array( + ':principaluri' => $principalUri, + ':uri' => $calendarUri, + ':ctag' => 1, + ); + + // Default value + $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; + $fieldNames[] = 'components'; + if (!isset($properties[$sccs])) { + $values[':components'] = 'VEVENT,VTODO'; + } else { + if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) { + throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet'); + } + $values[':components'] = implode(',',$properties[$sccs]->getValue()); + } + + foreach($this->propertyMap as $xmlName=>$dbName) { + if (isset($properties[$xmlName])) { + + $myValue = $properties[$xmlName]; + $values[':' . $dbName] = $properties[$xmlName]; + $fieldNames[] = $dbName; + } + } + + if(!isset($newValues['displayname'])) $newValues['displayname'] = 'unnamed'; + if(!isset($newValues['description'])) $newValues['description'] = ''; + if(!isset($newValues['components'])) $newValues['components'] = 'VEVENT,VTODO'; + if(!isset($newValues['timezone'])) $newValues['timezone'] = null; + if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = 0; + if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null; + + return OC_Calendar_Calendar::addCalendarFromDAVData($principalUri,$calendarUri,$newValues['displayname'],$newValues['description'],$newValues['components'],$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']); + } + + /** + * Updates a calendars properties + * + * The properties array uses the propertyName in clark-notation as key, + * and the array value for the property value. In the case a property + * should be deleted, the property value will be null. + * + * This method must be atomic. If one property cannot be changed, the + * entire operation must fail. + * + * If the operation was successful, true can be returned. + * If the operation failed, false can be returned. + * + * Deletion of a non-existant property is always succesful. + * + * Lastly, it is optional to return detailed information about any + * failures. In this case an array should be returned with the following + * structure: + * + * array( + * 403 => array( + * '{DAV:}displayname' => null, + * ), + * 424 => array( + * '{DAV:}owner' => null, + * ) + * ) + * + * In this example it was forbidden to update {DAV:}displayname. + * (403 Forbidden), which in turn also caused {DAV:}owner to fail + * (424 Failed Dependency) because the request needs to be atomic. + * + * @param string $calendarId + * @param array $properties + * @return bool|array + */ + public function updateCalendar($calendarId, array $properties) { + + $newValues = array(); + $result = array( + 200 => array(), // Ok + 403 => array(), // Forbidden + 424 => array(), // Failed Dependency + ); + + $hasError = false; + + foreach($properties as $propertyName=>$propertyValue) { + + // We don't know about this property. + if (!isset($this->propertyMap[$propertyName])) { + $hasError = true; + $result[403][$propertyName] = null; + unset($properties[$propertyName]); + continue; + } + + $fieldName = $this->propertyMap[$propertyName]; + $newValues[$fieldName] = $propertyValue; + + } + + // If there were any errors we need to fail the request + if ($hasError) { + // Properties has the remaining properties + foreach($properties as $propertyName=>$propertyValue) { + $result[424][$propertyName] = null; + } + + // Removing unused statuscodes for cleanliness + foreach($result as $status=>$properties) { + if (is_array($properties) && count($properties)===0) unset($result[$status]); + } + + return $result; + + } + + // Success + if(!isset($newValues['displayname'])) $newValues['displayname'] = null; + if(!isset($newValues['description'])) $newValues['description'] = null; + if(!isset($newValues['timezone'])) $newValues['timezone'] = null; + if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = null; + if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null; + + OC_Calendar_Calendar::editCalendar($calendarId,$newValues['displayname'],$newValues['description'],null,$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']); + + return true; + + } + + /** + * Delete a calendar and all it's objects + * + * @param string $calendarId + * @return void + */ + public function deleteCalendar($calendarId) { + OC_Calendar_Calendar::deleteCalendar($calendarId); + } + + /** + * Returns all calendar objects within a calendar object. + * + * Every item contains an array with the following keys: + * * id - unique identifier which will be used for subsequent updates + * * calendardata - The iCalendar-compatible calnedar data + * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. + * * lastmodified - a timestamp of the last modification time + * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: + * ' "abcdef"') + * * calendarid - The calendarid as it was passed to this function. + * + * Note that the etag is optional, but it's highly encouraged to return for + * speed reasons. + * + * The calendardata is also optional. If it's not returned + * 'getCalendarObject' will be called later, which *is* expected to return + * calendardata. + * + * @param string $calendarId + * @return array + */ + public function getCalendarObjects($calendarId) { + return OC_Calendar_Calendar::allCalendarObjects($calendarId); + } + + /** + * Returns information from a single calendar object, based on it's object + * uri. + * + * The returned array must have the same keys as getCalendarObjects. The + * 'calendardata' object is required here though, while it's not required + * for getCalendarObjects. + * + * @param string $calendarId + * @param string $objectUri + * @return array + */ + public function getCalendarObject($calendarId,$objectUri) { + return OC_Calendar_Calendar::findCalendarObjectWhereDAVDataIs($calendarId,$objectUri); + } + + /** + * Creates a new calendar object. + * + * @param string $calendarId + * @param string $objectUri + * @param string $calendarData + * @return void + */ + public function createCalendarObject($calendarId,$objectUri,$calendarData) { + OC_Calendar_Calendar::addCalendarObjectFromDAVData($calendarId,$objectUri,$calendarData); + } + + /** + * Updates an existing calendarobject, based on it's uri. + * + * @param string $calendarId + * @param string $objectUri + * @param string $calendarData + * @return void + */ + public function updateCalendarObject($calendarId,$objectUri,$calendarData){ + OC_Calendar_Calendar::editCalendarObjectFromDAVData($calendarId,$objectUri,$calendarData); + } + + /** + * Deletes an existing calendar object. + * + * @param string $calendarId + * @param string $objectUri + * @return void + */ + public function deleteCalendarObject($calendarId,$objectUri){ + OC_Calendar_Calendar::deleteCalendarObjectFromDAVData($calendarID,$objectUri); + } +} diff --git a/apps/calendar/lib/hooks.php b/apps/calendar/lib/hooks.php index 60a8c23dac2..5c446102b22 100644 --- a/apps/calendar/lib/hooks.php +++ b/apps/calendar/lib/hooks.php @@ -33,7 +33,7 @@ class OC_Calendar_Hooks{ $calendars = OC_Calendar_Calendar::allCalendars($parameters['uid']); foreach($calendars as $calendar) { - OC_Calendar_Calendar::deleteCalendar($addressbook['id']); + OC_Calendar_Calendar::deleteCalendar($calendar['id']); } return true; |