diff options
Diffstat (limited to 'lib/private/vobject.php')
-rw-r--r-- | lib/private/vobject.php | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/lib/private/vobject.php b/lib/private/vobject.php new file mode 100644 index 00000000000..267176ebc07 --- /dev/null +++ b/lib/private/vobject.php @@ -0,0 +1,207 @@ +<?php +/** + * ownCloud + * + * @author Bart Visscher + * @copyright 2011 Bart Visscher bartv@thisnet.nl + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +/** + * This class provides a streamlined interface to the Sabre VObject classes + */ +class OC_VObject{ + /** @var Sabre\VObject\Component */ + protected $vobject; + + /** + * @returns Sabre\VObject\Component + */ + public function getVObject() { + return $this->vobject; + } + + /** + * @brief Parses the VObject + * @param string VObject as string + * @returns Sabre_VObject or null + */ + public static function parse($data) { + try { + Sabre\VObject\Property::$classMap['LAST-MODIFIED'] = 'Sabre\VObject\Property\DateTime'; + $vobject = Sabre\VObject\Reader::read($data); + if ($vobject instanceof Sabre\VObject\Component) { + $vobject = new OC_VObject($vobject); + } + return $vobject; + } catch (Exception $e) { + OC_Log::write('vobject', $e->getMessage(), OC_Log::ERROR); + return null; + } + } + + /** + * @brief Escapes semicolons + * @param string $value + * @return string + */ + public static function escapeSemicolons($value) { + foreach($value as &$i ) { + $i = implode("\\\\;", explode(';', $i)); + } + return implode(';', $value); + } + + /** + * @brief Creates an array out of a multivalue property + * @param string $value + * @return array + */ + public static function unescapeSemicolons($value) { + $array = explode(';', $value); + for($i=0;$i<count($array);$i++) { + if(substr($array[$i], -2, 2)=="\\\\") { + if(isset($array[$i+1])) { + $array[$i] = substr($array[$i], 0, count($array[$i])-2).';'.$array[$i+1]; + unset($array[$i+1]); + } + else{ + $array[$i] = substr($array[$i], 0, count($array[$i])-2).';'; + } + $i = $i - 1; + } + } + return $array; + } + + /** + * Constuctor + * @param Sabre\VObject\Component or string + */ + public function __construct($vobject_or_name) { + if (is_object($vobject_or_name)) { + $this->vobject = $vobject_or_name; + } else { + $this->vobject = new Sabre\VObject\Component($vobject_or_name); + } + } + + public function add($item, $itemValue = null) { + if ($item instanceof OC_VObject) { + $item = $item->getVObject(); + } + $this->vobject->add($item, $itemValue); + } + + /** + * @brief Add property to vobject + * @param object $name of property + * @param object $value of property + * @param object $parameters of property + * @returns Sabre_VObject_Property newly created + */ + public function addProperty($name, $value, $parameters=array()) { + if(is_array($value)) { + $value = OC_VObject::escapeSemicolons($value); + } + $property = new Sabre\VObject\Property( $name, $value ); + foreach($parameters as $name => $value) { + $property->parameters[] = new Sabre\VObject\Parameter($name, $value); + } + + $this->vobject->add($property); + return $property; + } + + public function setUID() { + $uid = substr(md5(rand().time()), 0, 10); + $this->vobject->add('UID', $uid); + } + + public function setString($name, $string) { + if ($string != '') { + $string = strtr($string, array("\r\n"=>"\n")); + $this->vobject->__set($name, $string); + }else{ + $this->vobject->__unset($name); + } + } + + /** + * Sets or unsets the Date and Time for a property. + * When $datetime is set to 'now', use the current time + * When $datetime is null, unset the property + * + * @param string property name + * @param DateTime $datetime + * @param int $dateType + * @return void + */ + public function setDateTime($name, $datetime, $dateType=Sabre\VObject\Property\DateTime::LOCALTZ) { + if ($datetime == 'now') { + $datetime = new DateTime(); + } + if ($datetime instanceof DateTime) { + $datetime_element = new Sabre\VObject\Property\DateTime($name); + $datetime_element->setDateTime($datetime, $dateType); + $this->vobject->__set($name, $datetime_element); + }else{ + $this->vobject->__unset($name); + } + } + + public function getAsString($name) { + return $this->vobject->__isset($name) ? + $this->vobject->__get($name)->value : + ''; + } + + public function getAsArray($name) { + $values = array(); + if ($this->vobject->__isset($name)) { + $values = explode(',', $this->getAsString($name)); + $values = array_map('trim', $values); + } + return $values; + } + + public function &__get($name) { + if ($name == 'children') { + return $this->vobject->children; + } + $return = $this->vobject->__get($name); + if ($return instanceof Sabre\VObject\Component) { + $return = new OC_VObject($return); + } + return $return; + } + + public function __set($name, $value) { + return $this->vobject->__set($name, $value); + } + + public function __unset($name) { + return $this->vobject->__unset($name); + } + + public function __isset($name) { + return $this->vobject->__isset($name); + } + + public function __call($function, $arguments) { + return call_user_func_array(array($this->vobject, $function), $arguments); + } +} |