1<?php 2 3namespace Sabre\CalDAV\Xml\Request; 4 5use Sabre\CalDAV\Plugin; 6use Sabre\DAV\Exception\BadRequest; 7use Sabre\VObject\DateTimeParser; 8use Sabre\Xml\Reader; 9use Sabre\Xml\XmlDeserializable; 10 11/** 12 * FreeBusyQueryReport 13 * 14 * This class parses the {DAV:}free-busy-query REPORT, as defined in: 15 * 16 * http://tools.ietf.org/html/rfc3253#section-3.8 17 * 18 * @copyright Copyright (C) fruux GmbH (https://fruux.com/) 19 * @author Evert Pot (http://evertpot.com/) 20 * @license http://sabre.io/license/ Modified BSD License 21 */ 22class FreeBusyQueryReport implements XmlDeserializable { 23 24 /** 25 * Starttime of report 26 * 27 * @var DateTime|null 28 */ 29 public $start; 30 31 /** 32 * End time of report 33 * 34 * @var DateTime|null 35 */ 36 public $end; 37 38 /** 39 * The deserialize method is called during xml parsing. 40 * 41 * This method is called statically, this is because in theory this method 42 * may be used as a type of constructor, or factory method. 43 * 44 * Often you want to return an instance of the current class, but you are 45 * free to return other data as well. 46 * 47 * You are responsible for advancing the reader to the next element. Not 48 * doing anything will result in a never-ending loop. 49 * 50 * If you just want to skip parsing for this element altogether, you can 51 * just call $reader->next(); 52 * 53 * $reader->parseInnerTree() will parse the entire sub-tree, and advance to 54 * the next element. 55 * 56 * @param Reader $reader 57 * @return mixed 58 */ 59 static function xmlDeserialize(Reader $reader) { 60 61 $timeRange = '{' . Plugin::NS_CALDAV . '}time-range'; 62 63 $start = null; 64 $end = null; 65 66 foreach ((array)$reader->parseInnerTree([]) as $elem) { 67 68 if ($elem['name'] !== $timeRange) continue; 69 70 $start = empty($elem['attributes']['start']) ?: $elem['attributes']['start']; 71 $end = empty($elem['attributes']['end']) ?: $elem['attributes']['end']; 72 73 } 74 if (!$start && !$end) { 75 throw new BadRequest('The freebusy report must have a time-range element'); 76 } 77 if ($start) { 78 $start = DateTimeParser::parseDateTime($start); 79 } 80 if ($end) { 81 $end = DateTimeParser::parseDateTime($end); 82 } 83 $result = new self(); 84 $result->start = $start; 85 $result->end = $end; 86 87 return $result; 88 89 } 90 91} 92