function HandleSearch($backend, $devid, $protocolversion) { 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_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; } //START CHANGED dw2412 V12.0 Support switch (strtolower($searchname)) { case 'documentlibrary': $searchquery['query'] = ParseQuery($decoder); break; case 'mailbox': $searchquery['query'] = ParseQuery($decoder); break; case 'gal': $searchquery['query'] = $decoder->getElementContent(); break; } if (!$decoder->getElementEndTag()) { return false; } if ($decoder->getElementStartTag(SYNC_SEARCH_OPTIONS)) { $searchquerydeeptraversal = false; $searchqueryrebuildresults = false; $searchschema = false; $rightsmanagementsupport = false; $mimesupport = 0; while (($searchoptionstag = $decoder->getElementStartTag(SYNC_SEARCH_RANGE) ? SYNC_SEARCH_RANGE : ($decoder->getElementStartTag(SYNC_SEARCH_DEEPTRAVERSAL) ? SYNC_SEARCH_DEEPTRAVERSAL : ($decoder->getElementStartTag(SYNC_SEARCH_REBUILDRESULTS) ? SYNC_SEARCH_REBUILDRESULTS : ($decoder->getElementStartTag(SYNC_SEARCH_USERNAME) ? SYNC_SEARCH_USERNAME : ($decoder->getElementStartTag(SYNC_SEARCH_PASSWORD) ? SYNC_SEARCH_PASSWORD : ($decoder->getElementStartTag(SYNC_SEARCH_SCHEMA) ? SYNC_SEARCH_SCHEMA : ($decoder->getElementStartTag(SYNC_SEARCH_PICTURE) ? SYNC_SEARCH_PICTURE : ($decoder->getElementStartTag(SYNC_MIMESUPPORT) ? SYNC_MIMESUPPORT : ($decoder->getElementStartTag(SYNC_MIMETRUNCATION) ? SYNC_MIMETRUNCATION : ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_BODYPREFERENCE) ? SYNC_AIRSYNCBASE_BODYPREFERENCE : ($decoder->getElementStartTag(SYNC_RIGHTSMANAGEMENT_RIGHTSMANAGEMENTSUPPORT) ? SYNC_RIGHTSMANAGEMENT_RIGHTSMANAGEMENTSUPPORT : -1))))))))))) != -1) { switch ($searchoptionstag) { case SYNC_SEARCH_RANGE: if ($searchrange = $decoder->getElementContent()) { if (!$decoder->getElementEndTag()) { return false; } } break; //START ADDED dw2412 V12.0 Support //START ADDED dw2412 V12.0 Support case SYNC_SEARCH_DEEPTRAVERSAL: if (!($searchdeeptraversal = $decoder->getElementContent())) { $searchquerydeeptraversal = true; } else { if (!$decoder->getElementEndTag()) { return false; } } break; case SYNC_SEARCH_REBUILDRESULTS: if (!($searchrebuildresults = $decoder->getElementContent())) { $searchqueryrebuildresults = true; } else { if (!$decoder->getElementEndTag()) { return false; } } break; case SYNC_SEARCH_USERNAME: if (!($searchqueryusername = $decoder->getElementContent())) { return false; } else { if (!$decoder->getElementEndTag()) { return false; } } break; case SYNC_SEARCH_PASSWORD: if (!($searchquerypassword = $decoder->getElementContent())) { return false; } else { if (!$decoder->getElementEndTag()) { return false; } } break; case SYNC_SEARCH_SCHEMA: if (!($searchschema = $decoder->getElementContent())) { $searchschema = true; } else { if (!$decoder->getElementEndTag()) { return false; } } break; case SYNC_MIMESUPPORT: $mimesupport = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; case SYNC_MIMETRUNCATION: $mimetruncation = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; case SYNC_AIRSYNCBASE_BODYPREFERENCE: $bodypreference = array(); while (($bodypreferencefield = $decoder->getElementStartTag(SYNC_AIRSYNCBASE_TYPE) ? SYNC_AIRSYNCBASE_TYPE : ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_TRUNCATIONSIZE) ? SYNC_AIRSYNCBASE_TRUNCATIONSIZE : ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_PREVIEW) ? SYNC_AIRSYNCBASE_PREVIEW : ($decoder->getElementStartTag(SYNC_AIRSYNCBASE_ALLORNONE) ? SYNC_AIRSYNCBASE_ALLORNONE : -1)))) != -1) { switch ($bodypreferencefield) { case SYNC_AIRSYNCBASE_TYPE: $bodypreference["Type"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; case SYNC_AIRSYNCBASE_TRUNCATIONSIZE: $bodypreference["TruncationSize"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; case SYNC_AIRSYNCBASE_PREVIEW: $bodypreference["Preview"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; case SYNC_AIRSYNCBASE_ALLORNONE: $bodypreference["AllOrNone"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; } if (isset($bodypreference["Type"])) { $searchbodypreference[$bodypreference["Type"]] = $bodypreference; } } $decoder->getElementEndTag(); break; case SYNC_SEARCH_PICTURE: $searchpicture = array(); while (($searchpicturefield = $decoder->getElementStartTag(SYNC_SEARCH_MAXSIZE) ? SYNC_SEARCH_MAXSIZE : ($decoder->getElementStartTag(SYNC_SEARCH_MAXPICTURES) ? SYNC_SEARCH_MAXPICTURES : -1)) != -1) { switch ($searchpicturefield) { case SYNC_SEARCH_MAXSIZE: $searchpicture["MaxSize"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; case SYNC_SEARCH_MAXPICTURES: $searchpicture["MaxPictures"] = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; } } if (count($searchpicture) > 0) { $decoder->getElementEndTag(); } break; case SYNC_RIGHTSMANAGEMENT_RIGHTSMANAGEMENTSUPPORT: $rightsmanagementsupport = $decoder->getElementContent(); if (!$decoder->getElementEndTag()) { return false; } break; } //END ADDED dw2412 V12.0 Support } if (!$decoder->getElementEndTag()) { //options return false; } } if (!$decoder->getElementEndTag()) { //store return false; } if (!$decoder->getElementEndTag()) { //search return false; } //START CHANGED dw2412 V12.0 Support switch (strtolower($searchname)) { case 'documentlibrary': if (isset($searchqueryusername)) { if (strpos($searchqueryusername, "\\")) { list($searchquery['username']['domain'], $searchquery['username']['username']) = explode("\\", $searchqueryusername); } else { $searchquery['username'] = array('domain' => "", 'username' => $searchqueryusername); } } else { $searchquery['username']['domain'] = $auth_domain; $searchquery['username']['username'] = $auth_user; } $searchquery['password'] = isset($searchquerypassword) ? $searchquerypassword : $auth_pw; $searchquery['range'] = $searchrange; break; case 'mailbox': $searchquery['rebuildresults'] = $searchqueryrebuildresults; $searchquery['deeptraversal'] = $searchquerydeeptraversal; $searchquery['range'] = $searchrange; break; case 'gal': $searchquery['range'] = $searchrange; if (isset($searchpicture)) { $searchquery['searchpicture'] = $searchpicture; } break; } //get search results from backend $result = $backend->getSearchResults($searchquery, $searchname); //END CHANGED dw2412 V12.0 Support $encoder->startWBXML(); // START ADDED dw2412 Protocol Version 12 Support if (isset($searchbodypreference)) { $encoder->_bodypreference = $searchbodypreference; } // END ADDED dw2412 Protocol Version 12 Support $encoder->startTag(SYNC_SEARCH_SEARCH); $encoder->startTag(SYNC_SEARCH_STATUS); $encoder->content($result['global_search_status']); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_RESPONSE); $encoder->startTag(SYNC_SEARCH_STORE); $encoder->startTag(SYNC_SEARCH_STATUS); $encoder->content($result['status']); $encoder->endTag(); if ($result['status'] == 1) { // CHANGED dw2412 AS V12.0 Support (mentain single return way...) if (isset($result['rows']) && is_array($result['rows']) && !empty($result['rows'])) { $searchtotal = count($result['rows']); // CHANGED dw2412 AS V12.0 Support (honor the range in request...) $range = explode("-", $searchrange); $returnitems = $range[1] - $range[0]; $returneditems = 0; $result['rows'] = array_slice($result['rows'], $range[0], $returnitems + 1, true); // CHANGED dw2412 AS V12.0 Support (mentain single return way...) foreach ($result['rows'] as $u) { // CHANGED dw2412 AS V12.0 Support (honor the range in request...) if ($returneditems > $returnitems) { break; } $returneditems++; switch (strtolower($searchname)) { case 'documentlibrary': $encoder->startTag(SYNC_SEARCH_RESULT); $encoder->startTag(SYNC_SEARCH_PROPERTIES); $encoder->startTag(SYNC_DOCUMENTLIBRARY_LINKID); $encoder->content($u['linkid']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_DISPLAYNAME); $encoder->content($u['displayname']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_CREATIONDATE); $encoder->content($u['creationdate']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_LASTMODIFIEDDATE); $encoder->content($u['lastmodifieddate']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_ISHIDDEN); $encoder->content($u['ishidden']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_ISFOLDER); $encoder->content($u['isfolder']); $encoder->endTag(); if ($u['isfolder'] == "0") { $encoder->startTag(SYNC_DOCUMENTLIBRARY_CONTENTLENGTH); $encoder->content($u['contentlength']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_CONTENTTYPE); $encoder->content($u['contenttype']); $encoder->endTag(); } $encoder->endTag(); //result $encoder->endTag(); //properties break; case 'mailbox': $encoder->startTag(SYNC_SEARCH_RESULT); $encoder->startTag(SYNC_FOLDERTYPE); $encoder->content('Email'); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_LONGID); $encoder->content($u['uniqueid']); $encoder->endTag(); $encoder->startTag(SYNC_FOLDERID); $encoder->content($u['searchfolderid']); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_PROPERTIES); $msg = $backend->ItemOperationsFetchMailbox($u['uniqueid'], $searchbodypreference, $mimesupport); $msg->encode($encoder); $encoder->endTag(); //properties $encoder->endTag(); //result break; case 'gal': $encoder->startTag(SYNC_SEARCH_RESULT); $encoder->startTag(SYNC_SEARCH_PROPERTIES); if (isset($u["fullname"]) && $u["fullname"] != "") { $encoder->startTag(SYNC_GAL_DISPLAYNAME); $encoder->content($u["fullname"]); $encoder->endTag(); } if (isset($u["phone"]) && $u["phone"] != "") { $encoder->startTag(SYNC_GAL_PHONE); $encoder->content($u["phone"]); $encoder->endTag(); } if (isset($u["homephone"]) && $u["homephone"] != "") { $encoder->startTag(SYNC_GAL_HOMEPHONE); $encoder->content($u["homephone"]); $encoder->endTag(); } if (isset($u["mobilephone"]) && $u["mobilephone"] != "") { $encoder->startTag(SYNC_GAL_MOBILEPHONE); $encoder->content($u["mobilephone"]); $encoder->endTag(); } if (isset($u["company"]) && $u["company"] != "") { $encoder->startTag(SYNC_GAL_COMPANY); $encoder->content($u["company"]); $encoder->endTag(); } if (isset($u["office"]) && $u["office"] != "") { $encoder->startTag(SYNC_GAL_OFFICE); $encoder->content($u["office"]); $encoder->endTag(); } if (isset($u["title"]) && $u["title"] != "") { $encoder->startTag(SYNC_GAL_TITLE); $encoder->content($u["title"]); $encoder->endTag(); } if (isset($u["username"]) && $u["username"] != "") { $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 break; } } $searchrange = $range[0] . "-" . ($range[0] + $returneditems - 1); $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 HandleSearch($backend, $devid, $protocolversion) { 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_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; } //START CHANGED dw2412 V12.0 Support switch (strtolower($searchname)) { case 'documentlibrary': $searchquery['query'] = ParseQuery($decoder); break; case 'mailbox': $searchquery['query'] = ParseQuery($decoder); break; case 'gal': $searchquery = $decoder->getElementContent(); break; } 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; } } //START ADDED dw2412 V12.0 Support if ($decoder->getElementStartTag(SYNC_SEARCH_DEEPTRAVERSAL)) { if (!($searchdeeptraversal = $decoder->getElementContent())) { $searchquerydeeptraversal = true; } else { if (!$decoder->getElementEndTag()) { return false; } } } if ($decoder->getElementStartTag(SYNC_SEARCH_REBUILDRESULTS)) { if (!($searchrebuildresults = $decoder->getElementContent())) { $searchqueryrebuildresults = true; } else { if (!$decoder->getElementEndTag()) { return false; } } } if ($decoder->getElementStartTag(SYNC_SEARCH_USERNAME)) { if (!($searchqueryusername = $decoder->getElementContent())) { return false; } else { if (!$decoder->getElementEndTag()) { return false; } } } if ($decoder->getElementStartTag(SYNC_SEARCH_PASSWORD)) { if (!($searchquerypassword = $decoder->getElementContent())) { return false; } else { if (!$decoder->getElementEndTag()) { return false; } } } if ($decoder->getElementStartTag(SYNC_SEARCH_SCHEMA)) { if (!($searchschema = $decoder->getElementContent())) { $searchschema = true; } else { if (!$decoder->getElementEndTag()) { return false; } } } 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($searchbodypreference["wanted"])) { $searchbodypreference["wanted"] = $bodypreference["Type"]; } if (isset($bodypreference["Type"])) { $searchbodypreference[$bodypreference["Type"]] = $bodypreference; } break; } } } //END ADDED dw2412 V12.0 Support $e = $decoder->peek(); if ($e[EN_TYPE] == EN_TYPE_ENDTAG) { $decoder->getElementEndTag(); break; } } } if (!$decoder->getElementEndTag()) { //store return false; } if (!$decoder->getElementEndTag()) { //search return false; } //START CHANGED dw2412 V12.0 Support switch (strtolower($searchname)) { case 'documentlibrary': if (isset($searchqueryusername)) { if (strpos($searchqueryusername, "\\")) { list($searchquery['username']['domain'], $searchquery['username']['username']) = explode("\\", $searchqueryusername); } else { $searchquery['username'] = array('domain' => "", 'username' => $searchqueryusername); } } else { $searchquery['username']['domain'] = $auth_domain; $searchquery['username']['username'] = $auth_user; } $searchquery['password'] = isset($searchquerypassword) ? $searchquerypassword : $auth_pw; $searchquery['range'] = $searchrange; break; case 'mailbox': $searchquery['rebuildresults'] = $searchqueryrebuildresults; $searchquery['deeptraversal'] = $searchquerydeeptraversal; $searchquery['range'] = $searchrange; break; } //get search results from backend $result = $backend->getSearchResults($searchquery, $searchname); //END CHANGED dw2412 V12.0 Support $encoder->startWBXML(); // START ADDED dw2412 Protocol Version 12 Support if (isset($searchbodypreference)) { $encoder->_bodypreference = $searchbodypreference; } // END ADDED dw2412 Protocol Version 12 Support $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($result['status']); $encoder->endTag(); // CHANGED dw2412 AS V12.0 Support (mentain single return way...) if (is_array($result['rows']) && !empty($result['rows'])) { $searchtotal = count($result['rows']); // CHANGED dw2412 AS V12.0 Support (honor the range in request...) eregi("(.*)\\-(.*)", $searchrange, $range); $returnitems = $range[2] - $range[1]; $returneditems = 0; $result['rows'] = array_slice($result['rows'], $range[1], $returnitems + 1, true); // CHANGED dw2412 AS V12.0 Support (mentain single return way...) foreach ($result['rows'] as $u) { // CHANGED dw2412 AS V12.0 Support (honor the range in request...) if ($returneditems > $returnitems) { break; } $returneditems++; switch (strtolower($searchname)) { case 'documentlibrary': $encoder->startTag(SYNC_SEARCH_RESULT); $encoder->startTag(SYNC_SEARCH_PROPERTIES); $encoder->startTag(SYNC_DOCUMENTLIBRARY_LINKID); $encoder->content($u['linkid']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_DISPLAYNAME); $encoder->content($u['displayname']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_CREATIONDATE); $encoder->content($u['creationdate']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_LASTMODIFIEDDATE); $encoder->content($u['lastmodifieddate']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_ISHIDDEN); $encoder->content($u['ishidden']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_ISFOLDER); $encoder->content($u['isfolder']); $encoder->endTag(); if ($u['isfolder'] == "0") { $encoder->startTag(SYNC_DOCUMENTLIBRARY_CONTENTLENGTH); $encoder->content($u['contentlength']); $encoder->endTag(); $encoder->startTag(SYNC_DOCUMENTLIBRARY_CONTENTTYPE); $encoder->content($u['contenttype']); $encoder->endTag(); } $encoder->endTag(); //result $encoder->endTag(); //properties break; case 'mailbox': $encoder->startTag(SYNC_SEARCH_RESULT); $encoder->startTag(SYNC_FOLDERTYPE); $encoder->content('Email'); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_LONGID); $encoder->content($u['uniqueid']); $encoder->endTag(); $encoder->startTag(SYNC_FOLDERID); $encoder->content($u['searchfolderid']); $encoder->endTag(); $encoder->startTag(SYNC_SEARCH_PROPERTIES); $msg = $backend->ItemOperationsFetchMailbox($u['uniqueid'], $searchbodypreference); $msg->encode($encoder); $encoder->endTag(); //properties $encoder->endTag(); //result break; case 'gal': $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 break; } } $searchrange = $range[1] . "-" . ($range[1] + $returneditems - 1); $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; }