1<?php
2
3namespace Sabre\DAV\Xml\Request;
4
5use Sabre\DAV\Locks\LockInfo;
6use Sabre\Xml\Element\KeyValue;
7use Sabre\Xml\Reader;
8use Sabre\Xml\XmlDeserializable;
9
10/**
11 * WebDAV LOCK request parser.
12 *
13 * This class parses the {DAV:}lockinfo request, as defined in:
14 *
15 * http://tools.ietf.org/html/rfc4918#section-9.10
16 *
17 * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
18 * @author Evert Pot (http://evertpot.com/)
19 * @license http://sabre.io/license/ Modified BSD License
20 */
21class Lock implements XmlDeserializable {
22
23    /**
24     * Owner of the lock
25     *
26     * @var string
27     */
28    public $owner;
29
30    /**
31     * Scope of the lock.
32     *
33     * Either LockInfo::SHARED or LockInfo::EXCLUSIVE
34     * @var int
35     */
36    public $scope;
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        $reader->pushContext();
62        $reader->elementMap['{DAV:}owner'] = 'Sabre\\Xml\\Element\\XmlFragment';
63
64        $values = KeyValue::xmlDeserialize($reader);
65
66        $reader->popContext();
67
68        $new = new self();
69        $new->owner = !empty($values['{DAV:}owner']) ? $values['{DAV:}owner']->getXml() : null;
70        $new->scope = LockInfo::SHARED;
71
72        if (isset($values['{DAV:}lockscope'])) {
73            foreach ($values['{DAV:}lockscope'] as $elem) {
74                if ($elem['name'] === '{DAV:}exclusive') $new->scope = LockInfo::EXCLUSIVE;
75            }
76        }
77        return $new;
78
79    }
80
81}
82