diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2016-05-10 11:44:38 +0300 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2016-06-16 14:19:48 +0300 |
commit | b76a3a69dbbb1ad846ed78fcae4212129970783f (patch) | |
tree | 49774ad5192fcc2f84b60e6cdc4f3d556c8bae88 /lib | |
parent | 70345031c72b33fed5b0df0ce12f5960acf2e9cf (diff) |
fetch UIDs and DATEs of all messages and do the pagination client side
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mailbox.php | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/lib/mailbox.php b/lib/mailbox.php index 7ae036982..e1216fdda 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -31,6 +31,8 @@ namespace OCA\Mail; use Horde_Imap_Client; +use Horde_Imap_Client_Exception; +use Horde_Imap_Client_Fetch_Query; use Horde_Imap_Client_Ids; use Horde_Imap_Client_Mailbox; use Horde_Imap_Client_Search_Query; @@ -88,7 +90,7 @@ class Mailbox implements IMailBox { $this->makeDisplayName(); } - public function getMessages($from = 0, $count = 2, $filter = '') { + private function getSearchIds($from, $count, $filter) { if ($filter instanceof Horde_Imap_Client_Search_Query) { $query = $filter; } else { @@ -105,11 +107,40 @@ class Mailbox implements IMailBox { if ($from >= 0 && $count >= 0) { $ids = array_slice($ids, $from, $count); } - $ids = new \Horde_Imap_Client_Ids($ids, false); + return new \Horde_Imap_Client_Ids($ids, false); + } + + private function getFetchIds($from, $count) { + $q = new Horde_Imap_Client_Fetch_Query(); + $q->uid(); + $q->imapDate(); + // FIXME: $q->headers('DATE', ['DATE']); could be a better option than the INTERNALDATE + + $result = $this->conn->fetch($this->mailBox, $q); + $uidMap = []; + foreach ($result as $r) { + $uidMap[$r->getUid()] = $r->getImapDate()->getTimeStamp(); + } + // sort by time + uasort($uidMap, function($a, $b) { + return $a < $b; + }); + if ($from >= 0 && $count >= 0) { + $uidMap = array_slice($uidMap, $from, $count, true); + } + return new \Horde_Imap_Client_Ids(array_keys($uidMap), false); + } + + public function getMessages($from = 0, $count = 2, $filter = '') { + if (is_null($filter) || $filter === '') { + $ids = $this->getFetchIds($from, $count); + } else { + $ids = $this->getSearchIds($from, $count, $filter); + } $headers = []; - $fetch_query = new \Horde_Imap_Client_Fetch_Query(); + $fetch_query = new Horde_Imap_Client_Fetch_Query(); $fetch_query->envelope(); $fetch_query->flags(); $fetch_query->size(); @@ -266,7 +297,7 @@ class Mailbox implements IMailBox { 'uidnext' => $status['uidnext'], 'delimiter' => $this->delimiter ]; - } catch (\Horde_Imap_Client_Exception $e) { + } catch (Horde_Imap_Client_Exception $e) { return [ 'id' => base64_encode($this->getFolderId()), 'parent' => null, |