Blame view
sources/3rdparty/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php
5.3 KB
|
03e52840d
|
1 |
<?php |
|
6d9380f96
|
2 |
namespace Sabre\CalDAV\Backend; |
|
03e52840d
|
3 |
use Sabre\VObject; |
|
6d9380f96
|
4 |
use Sabre\CalDAV; |
|
03e52840d
|
5 6 7 8 9 10 |
/** * Abstract Calendaring backend. Extend this class to create your own backends. * * Checkout the BackendInterface for all the methods that must be implemented. * |
|
6d9380f96
|
11 12 13 |
* @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/). * @author Evert Pot (http://evertpot.com/) * @license http://sabre.io/license/ Modified BSD License |
|
03e52840d
|
14 |
*/ |
|
6d9380f96
|
15 |
abstract class AbstractBackend implements BackendInterface {
|
|
03e52840d
|
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
/**
* Updates properties for a calendar.
*
* The mutations 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-existent property is always successful.
*
* 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 mixed $calendarId
* @param array $mutations
* @return bool|array
*/
public function updateCalendar($calendarId, array $mutations) {
return false;
}
/**
* Performs a calendar-query on the contents of this calendar.
*
* The calendar-query is defined in RFC4791 : CalDAV. Using the
* calendar-query it is possible for a client to request a specific set of
* object, based on contents of iCalendar properties, date-ranges and
* iCalendar component types (VTODO, VEVENT).
*
* This method should just return a list of (relative) urls that match this
* query.
*
* The list of filters are specified as an array. The exact array is
|
|
6d9380f96
|
71 |
* documented by \Sabre\CalDAV\CalendarQueryParser. |
|
03e52840d
|
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
*
* Note that it is extremely likely that getCalendarObject for every path
* returned from this method will be called almost immediately after. You
* may want to anticipate this to speed up these requests.
*
* This method provides a default implementation, which parses *all* the
* iCalendar objects in the specified calendar.
*
* This default may well be good enough for personal use, and calendars
* that aren't very large. But if you anticipate high usage, big calendars
* or high loads, you are strongly adviced to optimize certain paths.
*
* The best way to do so is override this method and to optimize
* specifically for 'common filters'.
*
* Requests that are extremely common are:
* * requests for just VEVENTS
* * requests for just VTODO
* * requests with a time-range-filter on either VEVENT or VTODO.
*
* ..and combinations of these requests. It may not be worth it to try to
* handle every possible situation and just rely on the (relatively
* easy to use) CalendarQueryValidator to handle the rest.
*
* Note that especially time-range-filters may be difficult to parse. A
* time-range filter specified on a VEVENT must for instance also handle
* recurrence rules correctly.
* A good example of how to interprete all these filters can also simply
|
|
6d9380f96
|
100 |
* be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct |
|
03e52840d
|
101 102 103 104 105 106 107 108 109 110 111 |
* as possible, so it gives you a good idea on what type of stuff you need
* to think of.
*
* @param mixed $calendarId
* @param array $filters
* @return array
*/
public function calendarQuery($calendarId, array $filters) {
$result = array();
$objects = $this->getCalendarObjects($calendarId);
|
|
6d9380f96
|
112 |
$validator = new \Sabre\CalDAV\CalendarQueryValidator(); |
|
03e52840d
|
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
foreach($objects as $object) {
if ($this->validateFilterForObject($object, $filters)) {
$result[] = $object['uri'];
}
}
return $result;
}
/**
* This method validates if a filters (as passed to calendarQuery) matches
* the given object.
*
* @param array $object
|
|
6d9380f96
|
131 |
* @param array $filters |
|
03e52840d
|
132 133 134 135 136 137 138 139 140 141 142 143 144 |
* @return bool
*/
protected function validateFilterForObject(array $object, array $filters) {
// Unfortunately, setting the 'calendardata' here is optional. If
// it was excluded, we actually need another call to get this as
// well.
if (!isset($object['calendardata'])) {
$object = $this->getCalendarObject($object['calendarid'], $object['uri']);
}
$data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata'];
$vObject = VObject\Reader::read($data);
|
|
6d9380f96
|
145 |
$validator = new CalDAV\CalendarQueryValidator(); |
|
03e52840d
|
146 147 148 149 150 151 |
return $validator->validate($vObject, $filters);
}
}
|