Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117928026
D4481.1775457292.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
5 KB
Referenced Files
None
Subscribers
None
D4481.1775457292.diff
View Options
diff --git a/lib/kolab_sync_data_calendar.php b/lib/kolab_sync_data_calendar.php
--- a/lib/kolab_sync_data_calendar.php
+++ b/lib/kolab_sync_data_calendar.php
@@ -184,6 +184,7 @@
$event = is_array($serverId) ? $serverId : $this->getObject($collection->collectionId, $serverId);
$config = $this->getFolderConfig($event['_mailbox']);
$result = array();
+ $is_outlook = stripos($this->device->devicetype, 'outlook') !== false;
// Kolab Format 3.0 and xCal does support timezone per-date, but ActiveSync allows
// only one timezone per-event. We'll use timezone of the start date
@@ -231,7 +232,7 @@
break;
case 'free_busy':
- if (!empty($value)) {
+ if (!$is_outlook && !empty($value)) {
$value = $this->busyStatusMap[$value];
}
break;
@@ -314,6 +315,17 @@
if ($email && in_array_nocase($email, $user_emails)) {
$user_rsvp = !empty($attendee['rsvp']);
$resp_type = $status ?: self::ATTENDEE_STATUS_UNKNOWN;
+
+ // Synchronize the attendee status to the event status to get the same behaviour as outlook.
+ if ($is_outlook) {
+ if ($attendee['status'] == 'ACCEPTED') {
+ $result['busyStatus'] = self::BUSY_STATUS_BUSY;
+ }
+ if ($attendee['status'] == 'TENTATIVE') {
+ $result['busyStatus'] = self::BUSY_STATUS_TENTATIVE;
+ }
+ }
+
}
$result['attendees'][] = new Syncroton_Model_EventAttendee($att);
@@ -438,6 +450,11 @@
break;
case 'free_busy':
+ // Outlook sets the busy state to the attendance state, and we don't want to change the event state based on that.
+ // Outlook doesn't have the concept of an event state, so we just ignore this.
+ if ($is_outlook) {
+ continue 2;
+ }
$map = array_flip($this->busyStatusMap);
$value = isset($map[$value]) ? $map[$value] : null;
break;
@@ -545,6 +562,22 @@
}
}
+ // Outlook does not send the correct attendee status when changing between accepted and tentative, but it toggles the busyStatus.
+ if ($is_outlook) {
+ $status = null;
+ if ($data->busyStatus == self::BUSY_STATUS_BUSY) {
+ $status = "ACCEPTED";
+ } else if ($data->busyStatus == self::BUSY_STATUS_TENTATIVE) {
+ $status = "TENTATIVE";
+ }
+
+ if ($status) {
+ $this->logger->debug("Updating our attendee status based on the busy status to {$status}.");
+ $emails = $this->user_emails();
+ $this->find_and_update_attendee_status($attendees, $status, $emails);
+ }
+ }
+
if (!$is_exception) {
// Make sure the event has the organizer set
if (!$organizer_email && ($identity = kolab_sync::get_instance()->user->get_identity())) {
@@ -560,6 +593,7 @@
}
$event['attendees'] = $attendees;
+
$event['categories'] = $categories;
$event['exceptions'] = isset($event['recurrence']['EXCEPTIONS']) ? $event['recurrence']['EXCEPTIONS'] : array();
@@ -809,25 +843,33 @@
}
/**
- * Update the attendee status of the user
+ * Update the attendee status of the user matching $emails
*/
- protected function update_attendee_status(&$event, $status)
+ protected function find_and_update_attendee_status(&$attendees, $status, $emails)
{
- $emails = $this->user_emails();
-
- foreach ((array) $event['attendees'] as $i => $attendee) {
+ $found = false;
+ foreach ((array) $attendees as $i => $attendee) {
if (!empty($attendee['email'])
&& (empty($attendee['role']) || $attendee['role'] != 'ORGANIZER')
&& in_array_nocase($attendee['email'], $emails)
) {
- $event['attendees'][$i]['status'] = $status;
- $event['attendees'][$i]['rsvp'] = false;
- $event_attendee = $attendee;
+ $attendees[$i]['status'] = $status;
+ $attendees[$i]['rsvp'] = false;
$this->logger->debug('Updating existing attendee: ' . $attendee['email'] . ' status: ' . $status);
+ $found = true;
}
}
+ return $found;
+ }
+
+ /**
+ * Update the attendee status of the user
+ */
+ protected function update_attendee_status(&$event, $status)
+ {
+ $emails = $this->user_emails();
- if (empty($event_attendee)) {
+ if (!$this->find_and_update_attendee_status($event['attendees'], $status, $emails)) {
$this->logger->debug('Adding new attendee ' . $emails[0] . ' status: ' . $status);
// Add the user to the attendees list
$event['attendees'][] = array(
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Apr 6, 6:34 AM (8 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18822987
Default Alt Text
D4481.1775457292.diff (5 KB)
Attached To
Mode
D4481: Update our attendee status based on the busyStatus
Attached
Detach File
Event Timeline