Blame view

sources/3rdparty/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php 5.3 KB
03e52840d   Kload   Init
1
  <?php
6d9380f96   Cédric Dupont   Update sources OC...
2
  namespace Sabre\CalDAV\Backend;
03e52840d   Kload   Init
3
  use Sabre\VObject;
6d9380f96   Cédric Dupont   Update sources OC...
4
  use Sabre\CalDAV;
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
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   Kload   Init
14
   */
6d9380f96   Cédric Dupont   Update sources OC...
15
  abstract class AbstractBackend implements BackendInterface {
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
71
       * documented by \Sabre\CalDAV\CalendarQueryParser.
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
100
       * be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
112
          $validator = new \Sabre\CalDAV\CalendarQueryValidator();
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
131
       * @param array $filters
03e52840d   Kload   Init
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   Cédric Dupont   Update sources OC...
145
          $validator = new CalDAV\CalendarQueryValidator();
03e52840d   Kload   Init
146
147
148
149
150
151
          return $validator->validate($vObject, $filters);
  
      }
  
  
  }