summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorJakob Sack <kde@jakobsack.de>2011-08-22 16:59:16 +0200
committerJakob Sack <kde@jakobsack.de>2011-08-22 16:59:16 +0200
commitfbb63f11e44e14874702808355decb5347c52b95 (patch)
tree96a7674d681e4f108eda9d36d6e270ea524d59e8 /apps
parent09c8cd17cca16e7ca9fa9d556ad8cc017cea3f44 (diff)
downloadnextcloud-server-fbb63f11e44e14874702808355decb5347c52b95.tar.gz
nextcloud-server-fbb63f11e44e14874702808355decb5347c52b95.zip
Some more work on CalDAV integration
Diffstat (limited to 'apps')
-rwxr-xr-xapps/calendar/index.php13
-rw-r--r--apps/calendar/lib/PDO.php352
-rw-r--r--apps/calendar/lib/calendar.php102
-rw-r--r--apps/calendar/lib/connector_sabre.php291
-rw-r--r--apps/calendar/lib/hooks.php2
5 files changed, 358 insertions, 402 deletions
diff --git a/apps/calendar/index.php b/apps/calendar/index.php
index b0aaa144495..e08264ec09f 100755
--- a/apps/calendar/index.php
+++ b/apps/calendar/index.php
@@ -22,12 +22,19 @@ if(!OC_USER::isLoggedIn()) {
header("Location: " . OC_HELPER::linkTo("", "index.php"));
exit;
}
+
+// Create default calendar ...
+$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser());
+if( count($calendars) == 0){
+ OC_Calendar_Calendar::addCalendar(OC_User::getUser(),'default','Default calendar');
+ $calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser());
+}
+
OC_UTIL::addScript("calendar", "calendar");
OC_UTIL::addScript("calendar", "calendar_init");
OC_UTIL::addScript("calendar", "calendar_dialog");
OC_UTIL::addStyle("calendar", "style");
-require_once ("template.php");
+
OC_APP::setActiveNavigationEntry("calendar_index");
$output = new OC_TEMPLATE("calendar", "calendar", "user");
-$output -> printpage();
-?> \ No newline at end of file
+$output -> printPage();
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;