protected function _doQuery(array $query)
{
$imap_query = new Horde_Imap_Client_Search_Query();
$imap_query->charset('UTF-8', false);
$mboxes = array();
$results = array();
foreach ($query as $q) {
switch ($q['op']) {
case Horde_ActiveSync_Request_Search::SEARCH_AND:
return $this->_doQuery(array($q['value']), $range);
default:
foreach ($q as $key => $value) {
switch ($key) {
case 'FolderType':
if ($value != Horde_ActiveSync::CLASS_EMAIL) {
throw new Horde_ActiveSync_Exception('Only Email folders are supported.');
}
break;
case 'serverid':
$mboxes[] = new Horde_Imap_Client_Mailbox($value);
break;
case Horde_ActiveSync_Message_Mail::POOMMAIL_DATERECEIVED:
if ($q['op'] == Horde_ActiveSync_Request_Search::SEARCH_GREATERTHAN) {
$query_range = Horde_Imap_Client_Search_Query::DATE_SINCE;
} elseif ($q['op'] == Horde_ActiveSync_Request_Search::SEARCH_LESSTHAN) {
$query_range = Horde_Imap_Client_Search_Query::DATE_BEFORE;
} else {
$query_range = Horde_Imap_Client_Search_Query::DATE_ON;
}
$imap_query->dateSearch($value, $query_range);
break;
case Horde_ActiveSync_Request_Search::SEARCH_FREETEXT:
$imap_query->text($value, false);
break;
case 'subquery':
$imap_query->andSearch(array($this->_buildSubQuery($value)));
}
}
}
}
if (empty($mboxes)) {
foreach ($this->getMailboxes() as $mailbox) {
$mboxes[] = $mailbox['ob'];
}
}
foreach ($mboxes as $mbox) {
try {
$search_res = $this->_getImapOb()->search($mbox, $imap_query, array('results' => array(Horde_Imap_Client::SEARCH_RESULTS_MATCH, Horde_Imap_Client::SEARCH_RESULTS_SAVE, Horde_Imap_Client::SEARCH_RESULTS_COUNT), 'sort' => array(Horde_Imap_Client::SORT_REVERSE, Horde_Imap_Client::SORT_ARRIVAL)));
} catch (Horde_Imap_Client_Exception $e) {
throw new Horde_ActiveSync_Exception($e);
}
if ($search_res['count'] == 0) {
continue;
}
$ids = $search_res['match']->ids;
foreach ($ids as $id) {
$results[] = array('uniqueid' => $mbox->utf8 . ':' . $id, 'searchfolderid' => $mbox->utf8);
}
if (!empty($range)) {
preg_match('/(.*)\\-(.*)/', $range, $matches);
$return_count = $matches[2] - $matches[1];
$results = array_slice($results, $matches[1], $return_count + 1, true);
}
}
return $results;
}