plugins/libcalendaring
Thomas Brüderli
bruederli at kolabsys.com
Mon Mar 9 12:36:22 CET 2015
plugins/libcalendaring/libvcalendar.php | 45 +++++++++------
plugins/libcalendaring/tests/libvcalendar.php | 8 +-
plugins/libcalendaring/tests/resources/recurrence-id.ics | 10 +++
3 files changed, 43 insertions(+), 20 deletions(-)
New commits:
commit 83d3d016bd0d3299261bf0886538f982ad707f3a
Author: Thomas Bruederli <bruederli at kolabsys.com>
Date: Mon Mar 9 12:30:53 2015 +0100
Parse multiple vevent components with the same UID into one object with exceptions (#4733)
diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php
index 37f6224..195f99d 100644
--- a/plugins/libcalendaring/libvcalendar.php
+++ b/plugins/libcalendaring/libvcalendar.php
@@ -305,6 +305,7 @@ class libvcalendar implements Iterator
public function import_from_vobject($vobject)
{
$seen = array();
+ $exceptions = array();
if ($vobject->name == 'VCALENDAR') {
$this->method = strval($vobject->METHOD);
@@ -315,22 +316,11 @@ class libvcalendar implements Iterator
// convert to hash array representation
$object = $this->_to_array($ve);
- if (!$seen[$object['uid']]++) {
- // parse recurrence exceptions
- if ($object['recurrence']) {
- $object['recurrence']['EXCEPTIONS'] = array();
- foreach ($vobject->children as $component) {
- if ($component->name == 'VEVENT' && isset($component->{'RECURRENCE-ID'})) {
- try {
- $object['recurrence']['EXCEPTIONS'][] = $this->_to_array($component);
- }
- catch (Exception $e) {
- console("iCal data parse error: " . $e->getMessage(), $component->serialize());
- }
- }
- }
- }
-
+ // temporarily store this as exception
+ if ($object['recurrence_date']) {
+ $exceptions[] = $object;
+ }
+ else if (!$seen[$object['uid']]++) {
$this->objects[] = $object;
}
}
@@ -338,6 +328,29 @@ class libvcalendar implements Iterator
$this->objects[] = $this->_parse_freebusy($ve);
}
}
+
+ // add exceptions to the according master events
+ foreach ($exceptions as $exception) {
+ $uid = $exception['uid'];
+
+ // make this exception the master
+ if (!$seen[$uid]++) {
+ $this->objects[] = $exception;
+ }
+ else {
+ foreach ($this->objects as $i => $object) {
+ // add as exception to existing entry with a matching UID
+ if ($object['uid'] == $uid) {
+ $this->objects[$i]['exceptions'][] = $exception;
+
+ if (!empty($object['recurrence'])) {
+ $this->objects[$i]['recurrence']['EXCEPTIONS'] = &$this->objects[$i]['exceptions'];
+ }
+ break;
+ }
+ }
+ }
+ }
}
return $this->objects;
diff --git a/plugins/libcalendaring/tests/libvcalendar.php b/plugins/libcalendaring/tests/libvcalendar.php
index 9180e91..e0e8763 100644
--- a/plugins/libcalendaring/tests/libvcalendar.php
+++ b/plugins/libcalendaring/tests/libvcalendar.php
@@ -112,8 +112,6 @@ class libvcalendar_test extends PHPUnit_Framework_TestCase
/**
* Test some extended ical properties such as attendees, recurrence rules, alarms and attachments
- *
- * @depends test_import_from_file
*/
function test_extended()
{
@@ -160,11 +158,15 @@ class libvcalendar_test extends PHPUnit_Framework_TestCase
$this->assertEquals('libcalendaring tests', join(',', (array)$event['categories']), "Event categories");
$this->assertEquals('confidential', $event['sensitivity'], "Class/sensitivity = confidential");
- // parse a reccuence chain instance
+ // parse a recurrence chain instance
$events = $ical->import_from_file(__DIR__ . '/resources/recurrence-id.ics', 'UTF-8');
$this->assertEquals(1, count($events), "Fall back to Component::getComponents() when getBaseComponents() is empty");
$this->assertInstanceOf('DateTime', $events[0]['recurrence_date'], "Recurrence-ID as date");
$this->assertTrue($events[0]['thisandfuture'], "Range=THISANDFUTURE");
+
+ $this->assertEquals(count($events[0]['exceptions']), 1, "Second VEVENT as exception");
+ $this->assertEquals($events[0]['exceptions'][0]['uid'], $events[0]['uid'], "Exception UID match");
+ $this->assertEquals($events[0]['exceptions'][0]['sequence'], '2', "Exception sequence");
}
/**
diff --git a/plugins/libcalendaring/tests/resources/recurrence-id.ics b/plugins/libcalendaring/tests/resources/recurrence-id.ics
index 8229da2..af88093 100644
--- a/plugins/libcalendaring/tests/resources/recurrence-id.ics
+++ b/plugins/libcalendaring/tests/resources/recurrence-id.ics
@@ -21,11 +21,19 @@ BEGIN:VEVENT
DTSTART;TZID="W. Europe":20140230T150000
DTEND;TZID="W. Europe":20140230T163000
TRANSP:OPAQUE
-RDATE;TZID="W. Europe";VALUE=PERIOD:20140227T140000/20140227T153000
RECURRENCE-ID;RANGE=THISANDFUTURE:20140227T130000Z
SEQUENCE:0
UID:7e93e8e8eef16f28aa33b78cd73613ebff
DTSTAMP:20140120T105609Z
SUMMARY:Invitation with Recurrence-ID
END:VEVENT
+BEGIN:VEVENT
+DTSTART;TZID="W. Europe":20140305T150000
+DTEND;TZID="W. Europe":20140305T163000
+RECURRENCE-ID;TZID="W. Europe":20140305T150000
+SEQUENCE:2
+UID:7e93e8e8eef16f28aa33b78cd73613ebff
+DTSTAMP:20140120T105609Z
+SUMMARY:Invitation with Recurrence-ID #2
+END:VEVENT
END:VCALENDAR
More information about the commits
mailing list