1<?php
2
3namespace Sabre\DAV\Xml\Property;
4
5use Sabre\DAV;
6use Sabre\DAV\Browser\HtmlOutput;
7use Sabre\DAV\Browser\HtmlOutputHelper;
8use Sabre\Xml\Writer;
9use Sabre\Xml\XmlSerializable;
10
11/**
12 * supported-report-set property.
13 *
14 * This property is defined in RFC3253, but since it's
15 * so common in other webdav-related specs, it is part of the core server.
16 *
17 * This property is defined here:
18 * http://tools.ietf.org/html/rfc3253#section-3.1.5
19 *
20 * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/).
21 * @author Evert Pot (http://www.rooftopsolutions.nl/)
22 * @license http://sabre.io/license/ Modified BSD License
23 */
24class SupportedReportSet implements XmlSerializable, HtmlOutput {
25
26    /**
27     * List of reports
28     *
29     * @var array
30     */
31    protected $reports = [];
32
33    /**
34     * Creates the property
35     *
36     * Any reports passed in the constructor
37     * should be valid report-types in clark-notation.
38     *
39     * Either a string or an array of strings must be passed.
40     *
41     * @param string|string[] $reports
42     */
43    function __construct($reports = null) {
44
45        if (!is_null($reports))
46            $this->addReport($reports);
47
48    }
49
50    /**
51     * Adds a report to this property
52     *
53     * The report must be a string in clark-notation.
54     * Multiple reports can be specified as an array.
55     *
56     * @param mixed $report
57     * @return void
58     */
59    function addReport($report) {
60
61        $report = (array)$report;
62
63        foreach ($report as $r) {
64
65            if (!preg_match('/^{([^}]*)}(.*)$/', $r))
66                throw new DAV\Exception('Reportname must be in clark-notation');
67
68            $this->reports[] = $r;
69
70        }
71
72    }
73
74    /**
75     * Returns the list of supported reports
76     *
77     * @return string[]
78     */
79    function getValue() {
80
81        return $this->reports;
82
83    }
84
85    /**
86     * Returns true or false if the property contains a specific report.
87     *
88     * @param string $reportName
89     * @return bool
90     */
91    function has($reportName) {
92
93        return in_array(
94            $reportName,
95            $this->reports
96        );
97
98    }
99
100    /**
101     * The xmlSerialize metod is called during xml writing.
102     *
103     * Use the $writer argument to write its own xml serialization.
104     *
105     * An important note: do _not_ create a parent element. Any element
106     * implementing XmlSerializble should only ever write what's considered
107     * its 'inner xml'.
108     *
109     * The parent of the current element is responsible for writing a
110     * containing element.
111     *
112     * This allows serializers to be re-used for different element names.
113     *
114     * If you are opening new elements, you must also close them again.
115     *
116     * @param Writer $writer
117     * @return void
118     */
119    function xmlSerialize(Writer $writer) {
120
121        foreach ($this->getValue() as $val) {
122            $writer->startElement('{DAV:}supported-report');
123            $writer->startElement('{DAV:}report');
124            $writer->writeElement($val);
125            $writer->endElement();
126            $writer->endElement();
127        }
128
129    }
130
131    /**
132     * Generate html representation for this value.
133     *
134     * The html output is 100% trusted, and no effort is being made to sanitize
135     * it. It's up to the implementor to sanitize user provided values.
136     *
137     * The output must be in UTF-8.
138     *
139     * The baseUri parameter is a url to the root of the application, and can
140     * be used to construct local links.
141     *
142     * @param HtmlOutputHelper $html
143     * @return string
144     */
145    function toHtml(HtmlOutputHelper $html) {
146
147        return implode(
148            ', ',
149            array_map([$html, 'xmlName'], $this->getValue())
150        );
151
152    }
153
154}
155