function __construct() { $mapping = array(SYNC_AIRSYNCBASE_TYPE => array(self::STREAMER_VAR => "type"), SYNC_AIRSYNCBASE_ESTIMATEDDATASIZE => array(self::STREAMER_VAR => "estimatedDataSize"), SYNC_AIRSYNCBASE_TRUNCATED => array(self::STREAMER_VAR => "truncated"), SYNC_AIRSYNCBASE_DATA => array(self::STREAMER_VAR => "data", self::STREAMER_TYPE => self::STREAMER_TYPE_STREAM_ASPLAIN, self::STREAMER_RONOTIFY => true)); if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_AIRSYNCBASE_PREVIEW] = array(self::STREAMER_VAR => "preview"); } parent::__construct($mapping); }
function __construct() { $mapping = array(SYNC_POOMMAIL_ALLDAYEVENT => array(self::STREAMER_VAR => "alldayevent", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_ZEROORONE => self::STREAMER_CHECK_SETZERO)), SYNC_POOMMAIL_STARTTIME => array(self::STREAMER_VAR => "starttime", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO, self::STREAMER_CHECK_CMPLOWER => SYNC_POOMMAIL_ENDTIME)), SYNC_POOMMAIL_DTSTAMP => array(self::STREAMER_VAR => "dtstamp", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO)), SYNC_POOMMAIL_ENDTIME => array(self::STREAMER_VAR => "endtime", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES, self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETONE, self::STREAMER_CHECK_CMPHIGHER => SYNC_POOMMAIL_STARTTIME)), SYNC_POOMMAIL_INSTANCETYPE => array(self::STREAMER_VAR => "instancetype", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO, self::STREAMER_CHECK_ONEVALUEOF => array(0, 1, 2, 3))), SYNC_POOMMAIL_LOCATION => array(self::STREAMER_VAR => "location"), SYNC_POOMMAIL_ORGANIZER => array(self::STREAMER_VAR => "organizer", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETEMPTY)), SYNC_POOMMAIL_RECURRENCEID => array(self::STREAMER_VAR => "recurrenceid", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMMAIL_REMINDER => array(self::STREAMER_VAR => "reminder", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_CMPHIGHER => -1)), SYNC_POOMMAIL_RESPONSEREQUESTED => array(self::STREAMER_VAR => "responserequested"), SYNC_POOMMAIL_RECURRENCES => array(self::STREAMER_VAR => "recurrences", self::STREAMER_TYPE => "SyncMeetingRequestRecurrence", self::STREAMER_ARRAY => SYNC_POOMMAIL_RECURRENCE), SYNC_POOMMAIL_SENSITIVITY => array(self::STREAMER_VAR => "sensitivity", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO, self::STREAMER_CHECK_ONEVALUEOF => array(0, 1, 2, 3))), SYNC_POOMMAIL_BUSYSTATUS => array(self::STREAMER_VAR => "busystatus", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETTWO, self::STREAMER_CHECK_ONEVALUEOF => array(0, 1, 2, 3, 4))), SYNC_POOMMAIL_TIMEZONE => array(self::STREAMER_VAR => "timezone", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => base64_encode(pack("la64vvvvvvvv" . "la64vvvvvvvv" . "l", 0, "", 0, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, 0, 0, 0, 0, 0, 0, 0)))), SYNC_POOMMAIL_GLOBALOBJID => array(self::STREAMER_VAR => "globalobjid")); if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_POOMMAIL_DISALLOWNEWTIMEPROPOSAL] = array(self::STREAMER_VAR => "disallownewtimeproposal", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO, self::STREAMER_CHECK_ONEVALUEOF => array(0, 1))); } parent::__construct($mapping); }
function SyncBaseBody() { $mapping = array(SYNC_AIRSYNCBASE_TYPE => array(self::STREAMER_VAR => "type"), SYNC_AIRSYNCBASE_ESTIMATEDDATASIZE => array(self::STREAMER_VAR => "estimatedDataSize"), SYNC_AIRSYNCBASE_TRUNCATED => array(self::STREAMER_VAR => "truncated"), SYNC_AIRSYNCBASE_DATA => array(self::STREAMER_VAR => "data")); if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_AIRSYNCBASE_PREVIEW] = array(self::STREAMER_VAR => "preview"); } parent::SyncObject($mapping); }
function __construct() { $mapping = array(SYNC_POOMMAIL_TYPE => array(self::STREAMER_VAR => "type", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO, self::STREAMER_CHECK_ONEVALUEOF => array(0, 1, 2, 3, 5, 6))), SYNC_POOMMAIL_UNTIL => array(self::STREAMER_VAR => "until", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE), SYNC_POOMMAIL_OCCURRENCES => array(self::STREAMER_VAR => "occurrences", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_CMPHIGHER => 0, self::STREAMER_CHECK_CMPLOWER => 1000)), SYNC_POOMMAIL_INTERVAL => array(self::STREAMER_VAR => "interval", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_CMPHIGHER => 0, self::STREAMER_CHECK_CMPLOWER => 1000)), SYNC_POOMMAIL_DAYOFWEEK => array(self::STREAMER_VAR => "dayofweek", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_CMPHIGHER => 0, self::STREAMER_CHECK_CMPLOWER => 128)), SYNC_POOMMAIL_DAYOFMONTH => array(self::STREAMER_VAR => "dayofmonth", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_CMPHIGHER => 0, self::STREAMER_CHECK_CMPLOWER => 32)), SYNC_POOMMAIL_WEEKOFMONTH => array(self::STREAMER_VAR => "weekofmonth", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_ONEVALUEOF => array(1, 2, 3, 4, 5))), SYNC_POOMMAIL_MONTHOFYEAR => array(self::STREAMER_VAR => "monthofyear", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_ONEVALUEOF => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)))); if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_POOMMAIL2_CALENDARTYPE] = array(self::STREAMER_VAR => "calendartype"); } parent::__construct($mapping); }
function SyncAttendee() { $mapping = array(SYNC_POOMCAL_EMAIL => array(self::STREAMER_VAR => "email", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETEMPTY)), SYNC_POOMCAL_NAME => array(self::STREAMER_VAR => "name", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETEMPTY))); if (Request::GetProtocolVersion() >= 12.0) { $mapping[SYNC_POOMCAL_ATTENDEESTATUS] = array(self::STREAMER_VAR => "attendeestatus"); $mapping[SYNC_POOMCAL_ATTENDEETYPE] = array(self::STREAMER_VAR => "attendeetype"); } parent::SyncObject($mapping); }
function __construct() { $mapping = array(SYNC_POOMCAL_EMAIL => array(self::STREAMER_VAR => "email", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETEMPTY), self::STREAMER_RONOTIFY => true), SYNC_POOMCAL_NAME => array(self::STREAMER_VAR => "name", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETEMPTY), self::STREAMER_RONOTIFY => true)); if (Request::GetProtocolVersion() >= 12.0) { $mapping[SYNC_POOMCAL_ATTENDEESTATUS] = array(self::STREAMER_VAR => "attendeestatus", self::STREAMER_RONOTIFY => true); $mapping[SYNC_POOMCAL_ATTENDEETYPE] = array(self::STREAMER_VAR => "attendeetype", self::STREAMER_RONOTIFY => true); } parent::__construct($mapping); }
public function __construct() { $mapping = array(); if (Request::GetProtocolVersion() >= 14.1) { $mapping[SYNC_RESOLVERECIPIENTS_MAXSIZE] = array(self::STREAMER_VAR => "maxsize"); $mapping[SYNC_RESOLVERECIPIENTS_MAXPICTURES] = array(self::STREAMER_VAR => "maxpictures"); $mapping[SYNC_RESOLVERECIPIENTS_STATUS] = array(self::STREAMER_VAR => "status"); $mapping[SYNC_RESOLVERECIPIENTS_DATA] = array(self::STREAMER_VAR => "data", self::STREAMER_TYPE => self::STREAMER_TYPE_STREAM_ASBASE64); } parent::__construct($mapping); }
public function __construct() { $mapping = array(SYNC_RESOLVERECIPIENTS_TYPE => array(self::STREAMER_VAR => "type"), SYNC_RESOLVERECIPIENTS_DISPLAYNAME => array(self::STREAMER_VAR => "displayname"), SYNC_RESOLVERECIPIENTS_EMAILADDRESS => array(self::STREAMER_VAR => "emailaddress"), SYNC_RESOLVERECIPIENTS_CERTIFICATES => array(self::STREAMER_VAR => "certificates", self::STREAMER_TYPE => "SyncResolveRecipientsCertificates")); if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_RESOLVERECIPIENTS_AVAILABILITY] = array(self::STREAMER_VAR => "availability", self::STREAMER_TYPE => "SyncResolveRecipientsAvailability"); } if (Request::GetProtocolVersion() >= 14.1) { $mapping[SYNC_RESOLVERECIPIENTS_PICTURE] = array(self::STREAMER_VAR => "picture", self::STREAMER_TYPE => "SyncResolveRecipientsPicture"); } parent::__construct($mapping); }
public function SyncUserInformation() { $mapping = array(SYNC_SETTINGS_ACCOUNTID => array(self::STREAMER_VAR => "accountid"), SYNC_SETTINGS_ACCOUNTNAME => array(self::STREAMER_VAR => "accountname"), SYNC_SETTINGS_EMAILADDRESSES => array(self::STREAMER_VAR => "emailaddresses", self::STREAMER_ARRAY => SYNC_SETTINGS_SMPTADDRESS), SYNC_SETTINGS_PROP_STATUS => array(self::STREAMER_VAR => "Status", self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE)); if (Request::GetProtocolVersion() >= 12.1) { $mapping[SYNC_SETTINGS_USERDISPLAYNAME] = array(self::STREAMER_VAR => "userdisplayname"); } if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_SETTINGS_SENDDISABLED] = array(self::STREAMER_VAR => "senddisabled"); } parent::SyncObject($mapping); }
public function __construct() { $mapping = array(); if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_RESOLVERECIPIENTS_STARTTIME] = array(self::STREAMER_VAR => "starttime"); $mapping[SYNC_RESOLVERECIPIENTS_ENDTIME] = array(self::STREAMER_VAR => "endtime"); $mapping[SYNC_RESOLVERECIPIENTS_STATUS] = array(self::STREAMER_VAR => "status"); $mapping[SYNC_RESOLVERECIPIENTS_MERGEDFREEBUSY] = array(self::STREAMER_VAR => "mergedfreebusy"); } parent::__construct($mapping); }
public function SyncDeviceInformation() { $mapping = array(SYNC_SETTINGS_MODEL => array(self::STREAMER_VAR => "model"), SYNC_SETTINGS_IMEI => array(self::STREAMER_VAR => "imei"), SYNC_SETTINGS_FRIENDLYNAME => array(self::STREAMER_VAR => "friendlyname"), SYNC_SETTINGS_OS => array(self::STREAMER_VAR => "os"), SYNC_SETTINGS_OSLANGUAGE => array(self::STREAMER_VAR => "oslanguage"), SYNC_SETTINGS_PHONENUMBER => array(self::STREAMER_VAR => "phonenumber"), SYNC_SETTINGS_PROP_STATUS => array(self::STREAMER_VAR => "Status", self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE)); if (Request::GetProtocolVersion() >= 12.1) { $mapping[SYNC_SETTINGS_USERAGENT] = array(self::STREAMER_VAR => "useragent"); } if (Request::GetProtocolVersion() >= 14.0) { $mapping[SYNC_SETTINGS_MOBILEOPERATOR] = array(self::STREAMER_VAR => "mobileoperator"); $mapping[SYNC_SETTINGS_ENABLEOUTBOUNDSMS] = array(self::STREAMER_VAR => "enableoutboundsms"); } parent::SyncObject($mapping); }
/** * Method checks if the object has the minimum of required parameters * and fullfills semantic dependencies * * This overloads the general check() with special checks to be executed * * @param boolean $logAsDebug (opt) default is false, so messages are logged in WARN log level * * @access public * @return boolean */ public function Check($logAsDebug = false) { $ret = parent::Check($logAsDebug); if (!$ret) { return false; } if (isset($this->start) && isset($this->until) && $this->until < $this->start) { ZLog::Write(LOGLEVEL_WARN, sprintf("SyncObject->Check(): Unmet condition in object from type %s: parameter 'start' is HIGHER than 'until'. Check failed!", get_class($this))); return false; } return true; }
/** * Method checks if the object has the minimum of required parameters * and fullfills semantic dependencies * * This overloads the general check() with special checks to be executed * * @param boolean $logAsDebug (opt) default is false, so messages are logged in WARN log level * * @access public * @return boolean */ public function Check($logAsDebug = false) { $ret = parent::Check($logAsDebug); // semantic checks general "turn off switch" if (defined("DO_SEMANTIC_CHECKS") && DO_SEMANTIC_CHECKS === false) { return $ret; } if (!$ret) { return false; } if (isset($this->start) && isset($this->until) && $this->until < $this->start) { ZLog::Write(LOGLEVEL_WARN, sprintf("SyncObject->Check(): Unmet condition in object from type %s: parameter 'start' is HIGHER than 'until'. Check failed!", get_class($this))); return false; } return true; }
/** * Imports a message * * @param SyncParameters $spa SyncParameters object * @param array $actiondata Actiondata array * @param integer $todo WBXML flag indicating how message should be imported. * Valid values: SYNC_ADD, SYNC_MODIFY, SYNC_REMOVE * @param SyncObject $message SyncObject message to be imported * @param string $clientid Client message identifier * @param string $serverid Server message identifier * @param string $foldertype On sms sync, this says "SMS", else false * @param integer $messageCount Counter of already imported messages * * @access private * @throws StatusException in case the importer is not available * @return - Message related status are returned in the actiondata. */ private function importMessage($spa, &$actiondata, $todo, $message, $clientid, $serverid, $foldertype, $messageCount) { // the importer needs to be available! if ($this->importer == false) { throw StatusException("Sync->importMessage(): importer not available", SYNC_STATUS_SERVERERROR); } // mark this state as used, e.g. for HeartBeat self::$deviceManager->SetHeartbeatStateIntegrity($spa->GetFolderId(), $spa->GetUuid(), $spa->GetUuidCounter()); // Detect incoming loop // messages which were created/removed before will not have the same action executed again // if a message is edited we perform this action "again", as the message could have been changed on the mobile in the meantime $ignoreMessage = false; if ($actiondata["failstate"]) { // message was ADDED before, do NOT add it again if ($todo == SYNC_ADD && isset($actiondata["failstate"]["clientids"][$clientid])) { $ignoreMessage = true; // make sure no messages are sent back self::$deviceManager->SetWindowSize($spa->GetFolderId(), 0); $actiondata["clientids"][$clientid] = $actiondata["failstate"]["clientids"][$clientid]; $actiondata["statusids"][$clientid] = $actiondata["failstate"]["statusids"][$clientid]; ZLog::Write(LOGLEVEL_WARN, sprintf("Mobile loop detected! Incoming new message '%s' was created on the server before. Replying with known new server id: %s", $clientid, $actiondata["clientids"][$clientid])); } // message was REMOVED before, do NOT attemp to remove it again if ($todo == SYNC_REMOVE && isset($actiondata["failstate"]["removeids"][$serverid])) { $ignoreMessage = true; // make sure no messages are sent back self::$deviceManager->SetWindowSize($spa->GetFolderId(), 0); $actiondata["removeids"][$serverid] = $actiondata["failstate"]["removeids"][$serverid]; $actiondata["statusids"][$serverid] = $actiondata["failstate"]["statusids"][$serverid]; ZLog::Write(LOGLEVEL_WARN, sprintf("Mobile loop detected! Message '%s' was deleted by the mobile before. Replying with known status: %s", $clientid, $actiondata["statusids"][$serverid])); } } if (!$ignoreMessage) { switch ($todo) { case SYNC_MODIFY: self::$topCollector->AnnounceInformation(sprintf("Saving modified message %d", $messageCount)); try { $actiondata["modifyids"][] = $serverid; // ignore sms messages if ($foldertype == "SMS" || stripos($serverid, self::ZPUSHIGNORESMS) !== false) { ZLog::Write(LOGLEVEL_DEBUG, "SMS sync are not supported. Ignoring message."); // TODO we should update the SMS $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; } else { if (!$message instanceof SyncObject || !$message->Check(true)) { $actiondata["statusids"][$serverid] = SYNC_STATUS_CLIENTSERVERCONVERSATIONERROR; } else { if (isset($message->read)) { // Currently, 'read' is only sent by the PDA when it is ONLY setting the read flag. $this->importer->ImportMessageReadFlag($serverid, $message->read); } elseif (!isset($message->flag)) { $this->importer->ImportMessageChange($serverid, $message); } // email todoflags - some devices send todos flags together with read flags, // so they have to be handled separately if (isset($message->flag)) { $this->importer->ImportMessageChange($serverid, $message); } $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; } } } catch (StatusException $stex) { $actiondata["statusids"][$serverid] = $stex->getCode(); } break; case SYNC_ADD: self::$topCollector->AnnounceInformation(sprintf("Creating new message from mobile %d", $messageCount)); try { // ignore sms messages if ($foldertype == "SMS") { ZLog::Write(LOGLEVEL_DEBUG, "SMS sync are not supported. Ignoring message."); // TODO we should create the SMS // return a fake serverid which we can identify later $actiondata["clientids"][$clientid] = self::ZPUSHIGNORESMS . $clientid; $actiondata["statusids"][$clientid] = SYNC_STATUS_SUCCESS; } else { if (!$message instanceof SyncObject || !$message->Check(true)) { $actiondata["clientids"][$clientid] = false; $actiondata["statusids"][$clientid] = SYNC_STATUS_CLIENTSERVERCONVERSATIONERROR; } else { $actiondata["clientids"][$clientid] = false; $actiondata["clientids"][$clientid] = $this->importer->ImportMessageChange(false, $message); $actiondata["statusids"][$clientid] = SYNC_STATUS_SUCCESS; } } } catch (StatusException $stex) { $actiondata["statusids"][$clientid] = $stex->getCode(); } break; case SYNC_REMOVE: self::$topCollector->AnnounceInformation(sprintf("Deleting message removed on mobile %d", $messageCount)); try { $actiondata["removeids"][] = $serverid; // ignore sms messages if ($foldertype == "SMS" || stripos($serverid, self::ZPUSHIGNORESMS) !== false) { ZLog::Write(LOGLEVEL_DEBUG, "SMS sync are not supported. Ignoring message."); // TODO we should delete the SMS $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; } else { // if message deletions are to be moved, move them if ($spa->GetDeletesAsMoves()) { $folderid = self::$backend->GetWasteBasket(); if ($folderid) { $this->importer->ImportMessageMove($serverid, $folderid); $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; break; } else { ZLog::Write(LOGLEVEL_WARN, "Message should be moved to WasteBasket, but the Backend did not return a destination ID. Message is hard deleted now!"); } } $this->importer->ImportMessageDeletion($serverid); $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; } } catch (StatusException $stex) { $actiondata["statusids"][$serverid] = $stex->getCode(); } break; } ZLog::Write(LOGLEVEL_DEBUG, "Sync->importMessage(): message imported"); } }
function __construct() { $mapping = array(SYNC_AIRSYNCBASE_BODY => array(self::STREAMER_VAR => "asbody", self::STREAMER_TYPE => "SyncBaseBody", self::STREAMER_RONOTIFY => true), SYNC_NOTES_CATEGORIES => array(self::STREAMER_VAR => "categories", self::STREAMER_ARRAY => SYNC_NOTES_CATEGORY, self::STREAMER_RONOTIFY => true), SYNC_NOTES_LASTMODIFIEDDATE => array(self::STREAMER_VAR => "lastmodified", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE, self::STREAMER_RONOTIFY => true), SYNC_NOTES_MESSAGECLASS => array(self::STREAMER_VAR => "messageclass", self::STREAMER_RONOTIFY => true), SYNC_NOTES_SUBJECT => array(self::STREAMER_VAR => "subject", self::STREAMER_RONOTIFY => true), SYNC_NOTES_IGNORE_COLOR => array(self::STREAMER_VAR => "Color", self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE)); parent::__construct($mapping); }
public function __construct() { $mapping = array(SYNC_SETTINGS_PW => array(self::STREAMER_VAR => "password"), SYNC_SETTINGS_PROP_STATUS => array(self::STREAMER_VAR => "Status", self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE)); parent::__construct($mapping); }
/** * Method checks if the object has the minimum of required parameters * and fullfills semantic dependencies * * This overloads the general check() with special checks to be executed * Checks if SYNC_POOMCAL_ORGANIZERNAME and SYNC_POOMCAL_ORGANIZEREMAIL are correctly set * * @param boolean $logAsDebug (opt) default is false, so messages are logged in WARN log level * * @access public * @return boolean */ public function Check($logAsDebug = false) { $ret = parent::Check($logAsDebug); // semantic checks general "turn off switch" if (defined("DO_SEMANTIC_CHECKS") && DO_SEMANTIC_CHECKS === false) { return $ret; } if (!$ret) { return false; } if ($this->meetingstatus > 0) { if (!isset($this->organizername) || !isset($this->organizeremail)) { ZLog::Write(LOGLEVEL_WARN, "SyncAppointment->Check(): Parameter 'organizername' and 'organizeremail' should be set for a meeting request"); } } // do not sync a recurrent appointment without a timezone if (isset($this->recurrence) && !isset($this->timezone)) { ZLog::Write(LOGLEVEL_ERROR, "SyncAppointment->Check(): timezone for a recurring appointment is not set."); return false; } return true; }
public function SyncRRPicture() { $mapping = array(SYNC_RESOLVERECIPIENTS_MAXSIZE => array(self::STREAMER_VAR => "maxsize"), SYNC_RESOLVERECIPIENTS_MAXPICTURES => array(self::STREAMER_VAR => "maxpictures"), SYNC_RESOLVERECIPIENTS_STATUS => array(self::STREAMER_VAR => "status"), SYNC_RESOLVERECIPIENTS_DATA => array(self::STREAMER_VAR => "data")); parent::SyncObject($mapping); }
function SyncMailFlags() { $mapping = array(SYNC_POOMTASKS_SUBJECT => array(self::STREAMER_VAR => "subject"), SYNC_POOMMAIL_FLAGSTATUS => array(self::STREAMER_VAR => "flagstatus"), SYNC_POOMMAIL_FLAGTYPE => array(self::STREAMER_VAR => "flagtype"), SYNC_POOMTASKS_DATECOMPLETED => array(self::STREAMER_VAR => "datecompleted", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMMAIL_COMPLETETIME => array(self::STREAMER_VAR => "completetime", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMTASKS_STARTDATE => array(self::STREAMER_VAR => "startdate", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMTASKS_DUEDATE => array(self::STREAMER_VAR => "duedate", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMTASKS_UTCSTARTDATE => array(self::STREAMER_VAR => "utcstartdate", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMTASKS_UTCDUEDATE => array(self::STREAMER_VAR => "utcduedate", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMTASKS_REMINDERSET => array(self::STREAMER_VAR => "reminderset"), SYNC_POOMTASKS_REMINDERTIME => array(self::STREAMER_VAR => "remindertime", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMTASKS_ORDINALDATE => array(self::STREAMER_VAR => "ordinaldate", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_POOMTASKS_SUBORDINALDATE => array(self::STREAMER_VAR => "subordinaldate")); parent::SyncObject($mapping); }
/** * Method checks if the object has the minimum of required parameters * and fullfills semantic dependencies * * This overloads the general check() with special checks to be executed * * @param boolean $logAsDebug (opt) default is false, so messages are logged in WARN log level * * @access public * @return boolean */ public function Check($logAsDebug = false) { $ret = parent::Check($logAsDebug); // semantic checks general "turn off switch" if (defined("DO_SEMANTIC_CHECKS") && DO_SEMANTIC_CHECKS === false) { return $ret; } if (!$ret) { return false; } if (isset($this->startdate) && isset($this->duedate) && $this->duedate < $this->startdate) { ZLog::Write(LOGLEVEL_WARN, sprintf("SyncObject->Check(): Unmet condition in object from type %s: parameter 'startdate' is HIGHER than 'duedate'. Check failed!", get_class($this))); return false; } if (isset($this->utcstartdate) && isset($this->utcduedate) && $this->utcduedate < $this->utcstartdate) { ZLog::Write(LOGLEVEL_WARN, sprintf("SyncObject->Check(): Unmet condition in object from type %s: parameter 'utcstartdate' is HIGHER than 'utcduedate'. Check failed!", get_class($this))); return false; } if (isset($this->duedate) && $this->duedate != Utils::getDayStartOfTimestamp($this->duedate)) { $this->duedate = Utils::getDayStartOfTimestamp($this->duedate); ZLog::Write(LOGLEVEL_DEBUG, "Set the due time to the start of the day"); if (isset($this->startdate) && $this->duedate < $this->startdate) { $this->startdate = Utils::getDayStartOfTimestamp($this->startdate); ZLog::Write(LOGLEVEL_DEBUG, "Set the start date to the start of the day"); } } return true; }
function SyncItemOperationsAttachment() { $mapping = array(SYNC_AIRSYNCBASE_CONTENTTYPE => array(self::STREAMER_VAR => "contenttype"), SYNC_ITEMOPERATIONS_DATA => array(self::STREAMER_VAR => "data", self::STREAMER_TYPE => self::STREAMER_TYPE_STREAM, self::STREAMER_PROP => self::STREAMER_TYPE_MULTIPART)); parent::SyncObject($mapping); }
public function SyncRROptions() { $mapping = array(SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL => array(self::STREAMER_VAR => "certificateretrieval"), SYNC_RESOLVERECIPIENTS_MAXCERTIFICATES => array(self::STREAMER_VAR => "maxcertificates"), SYNC_RESOLVERECIPIENTS_MAXAMBIGUOUSRECIPIENTS => array(self::STREAMER_VAR => "maxambiguousrecipients"), SYNC_RESOLVERECIPIENTS_AVAILABILITY => array(self::STREAMER_VAR => "availability", self::STREAMER_TYPE => "SyncRRAvailability"), SYNC_RESOLVERECIPIENTS_PICTURE => array(self::STREAMER_VAR => "picture", self::STREAMER_TYPE => "SyncRRPicture")); parent::SyncObject($mapping); }
public function SyncOOFMessage() { $mapping = array(SYNC_SETTINGS_APPLIESTOINTERVAL => array(self::STREAMER_VAR => "appliesToInternal", self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY), SYNC_SETTINGS_APPLIESTOEXTERNALKNOWN => array(self::STREAMER_VAR => "appliesToExternal", self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY), SYNC_SETTINGS_APPLIESTOEXTERNALUNKNOWN => array(self::STREAMER_VAR => "appliesToExternalUnknown", self::STREAMER_PROP => self::STREAMER_TYPE_SEND_EMPTY), SYNC_SETTINGS_ENABLED => array(self::STREAMER_VAR => "enabled"), SYNC_SETTINGS_REPLYMESSAGE => array(self::STREAMER_VAR => "replymessage"), SYNC_SETTINGS_BODYTYPE => array(self::STREAMER_VAR => "bodytype", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_ONEVALUEOF => array(SYNC_SETTINGSOOF_BODYTYPE_HTML, ucfirst(strtolower(SYNC_SETTINGSOOF_BODYTYPE_TEXT)))))); parent::SyncObject($mapping); }
public function __construct() { $mapping = array(SYNC_RESOLVERECIPIENTS_TO => array(self::STREAMER_VAR => "to"), SYNC_RESOLVERECIPIENTS_STATUS => array(self::STREAMER_VAR => "status"), SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT => array(self::STREAMER_VAR => "recipientcount"), SYNC_RESOLVERECIPIENTS_RECIPIENT => array(self::STREAMER_VAR => "recipient", self::STREAMER_TYPE => "SyncResolveRecipient", self::STREAMER_ARRAY => SYNC_RESOLVERECIPIENTS_RECIPIENT)); parent::__construct($mapping); }
function SyncNote() { $mapping = array(SYNC_AIRSYNCBASE_BODY => array(self::STREAMER_VAR => "asbody", self::STREAMER_TYPE => "SyncBaseBody"), SYNC_NOTES_CATEGORIES => array(self::STREAMER_VAR => "categories", self::STREAMER_ARRAY => SYNC_NOTES_CATEGORY), SYNC_NOTES_LASTMODIFIEDDATE => array(self::STREAMER_VAR => "lastmodified", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE), SYNC_NOTES_MESSAGECLASS => array(self::STREAMER_VAR => "messageclass"), SYNC_NOTES_SUBJECT => array(self::STREAMER_VAR => "subject")); parent::SyncObject($mapping); }
public function SyncDevicePassword() { $mapping = array(SYNC_SETTINGS_DEVICEPW => array(self::STREAMER_VAR => "password"), SYNC_SETTINGS_PROP_STATUS => array(self::STREAMER_VAR => "Status", self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE)); parent::SyncObject($mapping); }
function SyncBaseAttachment() { $mapping = array(SYNC_AIRSYNCBASE_DISPLAYNAME => array(self::STREAMER_VAR => "displayname"), SYNC_AIRSYNCBASE_FILEREFERENCE => array(self::STREAMER_VAR => "filereference"), SYNC_AIRSYNCBASE_METHOD => array(self::STREAMER_VAR => "method"), SYNC_AIRSYNCBASE_ESTIMATEDDATASIZE => array(self::STREAMER_VAR => "estimatedDataSize"), SYNC_AIRSYNCBASE_CONTENTID => array(self::STREAMER_VAR => "contentid"), SYNC_AIRSYNCBASE_CONTENTLOCATION => array(self::STREAMER_VAR => "contentlocation"), SYNC_AIRSYNCBASE_ISINLINE => array(self::STREAMER_VAR => "isinline")); parent::SyncObject($mapping); }
/** * Imports a message * * @param SyncParameters $spa SyncParameters object * @param array $actiondata Actiondata array * @param integer $todo WBXML flag indicating how message should be imported. * Valid values: SYNC_ADD, SYNC_MODIFY, SYNC_REMOVE * @param SyncObject $message SyncObject message to be imported * @param string $clientid Client message identifier * @param string $serverid Server message identifier * * @access private * @throws StatusException in case the importer is not available * @return - Message related status are returned in the actiondata. */ private function importMessage($spa, &$actiondata, $todo, $message, $clientid, $serverid) { // the importer needs to be available! if ($this->importer == false) { throw StatusException(sprintf("Sync->importMessage(): importer not available", SYNC_STATUS_SERVERERROR)); } // Detect incoming loop // messages which were created/removed before will not have the same action executed again // if a message is edited we perform this action "again", as the message could have been changed on the mobile in the meantime $ignoreMessage = false; if ($actiondata["failstate"]) { // message was ADDED before, do NOT add it again if ($todo == SYNC_ADD && $actiondata["failstate"]["clientids"][$clientid]) { $ignoreMessage = true; // make sure no messages are sent back self::$deviceManager->SetWindowSize($spa->GetFolderId(), 0); $actiondata["clientids"][$clientid] = $actiondata["failstate"]["clientids"][$clientid]; $actiondata["statusids"][$clientid] = $actiondata["failstate"]["statusids"][$clientid]; ZLog::Write(LOGLEVEL_WARN, sprintf("Mobile loop detected! Incoming new message '%s' was created on the server before. Replying with known new server id: %s", $clientid, $actiondata["clientids"][$clientid])); } // message was REMOVED before, do NOT attemp to remove it again if ($todo == SYNC_REMOVE && $actiondata["failstate"]["removeids"][$serverid]) { $ignoreMessage = true; // make sure no messages are sent back self::$deviceManager->SetWindowSize($spa->GetFolderId(), 0); $actiondata["removeids"][$serverid] = $actiondata["failstate"]["removeids"][$serverid]; $actiondata["statusids"][$serverid] = $actiondata["failstate"]["statusids"][$serverid]; ZLog::Write(LOGLEVEL_WARN, sprintf("Mobile loop detected! Message '%s' was deleted by the mobile before. Replying with known status: %s", $clientid, $actiondata["statusids"][$serverid])); } } if (!$ignoreMessage) { switch ($todo) { case SYNC_MODIFY: try { $actiondata["modifyids"][] = $serverid; // check incoming message without logging WARN messages about errors if (!$message instanceof SyncObject || !$message->Check(true)) { $actiondata["statusids"][$serverid] = SYNC_STATUS_CLIENTSERVERCONVERSATIONERROR; } else { if (isset($message->read)) { // Currently, 'read' is only sent by the PDA when it is ONLY setting the read flag. $this->importer->ImportMessageReadFlag($serverid, $message->read); } elseif (!isset($message->flag)) { $this->importer->ImportMessageChange($serverid, $message); } // email todoflags - some devices send todos flags together with read flags, // so they have to be handled separately if (isset($message->flag)) { $this->importer->ImportMessageChange($serverid, $message); } $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; } } catch (StatusException $stex) { $actiondata["statusids"][$serverid] = $stex->getCode(); } break; case SYNC_ADD: try { // check incoming message without logging WARN messages about errors if (!$message instanceof SyncObject || !$message->Check(true)) { $actiondata["clientids"][$clientid] = false; $actiondata["statusids"][$clientid] = SYNC_STATUS_CLIENTSERVERCONVERSATIONERROR; } else { $actiondata["clientids"][$clientid] = false; $actiondata["clientids"][$clientid] = $this->importer->ImportMessageChange(false, $message); $actiondata["statusids"][$clientid] = SYNC_STATUS_SUCCESS; } } catch (StatusException $stex) { $actiondata["statusids"][$clientid] = $stex->getCode(); } break; case SYNC_REMOVE: try { $actiondata["removeids"][] = $serverid; // if message deletions are to be moved, move them if ($spa->GetDeletesAsMoves()) { $folderid = self::$backend->GetWasteBasket(); if ($folderid) { $this->importer->ImportMessageMove($serverid, $folderid); $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; break; } else { ZLog::Write(LOGLEVEL_WARN, "Message should be moved to WasteBasket, but the Backend did not return a destination ID. Message is hard deleted now!"); } } $this->importer->ImportMessageDeletion($serverid); $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; } catch (StatusException $stex) { $actiondata["statusids"][$serverid] = $stex->getCode(); } break; } ZLog::Write(LOGLEVEL_DEBUG, "Sync->importMessage(): message imported"); } }
/** * Sets the properties in a MAPI object according to an Sync object and a property mapping * * @param mixed $mapimessage * @param SyncObject $message * @param array $mapping * * @access private * @return */ private function setPropsInMAPI($mapimessage, $message, $mapping) { $mapiprops = $this->getPropIdsFromStrings($mapping); $unsetVars = $message->getUnsetVars(); $propsToDelete = array(); $propsToSet = array(); foreach ($mapiprops as $asprop => $mapiprop) { if (isset($message->{$asprop})) { // UTF8->windows1252.. this is ok for all numerical values if (mapi_prop_type($mapiprop) != PT_BINARY && mapi_prop_type($mapiprop) != PT_MV_BINARY) { if (is_array($message->{$asprop})) { $value = array_map("u2wi", $message->{$asprop}); } else { $value = u2wi($message->{$asprop}); } } else { $value = $message->{$asprop}; } // Make sure the php values are the correct type switch (mapi_prop_type($mapiprop)) { case PT_BINARY: case PT_STRING8: settype($value, "string"); break; case PT_BOOLEAN: settype($value, "boolean"); break; case PT_SYSTIME: case PT_LONG: settype($value, "integer"); break; } // decode base64 value if ($mapiprop == PR_RTF_COMPRESSED) { $value = base64_decode($value); if (strlen($value) == 0) { continue; } // PDA will sometimes give us an empty RTF, which we'll ignore. // Note that you can still remove notes because when you remove notes it gives // a valid compressed RTF with nothing in it. } // if an "empty array" is to be saved, it the mvprop should be deleted - fixes Mantis #468 if (is_array($value) && empty($value)) { $propsToDelete[] = $mapiprop; ZLog::Write(LOGLEVEL_DEBUG, sprintf("MAPIProvider->setPropsInMAPI(): Property '%s' to be deleted as it is an empty array", $asprop)); } else { // all properties will be set at once $propsToSet[$mapiprop] = $value; } } elseif (in_array($asprop, $unsetVars)) { $propsToDelete[] = $mapiprop; } } mapi_setprops($mapimessage, $propsToSet); if (mapi_last_hresult()) { Zlog::Write(LOGLEVEL_WARN, sprintf("Failed to set properties, trying to set them separately. Error code was:%x", mapi_last_hresult())); $this->setPropsIndividually($mapimessage, $propsToSet, $mapiprops); } mapi_deleteprops($mapimessage, $propsToDelete); //clean up unset($unsetVars, $propsToDelete); }
public function SyncOOF() { $mapping = array(SYNC_SETTINGS_OOFSTATE => array(self::STREAMER_VAR => "oofstate", self::STREAMER_CHECKS => array(array(self::STREAMER_CHECK_ONEVALUEOF => array(0, 1, 2)))), SYNC_SETTINGS_STARTTIME => array(self::STREAMER_VAR => "starttime", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_SETTINGS_ENDTIME => array(self::STREAMER_VAR => "endtime", self::STREAMER_TYPE => self::STREAMER_TYPE_DATE_DASHES), SYNC_SETTINGS_OOFMESSAGE => array(self::STREAMER_VAR => "oofmessage", self::STREAMER_TYPE => "SyncOOFMessage", self::STREAMER_PROP => self::STREAMER_TYPE_NO_CONTAINER, self::STREAMER_ARRAY => SYNC_SETTINGS_OOFMESSAGE), SYNC_SETTINGS_BODYTYPE => array(self::STREAMER_VAR => "bodytype", self::STREAMER_CHECKS => array(self::STREAMER_CHECK_ONEVALUEOF => array(SYNC_SETTINGSOOF_BODYTYPE_HTML, ucfirst(strtolower(SYNC_SETTINGSOOF_BODYTYPE_TEXT))))), SYNC_SETTINGS_PROP_STATUS => array(self::STREAMER_VAR => "Status", self::STREAMER_TYPE => self::STREAMER_TYPE_IGNORE)); parent::SyncObject($mapping); }