aboutsummaryrefslogtreecommitdiff
path: root/plugins/base/imap.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/base/imap.go')
-rw-r--r--plugins/base/imap.go25
1 files changed, 16 insertions, 9 deletions
diff --git a/plugins/base/imap.go b/plugins/base/imap.go
index 433a63e..3e268db 100644
--- a/plugins/base/imap.go
+++ b/plugins/base/imap.go
@@ -227,26 +227,33 @@ func listMessages(conn *imapclient.Client, mboxName string, page int) ([]IMAPMes
return msgs, nil
}
-func searchMessages(conn *imapclient.Client, mboxName, query string) ([]IMAPMessage, error) {
+func searchMessages(conn *imapclient.Client, mboxName, query string, page int) (msgs []IMAPMessage, total int, err error) {
if err := ensureMailboxSelected(conn, mboxName); err != nil {
- return nil, err
+ return nil, 0, err
}
criteria := imap.SearchCriteria{Text: []string{query}}
nums, err := conn.Search(&criteria)
if err != nil {
- return nil, fmt.Errorf("UID SEARCH failed: %v", err)
+ return nil, 0, fmt.Errorf("UID SEARCH failed: %v", err)
}
- if len(nums) == 0 {
- return nil, nil
+ total = len(nums)
+
+ from := page*messagesPerPage
+ to := from + messagesPerPage
+ if from >= len(nums) {
+ return nil, total, nil
}
+ if to > len(nums) {
+ to = len(nums)
+ }
+ nums = nums[from:to]
indexes := make(map[uint32]int)
for i, num := range nums {
indexes[num] = i
}
- // TODO: paging
var seqSet imap.SeqSet
seqSet.AddNum(nums...)
@@ -258,7 +265,7 @@ func searchMessages(conn *imapclient.Client, mboxName, query string) ([]IMAPMess
done <- conn.Fetch(&seqSet, fetch, ch)
}()
- msgs := make([]IMAPMessage, len(nums))
+ msgs = make([]IMAPMessage, len(nums))
for msg := range ch {
i, ok := indexes[msg.SeqNum]
if !ok {
@@ -268,10 +275,10 @@ func searchMessages(conn *imapclient.Client, mboxName, query string) ([]IMAPMess
}
if err := <-done; err != nil {
- return nil, fmt.Errorf("failed to fetch message list: %v", err)
+ return nil, 0, fmt.Errorf("failed to fetch message list: %v", err)
}
- return msgs, nil
+ return msgs, total, nil
}
func getMessagePart(conn *imapclient.Client, mboxName string, uid uint32, partPath []int) (*IMAPMessage, *message.Entity, error) {