xref: /plugin/davcal/vendor/sabre/vobject/lib/Component/VAlarm.php (revision a1a3b6794e0e143a4a8b51d3185ce2d339be61ab)
1*a1a3b679SAndreas Boehler<?php
2*a1a3b679SAndreas Boehler
3*a1a3b679SAndreas Boehlernamespace Sabre\VObject\Component;
4*a1a3b679SAndreas Boehleruse Sabre\VObject;
5*a1a3b679SAndreas Boehler
6*a1a3b679SAndreas Boehler/**
7*a1a3b679SAndreas Boehler * VAlarm component
8*a1a3b679SAndreas Boehler *
9*a1a3b679SAndreas Boehler * This component contains some additional functionality specific for VALARMs.
10*a1a3b679SAndreas Boehler *
11*a1a3b679SAndreas Boehler * @copyright Copyright (C) 2011-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 VAlarm extends VObject\Component {
16*a1a3b679SAndreas Boehler
17*a1a3b679SAndreas Boehler    /**
18*a1a3b679SAndreas Boehler     * Returns a DateTime object when this alarm is going to trigger.
19*a1a3b679SAndreas Boehler     *
20*a1a3b679SAndreas Boehler     * This ignores repeated alarm, only the first trigger is returned.
21*a1a3b679SAndreas Boehler     *
22*a1a3b679SAndreas Boehler     * @return DateTime
23*a1a3b679SAndreas Boehler     */
24*a1a3b679SAndreas Boehler    public function getEffectiveTriggerTime() {
25*a1a3b679SAndreas Boehler
26*a1a3b679SAndreas Boehler        $trigger = $this->TRIGGER;
27*a1a3b679SAndreas Boehler        if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') {
28*a1a3b679SAndreas Boehler            $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER);
29*a1a3b679SAndreas Boehler            $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START';
30*a1a3b679SAndreas Boehler
31*a1a3b679SAndreas Boehler            $parentComponent = $this->parent;
32*a1a3b679SAndreas Boehler            if ($related === 'START') {
33*a1a3b679SAndreas Boehler
34*a1a3b679SAndreas Boehler                if ($parentComponent->name === 'VTODO') {
35*a1a3b679SAndreas Boehler                    $propName = 'DUE';
36*a1a3b679SAndreas Boehler                } else {
37*a1a3b679SAndreas Boehler                    $propName = 'DTSTART';
38*a1a3b679SAndreas Boehler                }
39*a1a3b679SAndreas Boehler
40*a1a3b679SAndreas Boehler                $effectiveTrigger = clone $parentComponent->$propName->getDateTime();
41*a1a3b679SAndreas Boehler                $effectiveTrigger->add($triggerDuration);
42*a1a3b679SAndreas Boehler            } else {
43*a1a3b679SAndreas Boehler                if ($parentComponent->name === 'VTODO') {
44*a1a3b679SAndreas Boehler                    $endProp = 'DUE';
45*a1a3b679SAndreas Boehler                } elseif ($parentComponent->name === 'VEVENT') {
46*a1a3b679SAndreas Boehler                    $endProp = 'DTEND';
47*a1a3b679SAndreas Boehler                } else {
48*a1a3b679SAndreas Boehler                    throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT');
49*a1a3b679SAndreas Boehler                }
50*a1a3b679SAndreas Boehler
51*a1a3b679SAndreas Boehler                if (isset($parentComponent->$endProp)) {
52*a1a3b679SAndreas Boehler                    $effectiveTrigger = clone $parentComponent->$endProp->getDateTime();
53*a1a3b679SAndreas Boehler                    $effectiveTrigger->add($triggerDuration);
54*a1a3b679SAndreas Boehler                } elseif (isset($parentComponent->DURATION)) {
55*a1a3b679SAndreas Boehler                    $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
56*a1a3b679SAndreas Boehler                    $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION);
57*a1a3b679SAndreas Boehler                    $effectiveTrigger->add($duration);
58*a1a3b679SAndreas Boehler                    $effectiveTrigger->add($triggerDuration);
59*a1a3b679SAndreas Boehler                } else {
60*a1a3b679SAndreas Boehler                    $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
61*a1a3b679SAndreas Boehler                    $effectiveTrigger->add($triggerDuration);
62*a1a3b679SAndreas Boehler                }
63*a1a3b679SAndreas Boehler            }
64*a1a3b679SAndreas Boehler        } else {
65*a1a3b679SAndreas Boehler            $effectiveTrigger = $trigger->getDateTime();
66*a1a3b679SAndreas Boehler        }
67*a1a3b679SAndreas Boehler        return $effectiveTrigger;
68*a1a3b679SAndreas Boehler
69*a1a3b679SAndreas Boehler    }
70*a1a3b679SAndreas Boehler
71*a1a3b679SAndreas Boehler    /**
72*a1a3b679SAndreas Boehler     * Returns true or false depending on if the event falls in the specified
73*a1a3b679SAndreas Boehler     * time-range. This is used for filtering purposes.
74*a1a3b679SAndreas Boehler     *
75*a1a3b679SAndreas Boehler     * The rules used to determine if an event falls within the specified
76*a1a3b679SAndreas Boehler     * time-range is based on the CalDAV specification.
77*a1a3b679SAndreas Boehler     *
78*a1a3b679SAndreas Boehler     * @param \DateTime $start
79*a1a3b679SAndreas Boehler     * @param \DateTime $end
80*a1a3b679SAndreas Boehler     * @return bool
81*a1a3b679SAndreas Boehler     */
82*a1a3b679SAndreas Boehler    public function isInTimeRange(\DateTime $start, \DateTime $end) {
83*a1a3b679SAndreas Boehler
84*a1a3b679SAndreas Boehler        $effectiveTrigger = $this->getEffectiveTriggerTime();
85*a1a3b679SAndreas Boehler
86*a1a3b679SAndreas Boehler        if (isset($this->DURATION)) {
87*a1a3b679SAndreas Boehler            $duration = VObject\DateTimeParser::parseDuration($this->DURATION);
88*a1a3b679SAndreas Boehler            $repeat = (string)$this->repeat;
89*a1a3b679SAndreas Boehler            if (!$repeat) {
90*a1a3b679SAndreas Boehler                $repeat = 1;
91*a1a3b679SAndreas Boehler            }
92*a1a3b679SAndreas Boehler
93*a1a3b679SAndreas Boehler            $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat);
94*a1a3b679SAndreas Boehler
95*a1a3b679SAndreas Boehler            foreach($period as $occurrence) {
96*a1a3b679SAndreas Boehler
97*a1a3b679SAndreas Boehler                if ($start <= $occurrence && $end > $occurrence) {
98*a1a3b679SAndreas Boehler                    return true;
99*a1a3b679SAndreas Boehler                }
100*a1a3b679SAndreas Boehler            }
101*a1a3b679SAndreas Boehler            return false;
102*a1a3b679SAndreas Boehler        } else {
103*a1a3b679SAndreas Boehler            return ($start <= $effectiveTrigger && $end > $effectiveTrigger);
104*a1a3b679SAndreas Boehler        }
105*a1a3b679SAndreas Boehler
106*a1a3b679SAndreas Boehler    }
107*a1a3b679SAndreas Boehler
108*a1a3b679SAndreas Boehler    /**
109*a1a3b679SAndreas Boehler     * A simple list of validation rules.
110*a1a3b679SAndreas Boehler     *
111*a1a3b679SAndreas Boehler     * This is simply a list of properties, and how many times they either
112*a1a3b679SAndreas Boehler     * must or must not appear.
113*a1a3b679SAndreas Boehler     *
114*a1a3b679SAndreas Boehler     * Possible values per property:
115*a1a3b679SAndreas Boehler     *   * 0 - Must not appear.
116*a1a3b679SAndreas Boehler     *   * 1 - Must appear exactly once.
117*a1a3b679SAndreas Boehler     *   * + - Must appear at least once.
118*a1a3b679SAndreas Boehler     *   * * - Can appear any number of times.
119*a1a3b679SAndreas Boehler     *   * ? - May appear, but not more than once.
120*a1a3b679SAndreas Boehler     *
121*a1a3b679SAndreas Boehler     * @var array
122*a1a3b679SAndreas Boehler     */
123*a1a3b679SAndreas Boehler    public function getValidationRules() {
124*a1a3b679SAndreas Boehler
125*a1a3b679SAndreas Boehler        return array(
126*a1a3b679SAndreas Boehler            'ACTION' => 1,
127*a1a3b679SAndreas Boehler            'TRIGGER' => 1,
128*a1a3b679SAndreas Boehler
129*a1a3b679SAndreas Boehler            'DURATION' => '?',
130*a1a3b679SAndreas Boehler            'REPEAT' => '?',
131*a1a3b679SAndreas Boehler
132*a1a3b679SAndreas Boehler            'ATTACH' => '?',
133*a1a3b679SAndreas Boehler        );
134*a1a3b679SAndreas Boehler
135*a1a3b679SAndreas Boehler    }
136*a1a3b679SAndreas Boehler
137*a1a3b679SAndreas Boehler}
138