1<?php
2
3namespace Sabre\DAV\Xml\Property;
4
5use Sabre\Xml\Element;
6use Sabre\Xml\Reader;
7use Sabre\Xml\Writer;
8use Sabre\HTTP;
9use DateTime;
10use DateTimeZone;
11
12/**
13 * This property represents the {DAV:}getlastmodified property.
14 *
15 * Defined in:
16 * http://tools.ietf.org/html/rfc4918#section-15.7
17 *
18 * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/).
19 * @author Evert Pot (http://www.rooftopsolutions.nl/)
20 * @license http://sabre.io/license/ Modified BSD License
21 */
22class GetLastModified implements Element {
23
24    /**
25     * time
26     *
27     * @var DateTime
28     */
29    public $time;
30
31    /**
32     * Constructor
33     *
34     * @param int|DateTime $time
35     */
36    function __construct($time) {
37
38        if ($time instanceof DateTime) {
39            $this->time = clone $time;
40        } else {
41            $this->time = new DateTime('@' . $time);
42        }
43
44        // Setting timezone to UTC
45        $this->time->setTimezone(new DateTimeZone('UTC'));
46
47    }
48
49    /**
50     * getTime
51     *
52     * @return DateTime
53     */
54    function getTime() {
55
56        return $this->time;
57
58    }
59
60    /**
61     * The serialize method is called during xml writing.
62     *
63     * It should use the $writer argument to encode this object into XML.
64     *
65     * Important note: it is not needed to create the parent element. The
66     * parent element is already created, and we only have to worry about
67     * attributes, child elements and text (if any).
68     *
69     * Important note 2: If you are writing any new elements, you are also
70     * responsible for closing them.
71     *
72     * @param Writer $writer
73     * @return void
74     */
75    function xmlSerialize(Writer $writer) {
76
77        $writer->write(
78            HTTP\Util::toHTTPDate($this->time)
79        );
80
81    }
82
83    /**
84     * The deserialize method is called during xml parsing.
85     *
86     * This method is called statictly, this is because in theory this method
87     * may be used as a type of constructor, or factory method.
88     *
89     * Often you want to return an instance of the current class, but you are
90     * free to return other data as well.
91     *
92     * Important note 2: You are responsible for advancing the reader to the
93     * next element. Not doing anything will result in a never-ending loop.
94     *
95     * If you just want to skip parsing for this element altogether, you can
96     * just call $reader->next();
97     *
98     * $reader->parseInnerTree() will parse the entire sub-tree, and advance to
99     * the next element.
100     *
101     * @param Reader $reader
102     * @return mixed
103     */
104    static function xmlDeserialize(Reader $reader) {
105
106        return
107            new self(new DateTime($reader->parseInnerTree()));
108
109    }
110}
111