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