Back to index

d-push  2.0
Public Member Functions | Static Public Member Functions | Static Protected Attributes
Search Class Reference
Inheritance diagram for Search:
Inheritance graph
[legend]
Collaboration diagram for Search:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 Handle ($commandCode)
 Handles the Search command.

Static Public Member Functions

static Authenticate ()
 Authenticates the remote user The sent HTTP authentication information is used to on Backend->Logon().
static isUserAuthenticated ()
 Indicates if the user was "authenticated".
static Initialize ()
 Initialize the RequestProcessor.
static HandleRequest ()
 Loads the command handler and processes a command sent from the mobile.

Static Protected Attributes

static $backend
static $deviceManager
static $topCollector
static $decoder
static $encoder
static $userIsAuthenticated

Detailed Description

Definition at line 44 of file search.php.


Member Function Documentation

static RequestProcessor::Authenticate ( ) [static, inherited]

Authenticates the remote user The sent HTTP authentication information is used to on Backend->Logon().

As second step the GET-User verified by Backend->Setup() for permission check Request::GetGETUser() is usually the same as the Request::GetAuthUser(). If the GETUser is different from the AuthUser, the AuthUser MUST HAVE admin permissions on GETUsers data store. Only then the Setup() will be sucessfull. This allows the user 'john' to do operations as user 'joe' if he has sufficient privileges.

public

Returns:
Exceptions:
AuthenticationRequiredException

Definition at line 72 of file requestprocessor.php.

                                          {
        self::$userIsAuthenticated = false;

        $backend = ZPush::GetBackend();
        if($backend->Logon(Request::GetAuthUser(), Request::GetAuthDomain(), Request::GetAuthPassword()) == false)
            throw new AuthenticationRequiredException("Access denied. Username or password incorrect");

        // mark this request as "authenticated"
        self::$userIsAuthenticated = true;

        // check Auth-User's permissions on GETUser's store
        if($backend->Setup(Request::GetGETUser(), true) == false)
            throw new AuthenticationRequiredException(sprintf("Not enough privileges of '%s' to setup for user '%s': Permission denied", Request::GetAuthUser(), Request::GetGETUser()));
    }

Here is the call graph for this function:

Here is the caller graph for this function:

Search::Handle ( commandCode)

Handles the Search command.

Parameters:
int$commandCodepublic
Returns:
boolean

Reimplemented from RequestProcessor.

