annotate vendor/sabre/vobject/lib/Splitter/ICalendar.php @ 41:d2414df68d78

Updated by Alex S Grebenschikov (www.poralix.com) to make it compatible with RoundCube 1.3.0
author Charlie Root
date Fri, 24 Jan 2025 14:20:15 -0500
parents 430dbd5346f7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
1 <?php
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
2
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
3 namespace Sabre\VObject\Splitter;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
4
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
5 use
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
6 Sabre\VObject,
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
7 Sabre\VObject\Component\VCalendar;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
8
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
9 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
10 * Splitter
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
11 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
12 * This class is responsible for splitting up iCalendar objects.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
13 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
14 * This class expects a single VCALENDAR object with one or more
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
15 * calendar-objects inside. Objects with identical UID's will be combined into
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
16 * a single object.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
17 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
18 * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/).
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
19 * @author Dominik Tobschall
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
20 * @author Armin Hackmann
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
21 * @license http://sabre.io/license/ Modified BSD License
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
22 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
23 class ICalendar implements SplitterInterface {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
24
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
25 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
26 * Timezones
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
27 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
28 * @var array
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
29 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
30 protected $vtimezones = array();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
31
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
32 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
33 * iCalendar objects
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
34 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
35 * @var array
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
36 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
37 protected $objects = array();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
38
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
39 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
40 * Constructor
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
41 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
42 * The splitter should receive an readable file stream as it's input.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
43 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
44 * @param resource $input
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
45 * @param int $options Parser options, see the OPTIONS constants.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
46 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
47 public function __construct($input, $options = 0) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
48
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
49 $data = VObject\Reader::read($input, $options);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
50 $vtimezones = array();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
51 $components = array();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
52
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
53 if (!$data instanceof VObject\Component\VCalendar) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
54 throw new VObject\ParseException('Supplied input could not be parsed as VCALENDAR.');
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
55 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
56
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
57 foreach($data->children() as $component) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
58 if (!$component instanceof VObject\Component) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
59 continue;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
60 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
61
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
62 // Get all timezones
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
63 if ($component->name === 'VTIMEZONE') {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
64 $this->vtimezones[(string)$component->TZID] = $component;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
65 continue;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
66 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
67
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
68 // Get component UID for recurring Events search
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
69 if(!$component->UID) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
70 $component->UID = sha1(microtime()) . '-vobjectimport';
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
71 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
72 $uid = (string)$component->UID;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
73
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
74 // Take care of recurring events
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
75 if (!array_key_exists($uid, $this->objects)) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
76 $this->objects[$uid] = new VCalendar();
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
77 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
78
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
79 $this->objects[$uid]->add(clone $component);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
80 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
81
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
82 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
83
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
84 /**
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
85 * Every time getNext() is called, a new object will be parsed, until we
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
86 * hit the end of the stream.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
87 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
88 * When the end is reached, null will be returned.
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
89 *
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
90 * @return Sabre\VObject\Component|null
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
91 */
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
92 public function getNext() {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
93
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
94 if($object=array_shift($this->objects)) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
95
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
96 // create our baseobject
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
97 $object->version = '2.0';
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
98 $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN';
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
99 $object->calscale = 'GREGORIAN';
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
100
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
101 // add vtimezone information to obj (if we have it)
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
102 foreach ($this->vtimezones as $vtimezone) {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
103 $object->add($vtimezone);
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
104 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
105
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
106 return $object;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
107
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
108 } else {
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
109
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
110 return null;
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
111
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
112 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
113
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
114 }
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
115
430dbd5346f7 vendor sabre as distributed
Charlie Root
parents:
diff changeset
116 }