コード例 #1
0
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;
}
コード例 #2
0
ファイル: request.php プロジェクト: jkreska/test1
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;
}
コード例 #3
0
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;
}
コード例 #4
0
ファイル: request.php プロジェクト: nnaannoo/paskot
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;
}