Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2016-05-10 11:44:38 +0300
committerChristoph Wurst <christoph@winzerhof-wurst.at>2016-06-16 14:19:48 +0300
commitb76a3a69dbbb1ad846ed78fcae4212129970783f (patch)
tree49774ad5192fcc2f84b60e6cdc4f3d556c8bae88 /lib
parent70345031c72b33fed5b0df0ce12f5960acf2e9cf (diff)
fetch UIDs and DATEs of all messages and do the pagination client side
Diffstat (limited to 'lib')
-rw-r--r--lib/mailbox.php39
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,