diff options
Diffstat (limited to 'plugins/base/imap.go')
-rw-r--r-- | plugins/base/imap.go | 25 |
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) { |