/**
* Receive, and parse, the incoming wbxml query.
*
* According to MS docs, OR is supported in the protocol, but will ALWAYS
* return a searchToComplex status in Exchange 2007. Additionally, AND is
* ONLY supported as the topmost element. No nested AND is allowed. All
* such queries will return a searchToComplex status.
*
* @param boolean $subquery Parsing a subquery.
*
* @return array
*/
protected function _parseQuery($subquery = null)
{
$query = array();
while (($type = $this->_decoder->getElementStartTag(self::SEARCH_AND) ? self::SEARCH_AND : ($this->_decoder->getElementStartTag(self::SEARCH_OR) ? self::SEARCH_OR : ($this->_decoder->getElementStartTag(self::SEARCH_EQUALTO) ? self::SEARCH_EQUALTO : ($this->_decoder->getElementStartTag(self::SEARCH_LESSTHAN) ? self::SEARCH_LESSTHAN : ($this->_decoder->getElementStartTag(self::SEARCH_GREATERTHAN) ? self::SEARCH_GREATERTHAN : ($this->_decoder->getElementStartTag(self::SEARCH_FREETEXT) ? self::SEARCH_FREETEXT : ($this->_decoder->getElementStartTag(Horde_ActiveSync::SYNC_FOLDERID) ? Horde_ActiveSync::SYNC_FOLDERID : ($this->_decoder->getElementStartTag(Horde_ActiveSync::SYNC_FOLDERTYPE) ? Horde_ActiveSync::SYNC_FOLDERTYPE : ($this->_decoder->getElementStartTag(Horde_ActiveSync::SYNC_DOCUMENTLIBRARY_LINKID) ? Horde_ActiveSync::SYNC_DOCUMENTLIBRARY_LINKID : ($this->_decoder->getElementStartTag(Horde_ActiveSync_Message_Mail::POOMMAIL_DATERECEIVED) ? Horde_ActiveSync_Message_Mail::POOMMAIL_DATERECEIVED : -1)))))))))) != -1) {
switch ($type) {
case self::SEARCH_AND:
case self::SEARCH_OR:
case self::SEARCH_EQUALTO:
case self::SEARCH_LESSTHAN:
case self::SEARCH_GREATERTHAN:
$q = array('op' => $type, 'value' => $this->_parseQuery(true));
if ($subquery) {
$query['subquery'][] = $q;
} else {
$query[] = $q;
}
$this->_decoder->getElementEndTag();
break;
default:
if ($query[$type] = $this->_decoder->getElementContent()) {
if ($type == Horde_ActiveSync::SYNC_FOLDERID) {
$query['serverid'] = $this->_collections->getBackendIdForFolderUid($query[$type]);
}
$this->_decoder->getElementEndTag();
} else {
$this->_decoder->getElementStartTag(self::SEARCH_VALUE);
$query[$type] = $this->_decoder->getElementContent();
switch ($type) {
case Horde_ActiveSync_Message_Mail::POOMMAIL_DATERECEIVED:
$query[$type] = new Horde_Date($query[$type]);
break;
}
$this->_decoder->getElementEndTag();
}
break;
}
}
return $query;
}