Definition at line 54 of file search.php.

                                         {
        $searchrange = '0';
        $cpo = new ContentParameters();

        if(!self::$decoder->getElementStartTag(SYNC_SEARCH_SEARCH))
            return false;

        // TODO check: possible to search in other stores?
        if(!self::$decoder->getElementStartTag(SYNC_SEARCH_STORE))
            return false;

        if(!self::$decoder->getElementStartTag(SYNC_SEARCH_NAME))
            return false;
        $searchname = strtoupper(self::$decoder->getElementContent());
        if(!self::$decoder->getElementEndTag())
            return false;

        if(!self::$decoder->getElementStartTag(SYNC_SEARCH_QUERY))
            return false;

        // check if it is a content of an element (= GAL search)
        // or a starttag (= mailbox or documentlibrary search)
        $searchquery = self::$decoder->getElementContent();
        if($searchquery && !self::$decoder->getElementEndTag())
            return false;

        if ($searchquery === false) {
            $cpo->SetSearchName($searchname);
            if (self::$decoder->getElementStartTag(SYNC_SEARCH_AND)) {
                if (self::$decoder->getElementStartTag(SYNC_FOLDERID)) {
                    $searchfolderid = self::$decoder->getElementContent();
                    $cpo->SetSearchFolderid($searchfolderid);
                    if(!self::$decoder->getElementEndTag()) // SYNC_FOLDERTYPE
                    return false;
                }


                if (self::$decoder->getElementStartTag(SYNC_FOLDERTYPE)) {
                    $searchclass = self::$decoder->getElementContent();
                    $cpo->SetSearchClass($searchclass);
                    if(!self::$decoder->getElementEndTag()) // SYNC_FOLDERTYPE
                        return false;
                }

                if (self::$decoder->getElementStartTag(SYNC_FOLDERID)) {
                    $searchfolderid = self::$decoder->getElementContent();
                    $cpo->SetSearchFolderid($searchfolderid);
                    if(!self::$decoder->getElementEndTag()) // SYNC_FOLDERTYPE
                    return false;
                }

                if (self::$decoder->getElementStartTag(SYNC_SEARCH_FREETEXT)) {
                    $searchfreetext = self::$decoder->getElementContent();
                    $cpo->SetSearchFreeText($searchfreetext);
                    if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_FREETEXT
                    return false;
                }

                //TODO - review
                if (self::$decoder->getElementStartTag(SYNC_SEARCH_GREATERTHAN)) {
                    if(self::$decoder->getElementStartTag(SYNC_POOMMAIL_DATERECEIVED)) {
                        $datereceivedgreater = true;
                        if (($dam = self::$decoder->getElementContent()) !== false) {
                            $datereceivedgreater = true;
                            if(!self::$decoder->getElementEndTag()) {
                                return false;
                            }
                        }
                        $cpo->SetSearchDateReceivedGreater($datereceivedgreater);
                    }

                    if(self::$decoder->getElementStartTag(SYNC_SEARCH_VALUE)) {
                        $searchvalue = self::$decoder->getElementContent();
                        $cpo->SetSearchValueGreater($searchvalue);
                        if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_VALUE
                            return false;
                    }

                    if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_GREATERTHAN
                        return false;
                }

                if (self::$decoder->getElementStartTag(SYNC_SEARCH_LESSTHAN)) {
                    if(self::$decoder->getElementStartTag(SYNC_POOMMAIL_DATERECEIVED)) {
                        $datereceivedless = true;
                        if (($dam = self::$decoder->getElementContent()) !== false) {
                            $datereceivedless = true;
                            if(!self::$decoder->getElementEndTag()) {
                                return false;
                            }
                        }
                        $cpo->SetSearchDateReceivedLess($datereceivedless);
                    }

                    if(self::$decoder->getElementStartTag(SYNC_SEARCH_VALUE)) {
                        $searchvalue = self::$decoder->getElementContent();
                        $cpo->SetSearchValueLess($searchvalue);
                        if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_VALUE
                         return false;
                    }

                    if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_LESSTHAN
                        return false;
                }

                if (self::$decoder->getElementStartTag(SYNC_SEARCH_FREETEXT)) {
                    $searchfreetext = self::$decoder->getElementContent();
                    $cpo->SetSearchFreeText($searchfreetext);
                    if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_FREETEXT
                    return false;
                }

                if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_AND
                    return false;
            }

            if(!self::$decoder->getElementEndTag()) // SYNC_SEARCH_QUERY
                return false;

        }

        if(self::$decoder->getElementStartTag(SYNC_SEARCH_OPTIONS)) {
            while(1) {
                if(self::$decoder->getElementStartTag(SYNC_SEARCH_RANGE)) {
                    $searchrange = self::$decoder->getElementContent();
                    $cpo->SetSearchRange($searchrange);
                    if(!self::$decoder->getElementEndTag())
                        return false;
                }


                if(self::$decoder->getElementStartTag(SYNC_SEARCH_REBUILDRESULTS)) {
                    $rebuildresults = true;
                    if (($dam = self::$decoder->getElementContent()) !== false) {
                        $rebuildresults = true;
                        if(!self::$decoder->getElementEndTag()) {
                            return false;
                        }
                    }
                    $cpo->SetSearchRebuildResults($rebuildresults);
                }

                if(self::$decoder->getElementStartTag(SYNC_SEARCH_DEEPTRAVERSAL)) {
                    $deeptraversal = true;
                    if (($dam = self::$decoder->getElementContent()) !== false) {
                        $deeptraversal = true;
                        if(!self::$decoder->getElementEndTag()) {
                            return false;
                        }
                    }
                    $cpo->SetSearchDeepTraversal($deeptraversal);
                }

                if(self::$decoder->getElementStartTag(SYNC_MIMESUPPORT)) {
                    $cpo->SetMimeSupport(self::$decoder->getElementContent());
                    if(!self::$decoder->getElementEndTag())
                    return false;
                }

                //TODO body preferences
                while (self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_BODYPREFERENCE)) {
                    if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_TYPE)) {
                        $bptype = self::$decoder->getElementContent();
                        $cpo->BodyPreference($bptype);
                        if(!self::$decoder->getElementEndTag()) {
                            return false;
                        }
                    }

                    if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_TRUNCATIONSIZE)) {
                        $cpo->BodyPreference($bptype)->SetTruncationSize(self::$decoder->getElementContent());
                        if(!self::$decoder->getElementEndTag())
                            return false;
                    }

                    if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_ALLORNONE)) {
                        $cpo->BodyPreference($bptype)->SetAllOrNone(self::$decoder->getElementContent());
                        if(!self::$decoder->getElementEndTag())
                            return false;
                    }

                    if(self::$decoder->getElementStartTag(SYNC_AIRSYNCBASE_PREVIEW)) {
                        $cpo->BodyPreference($bptype)->SetPreview(self::$decoder->getElementContent());
                        if(!self::$decoder->getElementEndTag())
                            return false;
                    }

                    if(!self::$decoder->getElementEndTag())
                        return false;
                }

                $e = self::$decoder->peek();
                if($e[EN_TYPE] == EN_TYPE_ENDTAG) {
                    self::$decoder->getElementEndTag();
                    break;
                }
            }
        }
        if(!self::$decoder->getElementEndTag()) //store
            return false;

        if(!self::$decoder->getElementEndTag()) //search
            return false;

        // get SearchProvider
        $searchprovider = ZPush::GetSearchProvider();
        $status = SYNC_SEARCHSTATUS_SUCCESS;
        $rows = array();

        // TODO support other searches
        if ($searchprovider->SupportsType($searchname)) {
            $storestatus = SYNC_SEARCHSTATUS_STORE_SUCCESS;
            try {
                if ($searchname == ISearchProvider::SEARCH_GAL) {
                    //get search results from the searchprovider
                    $rows = $searchprovider->GetGALSearchResults($searchquery, $searchrange);
                }
                elseif ($searchname == ISearchProvider::SEARCH_MAILBOX) {
                    $rows = $searchprovider->GetMailboxSearchResults($cpo);
                }
            }
            catch (StatusException $stex) {
                $storestatus = $stex->getCode();
            }
        }
        else {
            $rows = array('searchtotal' => 0);
            $status = SYNC_SEARCHSTATUS_SERVERERROR;
            ZLog::Write(LOGLEVEL_WARN, sprintf("Searchtype '%s' is not supported.", $searchname));
            self::$topCollector->AnnounceInformation(sprintf("Unsupported type '%s''", $searchname), true);
        }
        $searchprovider->Disconnect();

        self::$topCollector->AnnounceInformation(sprintf("'%s' search found %d results", $searchname, $rows['searchtotal']), true);

        self::$encoder->startWBXML();
        self::$encoder->startTag(SYNC_SEARCH_SEARCH);

            self::$encoder->startTag(SYNC_SEARCH_STATUS);
            self::$encoder->content($status);
            self::$encoder->endTag();

            if ($status == SYNC_SEARCHSTATUS_SUCCESS) {
                self::$encoder->startTag(SYNC_SEARCH_RESPONSE);
                self::$encoder->startTag(SYNC_SEARCH_STORE);

                    self::$encoder->startTag(SYNC_SEARCH_STATUS);
                    self::$encoder->content($storestatus);
                    self::$encoder->endTag();

                    if (isset($rows['range'])) {
                        $searchrange = $rows['range'];
                        unset($rows['range']);
                    }
                    if (isset($rows['searchtotal'])) {
                        $searchtotal = $rows['searchtotal'];
                        unset($rows['searchtotal']);
                    }
                    if ($searchname == ISearchProvider::SEARCH_GAL) {
                        if (is_array($rows) && !empty($rows)) {
                            foreach ($rows as $u) {
                                self::$encoder->startTag(SYNC_SEARCH_RESULT);
                                    self::$encoder->startTag(SYNC_SEARCH_PROPERTIES);

                                        self::$encoder->startTag(SYNC_GAL_DISPLAYNAME);
                                        self::$encoder->content((isset($u[SYNC_GAL_DISPLAYNAME]))?$u[SYNC_GAL_DISPLAYNAME]:"No name");
                                        self::$encoder->endTag();

                                        if (isset($u[SYNC_GAL_PHONE])) {
                                            self::$encoder->startTag(SYNC_GAL_PHONE);
                                            self::$encoder->content($u[SYNC_GAL_PHONE]);
                                            self::$encoder->endTag();
                                        }

                                        if (isset($u[SYNC_GAL_OFFICE])) {
                                            self::$encoder->startTag(SYNC_GAL_OFFICE);
                                            self::$encoder->content($u[SYNC_GAL_OFFICE]);
                                            self::$encoder->endTag();
                                        }

                                        if (isset($u[SYNC_GAL_TITLE])) {
                                            self::$encoder->startTag(SYNC_GAL_TITLE);
                                            self::$encoder->content($u[SYNC_GAL_TITLE]);
                                            self::$encoder->endTag();
                                        }

                                        if (isset($u[SYNC_GAL_COMPANY])) {
                                            self::$encoder->startTag(SYNC_GAL_COMPANY);
                                            self::$encoder->content($u[SYNC_GAL_COMPANY]);
                                            self::$encoder->endTag();
                                        }

                                        if (isset($u[SYNC_GAL_ALIAS])) {
                                            self::$encoder->startTag(SYNC_GAL_ALIAS);
                                            self::$encoder->content($u[SYNC_GAL_ALIAS]);
                                            self::$encoder->endTag();
                                        }

                                        // Always send the firstname, even empty. Nokia needs this to display the entry
                                        self::$encoder->startTag(SYNC_GAL_FIRSTNAME);
                                        self::$encoder->content((isset($u[SYNC_GAL_FIRSTNAME]))?$u[SYNC_GAL_FIRSTNAME]:"");
                                        self::$encoder->endTag();

                                        self::$encoder->startTag(SYNC_GAL_LASTNAME);
                                        self::$encoder->content((isset($u[SYNC_GAL_LASTNAME]))?$u[SYNC_GAL_LASTNAME]:"No name");
                                        self::$encoder->endTag();

                                        if (isset($u[SYNC_GAL_HOMEPHONE])) {
                                            self::$encoder->startTag(SYNC_GAL_HOMEPHONE);
                                            self::$encoder->content($u[SYNC_GAL_HOMEPHONE]);
                                            self::$encoder->endTag();
                                        }

                                        if (isset($u[SYNC_GAL_MOBILEPHONE])) {
                                            self::$encoder->startTag(SYNC_GAL_MOBILEPHONE);
                                            self::$encoder->content($u[SYNC_GAL_MOBILEPHONE]);
                                            self::$encoder->endTag();
                                        }

                                        self::$encoder->startTag(SYNC_GAL_EMAILADDRESS);
                                        self::$encoder->content((isset($u[SYNC_GAL_EMAILADDRESS]))?$u[SYNC_GAL_EMAILADDRESS]:"");
                                        self::$encoder->endTag();

                                    self::$encoder->endTag();//result
                                self::$encoder->endTag();//properties
                            }
                        }
                    }
                    elseif ($searchname == ISearchProvider::SEARCH_MAILBOX) {
                        foreach ($rows as $u) {
                            self::$encoder->startTag(SYNC_SEARCH_RESULT);
                                self::$encoder->startTag(SYNC_FOLDERTYPE);
                                self::$encoder->content($u['class']);
                                self::$encoder->endTag();
                                self::$encoder->startTag(SYNC_SEARCH_LONGID);
                                self::$encoder->content($u['longid']);
                                self::$encoder->endTag();
                                self::$encoder->startTag(SYNC_FOLDERID);
                                self::$encoder->content($u['folderid']);
                                self::$encoder->endTag();

                                self::$encoder->startTag(SYNC_SEARCH_PROPERTIES);
                                    $tmp = explode(":", $u['longid']);
                                    $message = self::$backend->Fetch($u['folderid'], $tmp[1], $cpo);
                                    $message->Encode(self::$encoder);

                                self::$encoder->endTag();//result
                            self::$encoder->endTag();//properties
                        }
                    }
                    // it seems that android 4 requires range and searchtotal
                    // or it won't display the search results
                    if (isset($searchrange)) {
                        self::$encoder->startTag(SYNC_SEARCH_RANGE);
                        self::$encoder->content($searchrange);
                        self::$encoder->endTag();
                    }
                    if (isset($searchtotal) && $searchtotal > 0) {
                        self::$encoder->startTag(SYNC_SEARCH_TOTAL);
                        self::$encoder->content($searchtotal);
                        self::$encoder->endTag();
                    }

                self::$encoder->endTag();//store
                self::$encoder->endTag();//response
            }
        self::$encoder->endTag();//search

        return true;
    }

