xref: /plugin/davcal/vendor/sabre/dav/lib/DAV/Browser/PropFindAll.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\DAV\Browser;
4*a1a3b679SAndreas Boehler
5*a1a3b679SAndreas Boehleruse Sabre\DAV\PropFind;
6*a1a3b679SAndreas Boehler
7*a1a3b679SAndreas Boehler/**
8*a1a3b679SAndreas Boehler * This class is used by the browser plugin to trick the system in returning
9*a1a3b679SAndreas Boehler * every defined property.
10*a1a3b679SAndreas Boehler *
11*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/).
12*a1a3b679SAndreas Boehler * @author Evert Pot (http://evertpot.com/)
13*a1a3b679SAndreas Boehler * @license http://sabre.io/license/ Modified BSD License
14*a1a3b679SAndreas Boehler */
15*a1a3b679SAndreas Boehlerclass PropFindAll extends PropFind {
16*a1a3b679SAndreas Boehler
17*a1a3b679SAndreas Boehler    /**
18*a1a3b679SAndreas Boehler     * Creates the PROPFIND object
19*a1a3b679SAndreas Boehler     *
20*a1a3b679SAndreas Boehler     * @param string $path
21*a1a3b679SAndreas Boehler     */
22*a1a3b679SAndreas Boehler    function __construct($path) {
23*a1a3b679SAndreas Boehler
24*a1a3b679SAndreas Boehler        parent::__construct($path, []);
25*a1a3b679SAndreas Boehler
26*a1a3b679SAndreas Boehler    }
27*a1a3b679SAndreas Boehler
28*a1a3b679SAndreas Boehler    /**
29*a1a3b679SAndreas Boehler     * Handles a specific property.
30*a1a3b679SAndreas Boehler     *
31*a1a3b679SAndreas Boehler     * This method checks wether the specified property was requested in this
32*a1a3b679SAndreas Boehler     * PROPFIND request, and if so, it will call the callback and use the
33*a1a3b679SAndreas Boehler     * return value for it's value.
34*a1a3b679SAndreas Boehler     *
35*a1a3b679SAndreas Boehler     * Example:
36*a1a3b679SAndreas Boehler     *
37*a1a3b679SAndreas Boehler     * $propFind->handle('{DAV:}displayname', function() {
38*a1a3b679SAndreas Boehler     *      return 'hello';
39*a1a3b679SAndreas Boehler     * });
40*a1a3b679SAndreas Boehler     *
41*a1a3b679SAndreas Boehler     * Note that handle will only work the first time. If null is returned, the
42*a1a3b679SAndreas Boehler     * value is ignored.
43*a1a3b679SAndreas Boehler     *
44*a1a3b679SAndreas Boehler     * It's also possible to not pass a callback, but immediately pass a value
45*a1a3b679SAndreas Boehler     *
46*a1a3b679SAndreas Boehler     * @param string $propertyName
47*a1a3b679SAndreas Boehler     * @param mixed $valueOrCallBack
48*a1a3b679SAndreas Boehler     * @return void
49*a1a3b679SAndreas Boehler     */
50*a1a3b679SAndreas Boehler    function handle($propertyName, $valueOrCallBack) {
51*a1a3b679SAndreas Boehler
52*a1a3b679SAndreas Boehler        if (is_callable($valueOrCallBack)) {
53*a1a3b679SAndreas Boehler            $value = $valueOrCallBack();
54*a1a3b679SAndreas Boehler        } else {
55*a1a3b679SAndreas Boehler            $value = $valueOrCallBack;
56*a1a3b679SAndreas Boehler        }
57*a1a3b679SAndreas Boehler        if (!is_null($value)) {
58*a1a3b679SAndreas Boehler            $this->result[$propertyName] = [200, $value];
59*a1a3b679SAndreas Boehler        }
60*a1a3b679SAndreas Boehler
61*a1a3b679SAndreas Boehler    }
62*a1a3b679SAndreas Boehler
63*a1a3b679SAndreas Boehler    /**
64*a1a3b679SAndreas Boehler     * Sets the value of the property
65*a1a3b679SAndreas Boehler     *
66*a1a3b679SAndreas Boehler     * If status is not supplied, the status will default to 200 for non-null
67*a1a3b679SAndreas Boehler     * properties, and 404 for null properties.
68*a1a3b679SAndreas Boehler     *
69*a1a3b679SAndreas Boehler     * @param string $propertyName
70*a1a3b679SAndreas Boehler     * @param mixed $value
71*a1a3b679SAndreas Boehler     * @param int $status
72*a1a3b679SAndreas Boehler     * @return void
73*a1a3b679SAndreas Boehler     */
74*a1a3b679SAndreas Boehler    function set($propertyName, $value, $status = null) {
75*a1a3b679SAndreas Boehler
76*a1a3b679SAndreas Boehler        if (is_null($status)) {
77*a1a3b679SAndreas Boehler            $status = is_null($value) ? 404 : 200;
78*a1a3b679SAndreas Boehler        }
79*a1a3b679SAndreas Boehler        $this->result[$propertyName] = [$status, $value];
80*a1a3b679SAndreas Boehler
81*a1a3b679SAndreas Boehler    }
82*a1a3b679SAndreas Boehler
83*a1a3b679SAndreas Boehler    /**
84*a1a3b679SAndreas Boehler     * Returns the current value for a property.
85*a1a3b679SAndreas Boehler     *
86*a1a3b679SAndreas Boehler     * @param string $propertyName
87*a1a3b679SAndreas Boehler     * @return mixed
88*a1a3b679SAndreas Boehler     */
89*a1a3b679SAndreas Boehler    function get($propertyName) {
90*a1a3b679SAndreas Boehler
91*a1a3b679SAndreas Boehler        return isset($this->result[$propertyName]) ? $this->result[$propertyName][1] : null;
92*a1a3b679SAndreas Boehler
93*a1a3b679SAndreas Boehler    }
94*a1a3b679SAndreas Boehler
95*a1a3b679SAndreas Boehler    /**
96*a1a3b679SAndreas Boehler     * Returns the current status code for a property name.
97*a1a3b679SAndreas Boehler     *
98*a1a3b679SAndreas Boehler     * If the property does not appear in the list of requested properties,
99*a1a3b679SAndreas Boehler     * null will be returned.
100*a1a3b679SAndreas Boehler     *
101*a1a3b679SAndreas Boehler     * @param string $propertyName
102*a1a3b679SAndreas Boehler     * @return int|null
103*a1a3b679SAndreas Boehler     */
104*a1a3b679SAndreas Boehler    function getStatus($propertyName) {
105*a1a3b679SAndreas Boehler
106*a1a3b679SAndreas Boehler        return isset($this->result[$propertyName]) ? $this->result[$propertyName][0] : 404;
107*a1a3b679SAndreas Boehler
108*a1a3b679SAndreas Boehler    }
109*a1a3b679SAndreas Boehler
110*a1a3b679SAndreas Boehler    /**
111*a1a3b679SAndreas Boehler     * Returns all propertynames that have a 404 status, and thus don't have a
112*a1a3b679SAndreas Boehler     * value yet.
113*a1a3b679SAndreas Boehler     *
114*a1a3b679SAndreas Boehler     * @return array
115*a1a3b679SAndreas Boehler     */
116*a1a3b679SAndreas Boehler    function get404Properties() {
117*a1a3b679SAndreas Boehler
118*a1a3b679SAndreas Boehler        $result = [];
119*a1a3b679SAndreas Boehler        foreach ($this->result as $propertyName => $stuff) {
120*a1a3b679SAndreas Boehler            if ($stuff[0] === 404) {
121*a1a3b679SAndreas Boehler                $result[] = $propertyName;
122*a1a3b679SAndreas Boehler            }
123*a1a3b679SAndreas Boehler        }
124*a1a3b679SAndreas Boehler        // If there's nothing in this list, we're adding one fictional item.
125*a1a3b679SAndreas Boehler        if (!$result) {
126*a1a3b679SAndreas Boehler            $result[] = '{http://sabredav.org/ns}idk';
127*a1a3b679SAndreas Boehler        }
128*a1a3b679SAndreas Boehler        return $result;
129*a1a3b679SAndreas Boehler
130*a1a3b679SAndreas Boehler    }
131*a1a3b679SAndreas Boehler
132*a1a3b679SAndreas Boehler}
133