function HandleSearch($backend, $devid, $protocolversion) { global $zpushdtd; global $input, $output; $searchrange = '0'; $decoder = new WBXMLDecoder($input, $zpushdtd); $encoder = new WBXMLEncoder($output, $zpushdtd); if (!$decoder->getElementStartTag(SYNC_SEARCH_SEARCH)) { return false; } if (!$decoder->getElementStartTag(SYNC_SEARCH_STORE)) { return false; } if (!$decoder->getElementStartTag(SYNC_SEARCH_NAME)) { return false; } $searchname = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } if (!$decoder->getElementStartTag(SYNC_SEARCH_QUERY)) { return false; } $searchquery = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } if ($decoder->getElementStartTag(SYNC_SEARCH_OPTIONS)) { while (1) { if ($decoder->getElementStartTag(SYNC_SEARCH_RANGE)) { $searchrange = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } $e = $decoder->peek(); if ($e[EN_TYPE] == EN_TYPE_ENDTAG) { $decoder->getElementEndTag(); break; } } //if(!$decoder->getElementEndTag()) //return false; } if (!$decoder->getElementEndTag()) { //store return false; } if (!$decoder->getElementEndTag()) { //search return false; } if (strtoupper($searchname) != "GAL") { debugLog("Searchtype {$searchname} is not supported"); return false; } //get search results from backend $rows = $backend->getSearchResults($searchquery, $searchrange); $encoder->startWBXML(); $encoder->startTag(SYNC_SEARCH_SEARCH); $encoder->startTag(SYNC_SEARCH_STATUS); $encoder->content(1); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_RESPONSE); $encoder->startTag(SYNC_SEARCH_STORE); $encoder->startTag(SYNC_SEARCH_STATUS); $encoder->content(1); $encoder->endTag(); if (is_array($rows) && !empty($rows)) { $searchrange = $rows['range']; unset($rows['range']); foreach ($rows as $u) { $encoder->startTag(SYNC_SEARCH_RESULT); $encoder->startTag(SYNC_SEARCH_PROPERTIES); $encoder->startTag(SYNC_GAL_DISPLAYNAME); $encoder->content($u["fullname"]); $encoder->endTag(); $encoder->startTag(SYNC_GAL_PHONE); $encoder->content($u["businessphone"]); $encoder->endTag(); $encoder->startTag(SYNC_GAL_ALIAS); $encoder->content($u["username"]); $encoder->endTag(); //it's not possible not get first and last name of an user //from the gab and user functions, so we just set fullname //to lastname and leave firstname empty because nokia needs //first and lastname in order to display the search result $encoder->startTag(SYNC_GAL_FIRSTNAME); $encoder->content(""); $encoder->endTag(); $encoder->startTag(SYNC_GAL_LASTNAME); $encoder->content($u["fullname"]); $encoder->endTag(); $encoder->startTag(SYNC_GAL_EMAILADDRESS); $encoder->content($u["emailaddress"]); $encoder->endTag(); $encoder->endTag(); //result $encoder->endTag(); //properties } $encoder->startTag(SYNC_SEARCH_RANGE); $encoder->content($searchrange); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_TOTAL); $encoder->content(count($rows)); $encoder->endTag(); } $encoder->endTag(); //store $encoder->endTag(); //response $encoder->endTag(); //search return true; }
function HandleMeetingResponse($backend, $protocolversion) { global $zpushdtd; global $output, $input; $response = false; $folderid = false; $requestid = false; $decoder = new WBXMLDecoder($input, $zpushdtd); $encoder = new WBXMLEncoder($output, $zpushdtd); if (!$decoder->getElementStartTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE)) { return false; } if (!$decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUEST)) { return false; } if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_USERRESPONSE)) { $response = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_FOLDERID)) { $folderid = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUESTID)) { $requestid = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if (!$decoder->getElementEndTag()) { return false; } if (!$decoder->getElementEndTag()) { return false; } $calendarid = ""; $ok = $backend->MeetingResponse($requestid, $folderid, $response, $calendarid); // Start output, simply the error code $encoder->StartWBXML(); $encoder->startTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE); $encoder->startTag(SYNC_MEETINGRESPONSE_RESULT); $encoder->startTag(SYNC_MEETINGRESPONSE_REQUESTID); $encoder->content($requestid); $encoder->endTag(); $encoder->startTag(SYNC_MEETINGRESPONSE_ERROR); $encoder->content($ok ? 1 : 2); $encoder->endTag(); if ($ok) { $encoder->startTag(SYNC_MEETINGRESPONSE_CALENDARID); $encoder->content($calendarid); $encoder->endTag(); } $encoder->endTag(); $encoder->endTag(); return true; }
function HandleResolveRecipients($backend, $devid, $protocolversion) { global $zpushdtd; global $input, $output; // define ('OVERRIDE_GZIP',true); $decoder = new WBXMLDecoder($input, $zpushdtd); $encoder = new WBXMLEncoder($output, $zpushdtd); if (!$decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_RESOLVERECIPIENTS)) { return false; } $status = 1; while ($status == 1 && ($field = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_TO) ? SYNC_RESOLVERECIPIENTS_TO : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_OPTIONS) ? SYNC_RESOLVERECIPIENTS_OPTIONS : -1)) != -1) { if ($field == SYNC_RESOLVERECIPIENTS_OPTIONS) { while ($status == 1 && ($option = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL) ? SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXCERTIFICATES) ? SYNC_RESOLVERECIPIENTS_MAXCERTIFICATES : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXAMBIGUOUSRECIPIENTS) ? SYNC_RESOLVERECIPIENTS_MAXAMBIGUOUSRECIPIENTS : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_AVAILABILITY) ? SYNC_RESOLVERECIPIENTS_AVAILABILITY : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_PICTURE) ? SYNC_RESOLVERECIPIENTS_PICTURE : -1))))) != -1) { switch ($option) { case SYNC_RESOLVERECIPIENTS_AVAILABILITY: while (($suboption = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_STARTTIME) ? SYNC_RESOLVERECIPIENTS_STARTTIME : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_ENDTIME) ? SYNC_RESOLVERECIPIENTS_ENDTIME : -1)) != -1) { $ts = $decoder->getElementContent(); if (preg_match("/(\\d{4})[^0-9]*(\\d{2})[^0-9]*(\\d{2})T(\\d{2})[^0-9]*(\\d{2})[^0-9]*(\\d{2})(.\\d+)?Z/", $ts, $matches)) { if ($matches[1] >= 2038) { $matches[1] = 2038; $matches[2] = 1; $matches[3] = 18; $matches[4] = $matches[5] = $matches[6] = 0; } $ts = gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]); } else { $ts = 0; } $options[$option][$suboption] = $ts; if (!$decoder->getElementEndTag()) { $status = 5; } } if (!$decoder->getElementEndTag()) { $status = 5; } break; case SYNC_RESOLVERECIPIENTS_PICTURE: while (($suboption = $decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXSIZE) ? SYNC_RESOLVERECIPIENTS_MAXSIZE : ($decoder->getElementStartTag(SYNC_RESOLVERECIPIENTS_MAXPICTURES) ? SYNC_RESOLVERECIPIENTS_MAXPICTURES : -1)) != -1) { $options[$option][$suboption] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { $status = 5; } } if (!$decoder->getElementEndTag()) { $status = 5; } break; default: $options[$option] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { $status = 5; } } } if (!$decoder->getElementEndTag()) { $status = 5; } } else { if ($field == SYNC_RESOLVERECIPIENTS_TO) { $to[] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { $status = 5; } } } } $results = ''; foreach ($to as $item) { if (isset($options[SYNC_RESOLVERECIPIENTS_AVAILABILITY])) { $result = $backend->resolveRecipient('availability', $item, array('starttime' => $options[SYNC_RESOLVERECIPIENTS_AVAILABILITY][SYNC_RESOLVERECIPIENTS_STARTTIME], 'endtime' => $options[SYNC_RESOLVERECIPIENTS_AVAILABILITY][SYNC_RESOLVERECIPIENTS_ENDTIME])); $results[$item] = $result[$item]; } if (isset($options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL])) { $result = $backend->resolveRecipient('certificate', $item, array('maxcerts' => $options[SYNC_RESOLVERECIPIENTS_MAXCERTIFICATES], 'maxambigious' => $options[SYNC_RESOLVERECIPIENTS_MAXAMBIGUOUSRECIPIENTS])); $results[$item] = $result[$item]; } } debugLog("Results returned" . print_r($results, true)); $encoder->startWBXML(); $encoder->startTag(SYNC_RESOLVERECIPIENTS_RESOLVERECIPIENTS); $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS); $encoder->content($status); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_STATUS foreach ($to as $item) { $encoder->startTag(SYNC_RESOLVERECIPIENTS_RESPONSE); $encoder->startTag(SYNC_RESOLVERECIPIENTS_TO); $encoder->content($item); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_TO $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS); $encoder->content(sizeof($results[$item]) > 1 ? 2 : (sizeof($results[$item]) == 0 ? 4 : (sizeof($results[$item]) == 1 ? 1 : 3))); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_STATUS $encoder->startTag(SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT); $encoder->content(sizeof($results[$item])); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT foreach ($results[$item] as $value) { $encoder->startTag(SYNC_RESOLVERECIPIENTS_RECIPIENT); $encoder->startTag(SYNC_RESOLVERECIPIENTS_TYPE); $encoder->content($value['type']); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_TYPE $encoder->startTag(SYNC_RESOLVERECIPIENTS_DISPLAYNAME); $encoder->content($value['displayname']); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_DISPLAYNAME $encoder->startTag(SYNC_RESOLVERECIPIENTS_EMAILADDRESS); $encoder->content($value['emailaddress']); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_EMAILADDRESS if (isset($options[SYNC_RESOLVERECIPIENTS_AVAILABILITY])) { $encoder->startTag(SYNC_RESOLVERECIPIENTS_AVAILABILITY); $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS); $encoder->content(1); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_STATUS $encoder->startTag(SYNC_RESOLVERECIPIENTS_MERGEDFREEBUSY); $encoder->content($value['mergedfb']); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_MERGEDFREEBUSY $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_AVAILABILITY } if (isset($options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL]) && $options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL] > 1) { $encoder->startTag(SYNC_RESOLVERECIPIENTS_CERTIFICATES); $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS); $encoder->content(sizeof($value['entries']) == 0 ? 7 : 1); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_STATUS $encoder->startTag(SYNC_RESOLVERECIPIENTS_CERTIFICATECOUNT); $encoder->content(sizeof($value['entries'])); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_CERTIFICATECOUNT $encoder->startTag(SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT); $encoder->content(sizeof($results[$item])); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_RECIPIENTCOUNT switch ($options[SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL]) { case '2': foreach ($value['entries'] as $cert) { $encoder->startTag(SYNC_RESOLVERECIPIENTS_CERTIFICATE); $encoder->content($cert); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_CERTIFICATE } break; case '3': foreach ($value['entries'] as $cert) { $encoder->startTag(SYNC_RESOLVERECIPIENTS_MINICERTIFICATE); $encoder->content($cert); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_MINICERTIFICATE } break; } $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_CERTIFICATERETRIEVAL } /* if (isset($item['options'][SYNC_RESOLVERECIPIENTS_PICTURE])) { $encoder->startTag(SYNC_RESOLVERECIPIENTS_PICTURE); $encoder->startTag(SYNC_RESOLVERECIPIENTS_STATUS); $encoder->content(); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_STATUS $encoder->startTag(SYNC_RESOLVERECIPIENTS_DATA); $encoder->content(); $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_DATA $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_PICTURE } */ $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_RECIPIENT } $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_RESPONSE } $encoder->endTag(); // end SYNC_RESOLVERECIPIENTS_RESOLVERECIPIENTS return true; }
function HandleMeetingResponse($backend, $protocolversion) { global $zpushdtd; global $output, $input; $requests = array(); $decoder = new WBXMLDecoder($input, $zpushdtd); $encoder = new WBXMLEncoder($output, $zpushdtd); if (!$decoder->getElementStartTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE)) { return false; } while ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUEST)) { $req = array(); if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_USERRESPONSE)) { $req["response"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_FOLDERID)) { $req["folderid"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_MEETINGRESPONSE_REQUESTID)) { $req["requestid"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if (!$decoder->getElementEndTag()) { return false; } array_push($requests, $req); } if (!$decoder->getElementEndTag()) { return false; } // Start output, simply the error code, plus the ID of the calendar item that was generated by the // accept of the meeting response $encoder->StartWBXML(); $encoder->startTag(SYNC_MEETINGRESPONSE_MEETINGRESPONSE); foreach ($requests as $req) { $calendarid = ""; $ok = $backend->MeetingResponse($req["requestid"], $req["folderid"], $req["response"], $calendarid); $encoder->startTag(SYNC_MEETINGRESPONSE_RESULT); $encoder->startTag(SYNC_MEETINGRESPONSE_REQUESTID); $encoder->content($req["requestid"]); $encoder->endTag(); $encoder->startTag(SYNC_MEETINGRESPONSE_ERROR); $encoder->content($ok ? 1 : 2); $encoder->endTag(); if ($ok) { $encoder->startTag(SYNC_MEETINGRESPONSE_CALENDARID); $encoder->content($calendarid); $encoder->endTag(); } $encoder->endTag(); } $encoder->endTag(); return true; }
function HandleSearch($backend, $devid, $protocolversion) { global $zpushdtd; global $input, $output; $searchrange = '0'; $decoder = new WBXMLDecoder($input, $zpushdtd); $encoder = new WBXMLEncoder($output, $zpushdtd); if (!$decoder->getElementStartTag(SYNC_SEARCH_SEARCH)) { return false; } if (!$decoder->getElementStartTag(SYNC_SEARCH_STORE)) { return false; } if (!$decoder->getElementStartTag(SYNC_SEARCH_NAME)) { return false; } $searchname = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } if (!$decoder->getElementStartTag(SYNC_SEARCH_QUERY)) { return false; } $searchquery = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } if ($decoder->getElementStartTag(SYNC_SEARCH_OPTIONS)) { while (1) { if ($decoder->getElementStartTag(SYNC_SEARCH_RANGE)) { $searchrange = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } $e = $decoder->peek(); if ($e[EN_TYPE] == EN_TYPE_ENDTAG) { $decoder->getElementEndTag(); break; } } //if(!$decoder->getElementEndTag()) //return false; } if (!$decoder->getElementEndTag()) { //store return false; } if (!$decoder->getElementEndTag()) { //search return false; } if (strtoupper($searchname) != "GAL") { debugLog("Searchtype {$searchname} is not supported"); return false; } //get search results from backend if (defined('SEARCH_PROVIDER') && @constant('SEARCH_PROVIDER') != "" && class_exists(SEARCH_PROVIDER)) { $searchClass = constant('SEARCH_PROVIDER'); $searchbackend = new $searchClass(); $searchbackend->initialize($backend); $rows = $searchbackend->getSearchResults($searchquery, $searchrange); $searchbackend->disconnect(); } else { $rows = $backend->getSearchResults($searchquery, $searchrange); } $encoder->startWBXML(); $encoder->startTag(SYNC_SEARCH_SEARCH); $encoder->startTag(SYNC_SEARCH_STATUS); $encoder->content(1); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_RESPONSE); $encoder->startTag(SYNC_SEARCH_STORE); $encoder->startTag(SYNC_SEARCH_STATUS); $encoder->content(1); $encoder->endTag(); if (is_array($rows) && !empty($rows)) { $searchrange = $rows['range']; unset($rows['range']); $searchtotal = $rows['searchtotal']; unset($rows['searchtotal']); foreach ($rows as $u) { $encoder->startTag(SYNC_SEARCH_RESULT); $encoder->startTag(SYNC_SEARCH_PROPERTIES); $encoder->startTag(SYNC_GAL_DISPLAYNAME); $encoder->content(isset($u[SYNC_GAL_DISPLAYNAME]) ? $u[SYNC_GAL_DISPLAYNAME] : "No name"); $encoder->endTag(); if (isset($u[SYNC_GAL_PHONE])) { $encoder->startTag(SYNC_GAL_PHONE); $encoder->content($u[SYNC_GAL_PHONE]); $encoder->endTag(); } if (isset($u[SYNC_GAL_OFFICE])) { $encoder->startTag(SYNC_GAL_OFFICE); $encoder->content($u[SYNC_GAL_OFFICE]); $encoder->endTag(); } if (isset($u[SYNC_GAL_TITLE])) { $encoder->startTag(SYNC_GAL_TITLE); $encoder->content($u[SYNC_GAL_TITLE]); $encoder->endTag(); } if (isset($u[SYNC_GAL_COMPANY])) { $encoder->startTag(SYNC_GAL_COMPANY); $encoder->content($u[SYNC_GAL_COMPANY]); $encoder->endTag(); } if (isset($u[SYNC_GAL_ALIAS])) { $encoder->startTag(SYNC_GAL_ALIAS); $encoder->content($u[SYNC_GAL_ALIAS]); $encoder->endTag(); } // Always send the firstname, even empty. Nokia needs this to display the entry $encoder->startTag(SYNC_GAL_FIRSTNAME); $encoder->content(isset($u[SYNC_GAL_FIRSTNAME]) ? $u[SYNC_GAL_FIRSTNAME] : ""); $encoder->endTag(); $encoder->startTag(SYNC_GAL_LASTNAME); $encoder->content(isset($u[SYNC_GAL_LASTNAME]) ? $u[SYNC_GAL_LASTNAME] : "No name"); $encoder->endTag(); if (isset($u[SYNC_GAL_HOMEPHONE])) { $encoder->startTag(SYNC_GAL_HOMEPHONE); $encoder->content($u[SYNC_GAL_HOMEPHONE]); $encoder->endTag(); } if (isset($u[SYNC_GAL_MOBILEPHONE])) { $encoder->startTag(SYNC_GAL_MOBILEPHONE); $encoder->content($u[SYNC_GAL_MOBILEPHONE]); $encoder->endTag(); } $encoder->startTag(SYNC_GAL_EMAILADDRESS); $encoder->content(isset($u[SYNC_GAL_EMAILADDRESS]) ? $u[SYNC_GAL_EMAILADDRESS] : ""); $encoder->endTag(); $encoder->endTag(); //result $encoder->endTag(); //properties } if ($searchtotal > 0) { $encoder->startTag(SYNC_SEARCH_RANGE); $encoder->content($searchrange); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_TOTAL); $encoder->content($searchtotal); $encoder->endTag(); } } $encoder->endTag(); //store $encoder->endTag(); //response $encoder->endTag(); //search return true; }
function HandleItemOperations($backend, $devid, $protocolversion, $multipart) { global $zpushdtd; global $input, $output; global $auth_user, $auth_domain, $auth_pw; $decoder = new WBXMLDecoder($input, $zpushdtd); $encoder = new WBXMLEncoder($output, $zpushdtd); if (!$decoder->getElementStartTag(SYNC_ITEMOPERATIONS_ITEMOPERATIONS)) { return false; } $request = array(); while (($reqtype = $decoder->getElementStartTag(SYNC_ITEMOPERATIONS_FETCH) ? SYNC_ITEMOPERATIONS_FETCH : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENT) ? SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENTS : -1)) != -1) { if ($reqtype == SYNC_ITEMOPERATIONS_FETCH) { $thisio["type"] = "fetch"; while (($reqtag = $decoder->getElementStartTag(SYNC_ITEMOPERATIONS_STORE) ? SYNC_ITEMOPERATIONS_STORE : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_OPTIONS) ? SYNC_ITEMOPERATIONS_OPTIONS : ($decoder->getElementStartTag(SYNC_SERVERENTRYID) ? SYNC_SERVERENTRYID : ($decoder->getElementStartTag(SYNC_FOLDERID) ? SYNC_FOLDERID : ($decoder->getElementStartTag(SYNC_DOCUMENTLIBRARY_LINKID) ? SYNC_DOCUMENTLIBRARY_LINKID : ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_FILEREFERENCE) ? SYNC_AIRSYNCBASE_FILEREFERENCE : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_USERNAME) ? SYNC_ITEMOPERATIONS_USERNAME : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_PASSWORD) ? SYNC_ITEMOPERATIONS_PASSWORD : ($decoder->getElementStartTag(SYNC_SEARCH_LONGID) ? SYNC_SEARCH_LONGID : -1))))))))) != -1) { if ($reqtag == SYNC_ITEMOPERATIONS_OPTIONS) { if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_BODYPREFERENCE)) { $bodypreference = array(); while (1) { if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_TYPE)) { $bodypreference["Type"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_TRUNCATIONSIZE)) { $bodypreference["TruncationSize"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_ALLORNONE)) { $bodypreference["AllOrNone"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } $e = $decoder->peek(); if ($e[EN_TYPE] == EN_TYPE_ENDTAG) { $decoder->getElementEndTag(); if (!isset($thisio["bodypreference"]["wanted"])) { $thisio["bodypreference"]["wanted"] = $bodypreference["Type"]; } if (isset($bodypreference["Type"])) { $thisio["bodypreference"][$bodypreference["Type"]] = $bodypreference; } break; } } } } elseif ($reqtag == SYNC_ITEMOPERATIONS_STORE) { $thisio["store"] = $decoder->getElementContent(); } elseif ($reqtag == SYNC_ITEMOPERATIONS_USERNAME) { $thisio["username"] = $decoder->getElementContent(); } elseif ($reqtag == SYNC_ITEMOPERATIONS_PASSWORD) { $thisio["password"] = $decoder->getElementContent(); } elseif ($reqtag == SYNC_SEARCH_LONGID) { $thisio["searchlongid"] = $decoder->getElementContent(); } elseif ($reqtag == SYNC_AIRSYNCBASE_FILEREFERENCE) { $thisio["airsyncbasefilereference"] = $decoder->getElementContent(); } elseif ($reqtag == SYNC_SERVERENTRYID) { $thisio["serverentryid"] = $decoder->getElementContent(); } elseif ($reqtag == SYNC_FOLDERID) { $thisio["folderid"] = $decoder->getElementContent(); } elseif ($reqtag == SYNC_DOCUMENTLIBRARY_LINKID) { $thisio["documentlibrarylinkid"] = $decoder->getElementContent(); } $e = $decoder->peek(); if ($e[EN_TYPE] == EN_TYPE_ENDTAG) { $decoder->getElementEndTag(); } } $itemoperations[] = $thisio; $decoder->getElementEndTag(); // end SYNC_ITEMOPERATIONS_FETCH } } $decoder->getElementEndTag(); // end SYNC_ITEMOPERATIONS_ITEMOPERATIONS if ($multipart == true) { $encoder->startWBXML(true); } else { $encoder->startWBXML(false); } $encoder->startTag(SYNC_ITEMOPERATIONS_ITEMOPERATIONS); $encoder->startTag(SYNC_ITEMOPERATIONS_STATUS); $encoder->content(1); $encoder->endTag(); // end SYNC_ITEMOPERATIONS_STATUS $encoder->startTag(SYNC_ITEMOPERATIONS_RESPONSE); foreach ($itemoperations as $value) { switch ($value["type"]) { case "fetch": switch (strtolower($value["store"])) { case "mailbox": $encoder->startTag(SYNC_ITEMOPERATIONS_FETCH); $encoder->startTag(SYNC_ITEMOPERATIONS_STATUS); $encoder->content(1); $encoder->endTag(); // end SYNC_ITEMOPERATIONS_STATUS if (isset($value["airsyncbasefilereference"])) { $encoder->startTag(SYNC_AIRSYNCBASE_FILEREFERENCE); $encoder->content($value["airsyncbasefilereference"]); $encoder->endTag(); // end SYNC_SERVERENTRYID } else { if (isset($value["folderid"])) { $encoder->startTag(SYNC_FOLDERID); $encoder->content($value["folderid"]); $encoder->endTag(); // end SYNC_FOLDERID } if (isset($value["serverentryid"])) { $encoder->startTag(SYNC_SERVERENTRYID); $encoder->content($value["serverentryid"]); $encoder->endTag(); // end SYNC_SERVERENTRYID } if (isset($value["searchlongid"])) { $ids = $backend->ItemOperationsGetIDs($value['searchlongid']); $encoder->startTag(SYNC_FOLDERID); $encoder->content($ids["folderid"]); $encoder->endTag(); // end SYNC_FOLDERID $encoder->startTag(SYNC_SERVERENTRYID); $encoder->content($ids["serverentryid"]); $encoder->endTag(); // end SYNC_SERVERENTRYID } $encoder->startTag(SYNC_FOLDERTYPE); $encoder->content("Email"); $encoder->endTag(); } $encoder->startTag(SYNC_ITEMOPERATIONS_PROPERTIES); if (isset($value['bodypreference'])) { $encoder->_bodypreference = $value['bodypreference']; } if (isset($value["searchlongid"])) { $msg = $backend->ItemOperationsFetchMailbox($value['searchlongid'], $value['bodypreference']); } else { if (isset($value["airsyncbasefilereference"])) { $msg = $backend->ItemOperationsGetAttachmentData($value["airsyncbasefilereference"]); } else { $msg = $backend->Fetch($value['folderid'], $value['serverentryid'], $value['bodypreference']); } } $msg->encode($encoder); $encoder->endTag(); // end SYNC_ITEMOPERATIONS_PROPERTIES $encoder->endTag(); // end SYNC_ITEMOPERATIONS_FETCH break; case "documentlibrary": if (isset($value['username'])) { if (strpos($value['username'], "\\")) { list($cred['username']['domain'], $cred['username']['username']) = explode("\\", $value['username']); } else { $cred['username'] = array('domain' => "", 'username' => $value['username']); } } else { $cred['username']['domain'] = $auth_domain; $cred['username']['username'] = $auth_user; } $cred['password'] = isset($value['password']) ? $value['password'] : $auth_pw; $result = $backend->ItemOperationsGetDocumentLibraryLink($value["documentlibrarylinkid"], $cred); $encoder->startTag(SYNC_ITEMOPERATIONS_FETCH); $encoder->startTag(SYNC_ITEMOPERATIONS_STATUS); $encoder->content($result['status']); // $encoder->content(1); $encoder->endTag(); // end SYNC_ITEMOPERATIONS_STATUS $encoder->startTag(SYNC_DOCUMENTLIBRARY_LINKID); $encoder->content($value["documentlibrarylinkid"]); $encoder->endTag(); // end SYNC_DOCUMENTLIBRARY_LINKID if ($result['status'] == 1) { $encoder->startTag(SYNC_ITEMOPERATIONS_PROPERTIES); if ($multipart == true) { $encoder->_bodyparts[] = $result['data']; $encoder->startTag(SYNC_ITEMOPERATIONS_PART); $encoder->content("" . sizeof($encoder->_bodyparts) . ""); $encoder->endTag(); } else { $encoder->startTag(SYNC_ITEMOPERATIONS_DATA); $encoder->content($result['data']); $encoder->endTag(); // end SYNC_ITEMOPERATIONS_DATA } $encoder->startTag(SYNC_ITEMOPERATIONS_VERSION); $encoder->content(gmstrftime("%Y-%m-%dT%H:%M:%S.000Z", $result['version'])); $encoder->endTag(); // end SYNC_ITEMOPERATIONS_VERSION $encoder->endTag(); // end SYNC_ITEMOPERATIONS_PROPERTIES } else { $encoder->_bodyparts = array(); } $encoder->endTag(); // end SYNC_ITEMOPERATIONS_FETCH break; default: debugLog("Store " . $value["type"] . " not supported by HandleItemOperations"); break; } break; default: debugLog("Operations " . $value["type"] . " not supported by HandleItemOperations"); break; } } $encoder->endTag(); //end SYNC_ITEMOPERATIONS_RESPONSE $encoder->endTag(); //end SYNC_ITEMOPERATIONS_ITEMOPERATIONS return true; }