Here is the call graph for this function:

static RequestProcessor::HandleRequest ( ) [static, inherited]

Loads the command handler and processes a command sent from the mobile.

public

Returns:
boolean

Definition at line 122 of file requestprocessor.php.

                                           {
        $handler = ZPush::GetRequestHandlerForCommand(Request::GetCommandCode());

        // TODO handle WBXML exceptions here and print stack
        return $handler->Handle(Request::GetCommandCode());
    }

Here is the call graph for this function:

static RequestProcessor::Initialize ( ) [static, inherited]

Initialize the RequestProcessor.

public

Returns:

Definition at line 105 of file requestprocessor.php.

                                        {
        self::$backend = ZPush::GetBackend();
        self::$deviceManager = ZPush::GetDeviceManager();
        self::$topCollector = ZPush::GetTopCollector();

        if (!ZPush::CommandNeedsPlainInput(Request::GetCommandCode()))
            self::$decoder = new WBXMLDecoder(Request::GetInputStream());

        self::$encoder = new WBXMLEncoder(Request::GetOutputStream());
    }

Here is the call graph for this function:

static RequestProcessor::isUserAuthenticated ( ) [static, inherited]

Indicates if the user was "authenticated".

public

Returns:
boolean

Definition at line 93 of file requestprocessor.php.

                                                 {
        if (!isset(self::$userIsAuthenticated))
            return false;
        return self::$userIsAuthenticated;
    }

Here is the caller graph for this function:


Member Data Documentation

RequestProcessor::$backend [static, protected, inherited]

Definition at line 52 of file requestprocessor.php.

RequestProcessor::$decoder [static, protected, inherited]

Definition at line 55 of file requestprocessor.php.

RequestProcessor::$deviceManager [static, protected, inherited]

Definition at line 53 of file requestprocessor.php.

RequestProcessor::$encoder [static, protected, inherited]

Definition at line 56 of file requestprocessor.php.

RequestProcessor::$topCollector [static, protected, inherited]

Definition at line 54 of file requestprocessor.php.

RequestProcessor::$userIsAuthenticated [static, protected, inherited]

Definition at line 57 of file requestprocessor.php.


The documentation for this class was generated from the following file: