caldavBackend = $caldavBackend; $this->principalBackend = $principalBackend; $this->calendarInfo = $calendarInfo; } /** * Returns the name of the calendar * * @return string */ public function getName() { return $this->calendarInfo['uri']; } /** * Updates properties such as the display name and description * * @param array $mutations * @return array */ public function updateProperties($mutations) { return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations); } /** * Returns the list of properties * * @param array $properties * @return array */ public function getProperties($requestedProperties) { $response = array(); foreach($requestedProperties as $prop) switch($prop) { case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' : $response[$prop] = new Sabre_CalDAV_Property_SupportedCalendarData(); break; case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' : $response[$prop] = new Sabre_CalDAV_Property_SupportedCollationSet(); break; case '{DAV:}owner' : $response[$prop] = new Sabre_DAVACL_Property_Principal(Sabre_DAVACL_Property_Principal::HREF,$this->calendarInfo['principaluri']); break; default : if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop]; break; } return $response; } /** * Returns a calendar object * * The contained calendar objects are for example Events or Todo's. * * @param string $name * @return Sabre_DAV_ICalendarObject */ public function getChild($name) { $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); if (!$obj) throw new Sabre_DAV_Exception_FileNotFound('Calendar object not found'); return new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); } /** * Returns the full list of calendar objects * * @return array */ public function getChildren() { $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); $children = array(); foreach($objs as $obj) { $children[] = new Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); } return $children; } /** * Checks if a child-node exists. * * @param string $name * @return bool */ public function childExists($name) { $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); if (!$obj) return false; else return true; } /** * Creates a new directory * * We actually block this, as subdirectories are not allowed in calendars. * * @param string $name * @return void */ public function createDirectory($name) { throw new Sabre_DAV_Exception_MethodNotAllowed('Creating collections in calendar objects is not allowed'); } /** * Creates a new file * * The contents of the new file must be a valid ICalendar string. * * @param string $name * @param resource $calendarData * @return void */ public function createFile($name,$calendarData = null) { $calendarData = stream_get_contents($calendarData); $supportedComponents = $this->calendarInfo['{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set']->getValue(); Sabre_CalDAV_ICalendarUtil::validateICalendarObject($calendarData, $supportedComponents); $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData); } /** * Deletes the calendar. * * @return void */ public function delete() { $this->caldavBackend->deleteCalendar($this->calendarInfo['id']); } /** * Renames the calendar. Note that most calendars use the * {DAV:}displayname to display a name to display a name. * * @param string $newName * @return void */ public function setName($newName) { throw new Sabre_DAV_Exception_MethodNotAllowed('Renaming calendars is not yet supported'); } /** * Returns the last modification date as a unix timestamp. * * @return void */ public function getLastModified() { return null; } /** * Returns the owner principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getOwner() { return $this->calendarInfo['principaluri']; } /** * Returns a group principal * * This must be a url to a principal, or null if there's no owner * * @return string|null */ public function getGroup() { return null; } /** * Returns a list of ACE's for this node. * * Each ACE has the following properties: * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are * currently the only supported privileges * * 'principal', a url to the principal who owns the node * * 'protected' (optional), indicating that this ACE is not allowed to * be updated. * * @return array */ public function getACL() { return array( array( 'privilege' => '{DAV:}read', 'principal' => $this->calendarInfo['principaluri'], 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->calendarInfo['principaluri'], 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}write', 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write', 'protected' => true, ), array( 'privilege' => '{DAV:}read', 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read', 'protected' => true, ), ); } /** * Updates the ACL * * This method will receive a list of new ACE's. * * @param array $acl * @return void */ public function setACL(array $acl) { throw new Sabre_DAV_Exception_MethodNotAllowed('Changing ACL is not yet supported'); } }