xref: /plugin/davcal/vendor/sabre/vobject/lib/Node.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\VObject;
4*a1a3b679SAndreas Boehler
5*a1a3b679SAndreas Boehler/**
6*a1a3b679SAndreas Boehler * A node is the root class for every element in an iCalendar of vCard object.
7*a1a3b679SAndreas Boehler *
8*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/).
9*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/)
10*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License
11*a1a3b679SAndreas Boehler */
12*a1a3b679SAndreas Boehlerabstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable {
13*a1a3b679SAndreas Boehler
14*a1a3b679SAndreas Boehler    /**
15*a1a3b679SAndreas Boehler     * The following constants are used by the validate() method.
16*a1a3b679SAndreas Boehler     *
17*a1a3b679SAndreas Boehler     * If REPAIR is set, the validator will attempt to repair any broken data
18*a1a3b679SAndreas Boehler     * (if possible).
19*a1a3b679SAndreas Boehler     */
20*a1a3b679SAndreas Boehler    const REPAIR = 1;
21*a1a3b679SAndreas Boehler
22*a1a3b679SAndreas Boehler    /**
23*a1a3b679SAndreas Boehler     * If this option is set, the validator will operate on the vcards on the
24*a1a3b679SAndreas Boehler     * assumption that the vcards need to be valid for CardDAV.
25*a1a3b679SAndreas Boehler     *
26*a1a3b679SAndreas Boehler     * This means for example that the UID is required, whereas it is not for
27*a1a3b679SAndreas Boehler     * regular vcards.
28*a1a3b679SAndreas Boehler     */
29*a1a3b679SAndreas Boehler    const PROFILE_CARDDAV = 2;
30*a1a3b679SAndreas Boehler
31*a1a3b679SAndreas Boehler    /**
32*a1a3b679SAndreas Boehler     * If this option is set, the validator will operate on iCalendar objects
33*a1a3b679SAndreas Boehler     * on the assumption that the vcards need to be valid for CalDAV.
34*a1a3b679SAndreas Boehler     *
35*a1a3b679SAndreas Boehler     * This means for example that calendars can only contain objects with
36*a1a3b679SAndreas Boehler     * identical component types and UIDs.
37*a1a3b679SAndreas Boehler     */
38*a1a3b679SAndreas Boehler    const PROFILE_CALDAV = 4;
39*a1a3b679SAndreas Boehler
40*a1a3b679SAndreas Boehler    /**
41*a1a3b679SAndreas Boehler     * Reference to the parent object, if this is not the top object.
42*a1a3b679SAndreas Boehler     *
43*a1a3b679SAndreas Boehler     * @var Node
44*a1a3b679SAndreas Boehler     */
45*a1a3b679SAndreas Boehler    public $parent;
46*a1a3b679SAndreas Boehler
47*a1a3b679SAndreas Boehler    /**
48*a1a3b679SAndreas Boehler     * Iterator override
49*a1a3b679SAndreas Boehler     *
50*a1a3b679SAndreas Boehler     * @var ElementList
51*a1a3b679SAndreas Boehler     */
52*a1a3b679SAndreas Boehler    protected $iterator = null;
53*a1a3b679SAndreas Boehler
54*a1a3b679SAndreas Boehler    /**
55*a1a3b679SAndreas Boehler     * The root document
56*a1a3b679SAndreas Boehler     *
57*a1a3b679SAndreas Boehler     * @var Component
58*a1a3b679SAndreas Boehler     */
59*a1a3b679SAndreas Boehler    protected $root;
60*a1a3b679SAndreas Boehler
61*a1a3b679SAndreas Boehler    /**
62*a1a3b679SAndreas Boehler     * Serializes the node into a mimedir format
63*a1a3b679SAndreas Boehler     *
64*a1a3b679SAndreas Boehler     * @return string
65*a1a3b679SAndreas Boehler     */
66*a1a3b679SAndreas Boehler    abstract public function serialize();
67*a1a3b679SAndreas Boehler
68*a1a3b679SAndreas Boehler    /**
69*a1a3b679SAndreas Boehler     * This method returns an array, with the representation as it should be
70*a1a3b679SAndreas Boehler     * encoded in json. This is used to create jCard or jCal documents.
71*a1a3b679SAndreas Boehler     *
72*a1a3b679SAndreas Boehler     * @return array
73*a1a3b679SAndreas Boehler     */
74*a1a3b679SAndreas Boehler    abstract public function jsonSerialize();
75*a1a3b679SAndreas Boehler
76*a1a3b679SAndreas Boehler    /* {{{ IteratorAggregator interface */
77*a1a3b679SAndreas Boehler
78*a1a3b679SAndreas Boehler    /**
79*a1a3b679SAndreas Boehler     * Returns the iterator for this object
80*a1a3b679SAndreas Boehler     *
81*a1a3b679SAndreas Boehler     * @return ElementList
82*a1a3b679SAndreas Boehler     */
83*a1a3b679SAndreas Boehler    public function getIterator() {
84*a1a3b679SAndreas Boehler
85*a1a3b679SAndreas Boehler        if (!is_null($this->iterator))
86*a1a3b679SAndreas Boehler            return $this->iterator;
87*a1a3b679SAndreas Boehler
88*a1a3b679SAndreas Boehler        return new ElementList(array($this));
89*a1a3b679SAndreas Boehler
90*a1a3b679SAndreas Boehler    }
91*a1a3b679SAndreas Boehler
92*a1a3b679SAndreas Boehler    /**
93*a1a3b679SAndreas Boehler     * Sets the overridden iterator
94*a1a3b679SAndreas Boehler     *
95*a1a3b679SAndreas Boehler     * Note that this is not actually part of the iterator interface
96*a1a3b679SAndreas Boehler     *
97*a1a3b679SAndreas Boehler     * @param ElementList $iterator
98*a1a3b679SAndreas Boehler     * @return void
99*a1a3b679SAndreas Boehler     */
100*a1a3b679SAndreas Boehler    public function setIterator(ElementList $iterator) {
101*a1a3b679SAndreas Boehler
102*a1a3b679SAndreas Boehler        $this->iterator = $iterator;
103*a1a3b679SAndreas Boehler
104*a1a3b679SAndreas Boehler    }
105*a1a3b679SAndreas Boehler
106*a1a3b679SAndreas Boehler    /**
107*a1a3b679SAndreas Boehler     * Validates the node for correctness.
108*a1a3b679SAndreas Boehler     *
109*a1a3b679SAndreas Boehler     * The following options are supported:
110*a1a3b679SAndreas Boehler     *   Node::REPAIR - May attempt to automatically repair the problem.
111*a1a3b679SAndreas Boehler     *
112*a1a3b679SAndreas Boehler     * This method returns an array with detected problems.
113*a1a3b679SAndreas Boehler     * Every element has the following properties:
114*a1a3b679SAndreas Boehler     *
115*a1a3b679SAndreas Boehler     *  * level - problem level.
116*a1a3b679SAndreas Boehler     *  * message - A human-readable string describing the issue.
117*a1a3b679SAndreas Boehler     *  * node - A reference to the problematic node.
118*a1a3b679SAndreas Boehler     *
119*a1a3b679SAndreas Boehler     * The level means:
120*a1a3b679SAndreas Boehler     *   1 - The issue was repaired (only happens if REPAIR was turned on)
121*a1a3b679SAndreas Boehler     *   2 - An inconsequential issue
122*a1a3b679SAndreas Boehler     *   3 - A severe issue.
123*a1a3b679SAndreas Boehler     *
124*a1a3b679SAndreas Boehler     * @param int $options
125*a1a3b679SAndreas Boehler     * @return array
126*a1a3b679SAndreas Boehler     */
127*a1a3b679SAndreas Boehler    public function validate($options = 0) {
128*a1a3b679SAndreas Boehler
129*a1a3b679SAndreas Boehler        return array();
130*a1a3b679SAndreas Boehler
131*a1a3b679SAndreas Boehler    }
132*a1a3b679SAndreas Boehler
133*a1a3b679SAndreas Boehler    /* }}} */
134*a1a3b679SAndreas Boehler
135*a1a3b679SAndreas Boehler    /* {{{ Countable interface */
136*a1a3b679SAndreas Boehler
137*a1a3b679SAndreas Boehler    /**
138*a1a3b679SAndreas Boehler     * Returns the number of elements
139*a1a3b679SAndreas Boehler     *
140*a1a3b679SAndreas Boehler     * @return int
141*a1a3b679SAndreas Boehler     */
142*a1a3b679SAndreas Boehler    public function count() {
143*a1a3b679SAndreas Boehler
144*a1a3b679SAndreas Boehler        $it = $this->getIterator();
145*a1a3b679SAndreas Boehler        return $it->count();
146*a1a3b679SAndreas Boehler
147*a1a3b679SAndreas Boehler    }
148*a1a3b679SAndreas Boehler
149*a1a3b679SAndreas Boehler    /* }}} */
150*a1a3b679SAndreas Boehler
151*a1a3b679SAndreas Boehler    /* {{{ ArrayAccess Interface */
152*a1a3b679SAndreas Boehler
153*a1a3b679SAndreas Boehler
154*a1a3b679SAndreas Boehler    /**
155*a1a3b679SAndreas Boehler     * Checks if an item exists through ArrayAccess.
156*a1a3b679SAndreas Boehler     *
157*a1a3b679SAndreas Boehler     * This method just forwards the request to the inner iterator
158*a1a3b679SAndreas Boehler     *
159*a1a3b679SAndreas Boehler     * @param int $offset
160*a1a3b679SAndreas Boehler     * @return bool
161*a1a3b679SAndreas Boehler     */
162*a1a3b679SAndreas Boehler    public function offsetExists($offset) {
163*a1a3b679SAndreas Boehler
164*a1a3b679SAndreas Boehler        $iterator = $this->getIterator();
165*a1a3b679SAndreas Boehler        return $iterator->offsetExists($offset);
166*a1a3b679SAndreas Boehler
167*a1a3b679SAndreas Boehler    }
168*a1a3b679SAndreas Boehler
169*a1a3b679SAndreas Boehler    /**
170*a1a3b679SAndreas Boehler     * Gets an item through ArrayAccess.
171*a1a3b679SAndreas Boehler     *
172*a1a3b679SAndreas Boehler     * This method just forwards the request to the inner iterator
173*a1a3b679SAndreas Boehler     *
174*a1a3b679SAndreas Boehler     * @param int $offset
175*a1a3b679SAndreas Boehler     * @return mixed
176*a1a3b679SAndreas Boehler     */
177*a1a3b679SAndreas Boehler    public function offsetGet($offset) {
178*a1a3b679SAndreas Boehler
179*a1a3b679SAndreas Boehler        $iterator = $this->getIterator();
180*a1a3b679SAndreas Boehler        return $iterator->offsetGet($offset);
181*a1a3b679SAndreas Boehler
182*a1a3b679SAndreas Boehler    }
183*a1a3b679SAndreas Boehler
184*a1a3b679SAndreas Boehler    /**
185*a1a3b679SAndreas Boehler     * Sets an item through ArrayAccess.
186*a1a3b679SAndreas Boehler     *
187*a1a3b679SAndreas Boehler     * This method just forwards the request to the inner iterator
188*a1a3b679SAndreas Boehler     *
189*a1a3b679SAndreas Boehler     * @param int $offset
190*a1a3b679SAndreas Boehler     * @param mixed $value
191*a1a3b679SAndreas Boehler     * @return void
192*a1a3b679SAndreas Boehler     */
193*a1a3b679SAndreas Boehler    public function offsetSet($offset, $value) {
194*a1a3b679SAndreas Boehler
195*a1a3b679SAndreas Boehler        $iterator = $this->getIterator();
196*a1a3b679SAndreas Boehler        $iterator->offsetSet($offset,$value);
197*a1a3b679SAndreas Boehler
198*a1a3b679SAndreas Boehler    // @codeCoverageIgnoreStart
199*a1a3b679SAndreas Boehler    //
200*a1a3b679SAndreas Boehler    // This method always throws an exception, so we ignore the closing
201*a1a3b679SAndreas Boehler    // brace
202*a1a3b679SAndreas Boehler    }
203*a1a3b679SAndreas Boehler    // @codeCoverageIgnoreEnd
204*a1a3b679SAndreas Boehler
205*a1a3b679SAndreas Boehler    /**
206*a1a3b679SAndreas Boehler     * Sets an item through ArrayAccess.
207*a1a3b679SAndreas Boehler     *
208*a1a3b679SAndreas Boehler     * This method just forwards the request to the inner iterator
209*a1a3b679SAndreas Boehler     *
210*a1a3b679SAndreas Boehler     * @param int $offset
211*a1a3b679SAndreas Boehler     * @return void
212*a1a3b679SAndreas Boehler     */
213*a1a3b679SAndreas Boehler    public function offsetUnset($offset) {
214*a1a3b679SAndreas Boehler
215*a1a3b679SAndreas Boehler        $iterator = $this->getIterator();
216*a1a3b679SAndreas Boehler        $iterator->offsetUnset($offset);
217*a1a3b679SAndreas Boehler
218*a1a3b679SAndreas Boehler    // @codeCoverageIgnoreStart
219*a1a3b679SAndreas Boehler    //
220*a1a3b679SAndreas Boehler    // This method always throws an exception, so we ignore the closing
221*a1a3b679SAndreas Boehler    // brace
222*a1a3b679SAndreas Boehler    }
223*a1a3b679SAndreas Boehler    // @codeCoverageIgnoreEnd
224*a1a3b679SAndreas Boehler
225*a1a3b679SAndreas Boehler    /* }}} */
226*a1a3b679SAndreas Boehler}
227