/** * Imports a single message * * @param string $id * @param SyncObject $message * * @access public * @return boolean */ public function ImportMessageChange($id, $message) { // ignore other SyncObjects if (!$message instanceof $this->classAsString) { return false; } // KOE ZO-42: to sync Notes to Outlook we sync them as Appointments if ($this->classAsString == "SyncNote") { if (KOE_CAPABILITY_NOTES && ZPush::GetDeviceManager()->IsKoe()) { // update category from SyncNote->Color $message->SetCategoryFromColor(); $appointment = new SyncAppointment(); $appointment->busystatus = 0; $appointment->sensitivity = 0; $appointment->alldayevent = 0; $appointment->reminder = 0; $appointment->meetingstatus = 0; $appointment->responserequested = 0; $appointment->flags = $message->flags; if (isset($message->asbody)) { $appointment->asbody = $message->asbody; } if (isset($message->categories)) { $appointment->categories = $message->categories; } if (isset($message->subject)) { $appointment->subject = $message->subject; } if (isset($message->lastmodified)) { $appointment->dtstamp = $message->lastmodified; } $appointment->starttime = time(); $appointment->endtime = $appointment->starttime + 1; $message = $appointment; } else { if (Request::IsOutlook()) { ZLog::Write(LOGLEVEL_WARN, "MS Outlook is synchronizing Notes folder without active KOE settings or extension. Not streaming SyncNote change!"); return false; } } } // prevent sending the same object twice in one request if (in_array($id, $this->seenObjects)) { ZLog::Write(LOGLEVEL_DEBUG, sprintf("Object '%s' discarded! Object already sent in this request.", $id)); return true; } $this->importedMsgs++; $this->seenObjects[] = $id; // checks if the next message may cause a loop or is broken if (ZPush::GetDeviceManager()->DoNotStreamMessage($id, $message)) { ZLog::Write(LOGLEVEL_DEBUG, sprintf("ImportChangesStream->ImportMessageChange('%s'): message ignored and requested to be removed from mobile", $id)); // this is an internal operation & should not trigger an update in the device manager $this->checkForIgnoredMessages = false; $stat = $this->ImportMessageDeletion($id); $this->checkForIgnoredMessages = true; return $stat; } // KOE ZO-3: Stream reply/forward flag and time as additional category to KOE if (ZPush::GetDeviceManager()->IsKoe() && KOE_CAPABILITY_RECEIVEFLAGS && isset($message->lastverbexectime) && isset($message->lastverbexecuted) && $message->lastverbexecuted > 0) { ZLog::Write(LOGLEVEL_DEBUG, "ImportChangesStream->ImportMessageChange('%s'): KOE detected. Adding LastVerb information as category."); if (!isset($message->categories)) { $message->categories = array(); } $s = "Push: Email "; if ($message->lastverbexecuted == 1) { $s .= "replied"; } elseif ($message->lastverbexecuted == 2) { $s .= "replied-to-all"; } elseif ($message->lastverbexecuted == 3) { $s .= "forwarded"; } $s .= " on " . gmdate("d-m-Y H:i:s", $message->lastverbexectime) . " GMT"; $message->categories[] = $s; } if ($message->flags === false || $message->flags === SYNC_NEWMESSAGE) { $this->encoder->startTag(SYNC_ADD); } else { // on update of an SyncEmail we only export the flags and categories if ($message instanceof SyncMail && (isset($message->flag) && $message->flag instanceof SyncMailFlags || isset($message->categories))) { $newmessage = new SyncMail(); $newmessage->read = $message->read; if (isset($message->flag)) { $newmessage->flag = $message->flag; } if (isset($message->lastverbexectime)) { $newmessage->lastverbexectime = $message->lastverbexectime; } if (isset($message->lastverbexecuted)) { $newmessage->lastverbexecuted = $message->lastverbexecuted; } if (isset($message->categories)) { $newmessage->categories = $message->categories; } $message = $newmessage; unset($newmessage); ZLog::Write(LOGLEVEL_DEBUG, sprintf("ImportChangesStream->ImportMessageChange('%s'): SyncMail message updated. Message content is striped, only flags/categories are streamed.", $id)); } $this->encoder->startTag(SYNC_MODIFY); } // TAG: SYNC_ADD / SYNC_MODIFY $this->encoder->startTag(SYNC_SERVERENTRYID); $this->encoder->content($id); $this->encoder->endTag(); $this->encoder->startTag(SYNC_DATA); $message->Encode($this->encoder); $this->encoder->endTag(); $this->encoder->endTag(); return true; }