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 HandleSync($backend, $protocolversion, $devid) { global $zpushdtd; global $input, $output; // Contains all containers requested $collections = array(); // Init WBXML decoder $decoder = new WBXMLDecoder($input, $zpushdtd); // Init state machine $statemachine = new StateMachine(); // Start decode if (!$decoder->getElementStartTag(SYNC_SYNCHRONIZE)) { return false; } if (!$decoder->getElementStartTag(SYNC_FOLDERS)) { return false; } while ($decoder->getElementStartTag(SYNC_FOLDER)) { $collection = array(); $collection["truncation"] = SYNC_TRUNCATION_ALL; $collection["clientids"] = array(); $collection["fetchids"] = array(); if (!$decoder->getElementStartTag(SYNC_FOLDERTYPE)) { return false; } $collection["class"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } if (!$decoder->getElementStartTag(SYNC_SYNCKEY)) { return false; } $collection["synckey"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } if ($decoder->getElementStartTag(SYNC_FOLDERID)) { $collection["collectionid"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_SUPPORTED)) { while (1) { $el = $decoder->getElement(); if ($el[EN_TYPE] == EN_TYPE_ENDTAG) { break; } } } if ($decoder->getElementStartTag(SYNC_DELETESASMOVES)) { $collection["deletesasmoves"] = true; } if ($decoder->getElementStartTag(SYNC_GETCHANGES)) { $collection["getchanges"] = true; } if ($decoder->getElementStartTag(SYNC_MAXITEMS)) { $collection["maxitems"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_OPTIONS)) { while (1) { if ($decoder->getElementStartTag(SYNC_FILTERTYPE)) { $collection["filtertype"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_TRUNCATION)) { $collection["truncation"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_RTFTRUNCATION)) { $collection["rtftruncation"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_MIMESUPPORT)) { $collection["mimesupport"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_MIMETRUNCATION)) { $collection["mimetruncation"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } if ($decoder->getElementStartTag(SYNC_CONFLICT)) { $collection["conflict"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } } $e = $decoder->peek(); if ($e[EN_TYPE] == EN_TYPE_ENDTAG) { $decoder->getElementEndTag(); break; } } } // compatibility mode - get folderid from the state directory if (!isset($collection["collectionid"])) { $collection["collectionid"] = _getFolderID($devid, $collection["class"]); } // compatibility mode - set default conflict behavior if no conflict resolution algorithm is set (OVERWRITE_PIM) if (!isset($collection["conflict"])) { $collection["conflict"] = 1; } // Get our sync state for this collection $collection["syncstate"] = $statemachine->getSyncState($collection["synckey"]); if ($decoder->getElementStartTag(SYNC_PERFORM)) { // Configure importer with last state $importer = $backend->GetContentsImporter($collection["collectionid"]); $importer->Config($collection["syncstate"], $collection["conflict"]); $nchanges = 0; while (1) { $element = $decoder->getElement(); // MODIFY or REMOVE or ADD or FETCH if ($element[EN_TYPE] != EN_TYPE_STARTTAG) { $decoder->ungetElement($element); break; } $nchanges++; if ($decoder->getElementStartTag(SYNC_SERVERENTRYID)) { $serverid = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { // end serverid return false; } } else { $serverid = false; } if ($decoder->getElementStartTag(SYNC_CLIENTENTRYID)) { $clientid = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { // end clientid return false; } } else { $clientid = false; } // Get application data if available if ($decoder->getElementStartTag(SYNC_DATA)) { switch ($collection["class"]) { case "Email": $appdata = new SyncMail(); $appdata->decode($decoder); break; case "Contacts": $appdata = new SyncContact($protocolversion); $appdata->decode($decoder); break; case "Calendar": $appdata = new SyncAppointment(); $appdata->decode($decoder); break; case "Tasks": $appdata = new SyncTask(); $appdata->decode($decoder); break; } if (!$decoder->getElementEndTag()) { // end applicationdata return false; } } switch ($element[EN_TAG]) { case SYNC_MODIFY: if (isset($appdata)) { if (isset($appdata->read)) { // Currently, 'read' is only sent by the PDA when it is ONLY setting the read flag. $importer->ImportMessageReadFlag($serverid, $appdata->read); } else { $importer->ImportMessageChange($serverid, $appdata); } $collection["importedchanges"] = true; } break; case SYNC_ADD: if (isset($appdata)) { $id = $importer->ImportMessageChange(false, $appdata); if ($clientid && $id) { $collection["clientids"][$clientid] = $id; $collection["importedchanges"] = true; } } break; case SYNC_REMOVE: if (isset($collection["deletesasmoves"])) { $folderid = $backend->GetWasteBasket(); if ($folderid) { $importer->ImportMessageMove($serverid, $folderid); $collection["importedchanges"] = true; break; } } $importer->ImportMessageDeletion($serverid); $collection["importedchanges"] = true; break; case SYNC_FETCH: array_push($collection["fetchids"], $serverid); break; } if (!$decoder->getElementEndTag()) { // end change/delete/move return false; } } debugLog("Processed {$nchanges} incoming changes"); // Save the updated state, which is used for the exporter later $collection["syncstate"] = $importer->getState(); if (!$decoder->getElementEndTag()) { // end commands return false; } } if (!$decoder->getElementEndTag()) { // end collection return false; } array_push($collections, $collection); } if (!$decoder->getElementEndTag()) { // end collections return false; } if (!$decoder->getElementEndTag()) { // end sync return false; } $encoder = new WBXMLEncoder($output, $zpushdtd); $encoder->startWBXML(); $encoder->startTag(SYNC_SYNCHRONIZE); $encoder->startTag(SYNC_FOLDERS); foreach ($collections as $collection) { // Get a new sync key to output to the client if any changes have been requested or have been sent if (isset($collection["importedchanges"]) || isset($collection["getchanges"]) || $collection["synckey"] == "0") { $collection["newsynckey"] = $statemachine->getNewSyncKey($collection["synckey"]); } $encoder->startTag(SYNC_FOLDER); $encoder->startTag(SYNC_FOLDERTYPE); $encoder->content($collection["class"]); $encoder->endTag(); $encoder->startTag(SYNC_SYNCKEY); if (isset($collection["newsynckey"])) { $encoder->content($collection["newsynckey"]); } else { $encoder->content($collection["synckey"]); } $encoder->endTag(); $encoder->startTag(SYNC_FOLDERID); $encoder->content($collection["collectionid"]); $encoder->endTag(); $encoder->startTag(SYNC_STATUS); $encoder->content(1); $encoder->endTag(); // Output server IDs for new items we received from the PDA if (isset($collection["clientids"]) || count($collection["fetchids"]) > 0) { $encoder->startTag(SYNC_REPLIES); foreach ($collection["clientids"] as $clientid => $serverid) { $encoder->startTag(SYNC_ADD); $encoder->startTag(SYNC_CLIENTENTRYID); $encoder->content($clientid); $encoder->endTag(); $encoder->startTag(SYNC_SERVERENTRYID); $encoder->content($serverid); $encoder->endTag(); $encoder->startTag(SYNC_STATUS); $encoder->content(1); $encoder->endTag(); $encoder->endTag(); } foreach ($collection["fetchids"] as $id) { $data = $backend->Fetch($collection["collectionid"], $id); if ($data !== false) { $encoder->startTag(SYNC_FETCH); $encoder->startTag(SYNC_SERVERENTRYID); $encoder->content($id); $encoder->endTag(); $encoder->startTag(SYNC_STATUS); $encoder->content(1); $encoder->endTag(); $encoder->startTag(SYNC_DATA); $data->encode($encoder); $encoder->endTag(); $encoder->endTag(); } else { debugLog("unable to fetch {$id}"); } } $encoder->endTag(); } if (isset($collection["getchanges"])) { // Use the state from the importer, as changes may have already happened $exporter = $backend->GetExporter($collection["collectionid"]); $filtertype = isset($collection["filtertype"]) ? $collection["filtertype"] : false; $exporter->Config($importer, $collection["class"], $filtertype, $collection["syncstate"], 0, $collection["truncation"]); $changecount = $exporter->GetChangeCount(); if ($changecount > $collection["maxitems"]) { $encoder->startTag(SYNC_MOREAVAILABLE, false, true); } // Output message changes per folder $encoder->startTag(SYNC_PERFORM); // Stream the changes to the PDA $importer = new ImportContentsChangesStream($encoder, GetObjectClassFromFolderClass($collection["class"])); $filtertype = isset($collection["filtertype"]) ? $collection["filtertype"] : 0; $n = 0; while (1) { $progress = $exporter->Synchronize(); if (!is_array($progress)) { break; } $n++; if ($n >= $collection["maxitems"]) { break; } } $encoder->endTag(); } $encoder->endTag(); // Save the sync state for the next time if (isset($collection["newsynckey"])) { if (isset($exporter) && $exporter) { $state = $exporter->GetState(); } else { if (isset($importer) && $importer) { $state = $importer->GetState(); } else { if ($collection["synckey"] == "0") { $state = ""; } } } if (isset($state)) { $statemachine->setSyncState($collection["newsynckey"], $state); } else { debugLog("error saving " . $collection["newsynckey"] . " - no state information available"); } } } $encoder->endTag(); $encoder->endTag(); 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(); $mimesupport = 0; $rightsmanagementsupport = false; while (($reqtype = $decoder->getElementStartTag(SYNC_ITEMOPERATIONS_FETCH) ? SYNC_ITEMOPERATIONS_FETCH : ($decoder->getElementStartTag(SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENT) ? SYNC_ITEMOPERATIONS_EMPTYFOLDERCONTENT : -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) { while (($thisoption = $decoder->getElementStartTag(SYNC_MIMESUPPORT) ? SYNC_MIMESUPPORT : ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_BODYPREFERENCE) ? SYNC_AIRSYNCBASE_BODYPREFERENCE : ($decoder->getElementStartTag(SYNC_RIGHTSMANAGEMENT_RIGHTSMANAGEMENTSUPPORT) ? SYNC_RIGHTSMANAGEMENT_RIGHTSMANAGEMENTSUPPORT : -1))) != -1) { switch ($thisoption) { case SYNC_MIMESUPPORT: $mimesupport = $decoder->getElementContent(); $decoder->getElementEndTag(); break; case 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; } } break; case SYNC_RIGHTSMANAGEMENT_RIGHTSMANAGEMENTSUPPORT: $rightsmanagementsupport = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } 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 $msg = $backend->ItemOperationsGetAttachmentData($value["airsyncbasefilereference"]); } else { if (isset($value["searchlongid"])) { $encoder->startTag(SYNC_SEARCH_LONGID); $encoder->content($value["searchlongid"]); $encoder->endTag(); $encoder->startTag(SYNC_FOLDERTYPE); $encoder->content("Email"); $encoder->endTag(); $msg = $backend->ItemOperationsFetchMailbox($value['searchlongid'], $value['bodypreference'], $mimesupport); } 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 } $encoder->startTag(SYNC_FOLDERTYPE); $encoder->content("Email"); $encoder->endTag(); $msg = $backend->Fetch($value['folderid'], $value['serverentryid'], $value['bodypreference'], false, $mimesupport); } } $encoder->startTag(SYNC_ITEMOPERATIONS_PROPERTIES); $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; }
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; }