diff options
Diffstat (limited to 'worker/imap')
-rw-r--r-- | worker/imap/cache.go | 12 | ||||
-rw-r--r-- | worker/imap/extensions/xgmext/client.go | 21 | ||||
-rw-r--r-- | worker/imap/fetch.go | 22 | ||||
-rw-r--r-- | worker/imap/flags.go | 6 | ||||
-rw-r--r-- | worker/imap/imap.go | 8 | ||||
-rw-r--r-- | worker/imap/list.go | 2 | ||||
-rw-r--r-- | worker/imap/open.go | 8 | ||||
-rw-r--r-- | worker/imap/worker.go | 4 |
8 files changed, 46 insertions, 37 deletions
diff --git a/worker/imap/cache.go b/worker/imap/cache.go index 8ae60f03..0eba7b9d 100644 --- a/worker/imap/cache.go +++ b/worker/imap/cache.go @@ -24,7 +24,7 @@ type CachedHeader struct { BodyStructure models.BodyStructure Envelope models.Envelope InternalDate time.Time - Uid uint32 + Uid models.UID Size uint32 Header []byte Created time.Time @@ -34,7 +34,7 @@ var ( // cacheTag should be updated when changing the cache // structure; this will ensure that the user's cache is cleared and // reloaded when the underlying cache structure changes - cacheTag = []byte("0002") + cacheTag = []byte("0003") cacheTagKey = []byte("cache.tag") ) @@ -112,9 +112,9 @@ func (w *IMAPWorker) cacheHeader(mi *models.MessageInfo) { } } -func (w *IMAPWorker) getCachedHeaders(msg *types.FetchMessageHeaders) []uint32 { +func (w *IMAPWorker) getCachedHeaders(msg *types.FetchMessageHeaders) []models.UID { w.worker.Tracef("Retrieving headers from cache: %v", msg.Uids) - var need []uint32 + var need []models.UID for _, uid := range msg.Uids { key := w.headerKey(uid) data, err := w.cache.Get(key, nil) @@ -157,8 +157,8 @@ func (w *IMAPWorker) getCachedHeaders(msg *types.FetchMessageHeaders) []uint32 { return need } -func (w *IMAPWorker) headerKey(uid uint32) []byte { - key := fmt.Sprintf("header.%s.%d.%d", +func (w *IMAPWorker) headerKey(uid models.UID) []byte { + key := fmt.Sprintf("header.%s.%d.%s", w.selected.Name, w.selected.UidValidity, uid) return []byte(key) } diff --git a/worker/imap/extensions/xgmext/client.go b/worker/imap/extensions/xgmext/client.go index 65f11e74..e6e34a44 100644 --- a/worker/imap/extensions/xgmext/client.go +++ b/worker/imap/extensions/xgmext/client.go @@ -5,6 +5,7 @@ import ( "fmt" "git.sr.ht/~rjarry/aerc/lib/log" + "git.sr.ht/~rjarry/aerc/models" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" "github.com/emersion/go-imap/commands" @@ -19,7 +20,7 @@ func NewHandler(c *client.Client) *handler { return &handler{client: c} } -func (h handler) FetchEntireThreads(requested []uint32) ([]uint32, error) { +func (h handler) FetchEntireThreads(requested []models.UID) ([]models.UID, error) { threadIds, err := h.fetchThreadIds(requested) if err != nil { return nil, @@ -33,7 +34,7 @@ func (h handler) FetchEntireThreads(requested []uint32) ([]uint32, error) { return uids, nil } -func (h handler) fetchThreadIds(uids []uint32) ([]string, error) { +func (h handler) fetchThreadIds(uids []models.UID) ([]string, error) { messages := make(chan *imap.Message) done := make(chan error) @@ -58,7 +59,9 @@ func (h handler) fetchThreadIds(uids []uint32) ([]string, error) { }() var set imap.SeqSet - set.AddNum(uids...) + for _, uid := range uids { + set.AddNum(models.UidToUint32(uid)) + } err := h.client.UidFetch(&set, items, messages) <-done @@ -69,18 +72,18 @@ func (h handler) fetchThreadIds(uids []uint32) ([]string, error) { return thrid, err } -func (h handler) searchUids(thrid []string) ([]uint32, error) { +func (h handler) searchUids(thrid []string) ([]models.UID, error) { if len(thrid) == 0 { return nil, errors.New("no thread IDs provided") } return h.runSearch(NewThreadIDSearch(thrid)) } -func (h handler) RawSearch(rawSearch string) ([]uint32, error) { +func (h handler) RawSearch(rawSearch string) ([]models.UID, error) { return h.runSearch(NewRawSearch(rawSearch)) } -func (h handler) runSearch(cmd imap.Commander) ([]uint32, error) { +func (h handler) runSearch(cmd imap.Commander) ([]models.UID, error) { if h.client.State() != imap.SelectedState { return nil, errors.New("no mailbox selected") } @@ -90,5 +93,9 @@ func (h handler) runSearch(cmd imap.Commander) ([]uint32, error) { if err != nil { return nil, fmt.Errorf("imap execute failed: %w", err) } - return res.Ids, status.Err() + var uids []models.UID + for _, i := range res.Ids { + uids = append(uids, models.Uint32ToUid(i)) + } + return uids, status.Err() } diff --git a/worker/imap/fetch.go b/worker/imap/fetch.go index 202038fe..9b77c777 100644 --- a/worker/imap/fetch.go +++ b/worker/imap/fetch.go @@ -82,7 +82,7 @@ func (imapw *IMAPWorker) handleFetchMessageHeaders( RFC822Headers: header, Refs: parse.MsgIDList(header, "references"), Size: _msg.Size, - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), } imapw.worker.PostMessage(&types.MessageInfo{ Message: types.RespondTo(msg), @@ -126,7 +126,7 @@ func (imapw *IMAPWorker) handleFetchMessageBodyPart( partHeaderSection.FetchItem(), partBodySection.FetchItem(), } - imapw.handleFetchMessages(msg, []uint32{msg.Uid}, items, + imapw.handleFetchMessages(msg, []models.UID{msg.Uid}, items, func(_msg *imap.Message) error { if len(_msg.Body) == 0 { // ignore duplicate messages with only flag updates @@ -154,7 +154,7 @@ func (imapw *IMAPWorker) handleFetchMessageBodyPart( Message: types.RespondTo(msg), Part: &models.MessageBodyPart{ Reader: part.Body, - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), }, }, nil) // Update flags (to mark message as read) @@ -162,7 +162,7 @@ func (imapw *IMAPWorker) handleFetchMessageBodyPart( Message: types.RespondTo(msg), Info: &models.MessageInfo{ Flags: translateImapFlags(_msg.Flags), - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), }, }, nil) return nil @@ -196,7 +196,7 @@ func (imapw *IMAPWorker) handleFetchFullMessages( Message: types.RespondTo(msg), Content: &models.FullMessage{ Reader: bufio.NewReader(r), - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), }, }, nil) // Update flags (to mark message as read) @@ -204,7 +204,7 @@ func (imapw *IMAPWorker) handleFetchFullMessages( Message: types.RespondTo(msg), Info: &models.MessageInfo{ Flags: translateImapFlags(_msg.Flags), - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), }, }, nil) return nil @@ -228,7 +228,7 @@ func (imapw *IMAPWorker) handleFetchMessageFlags(msg *types.FetchMessageFlags) { Message: types.RespondTo(msg), Info: &models.MessageInfo{ Flags: translateImapFlags(_msg.Flags), - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), }, }, nil) return nil @@ -236,13 +236,13 @@ func (imapw *IMAPWorker) handleFetchMessageFlags(msg *types.FetchMessageFlags) { } func (imapw *IMAPWorker) handleFetchMessages( - msg types.WorkerMessage, uids []uint32, items []imap.FetchItem, + msg types.WorkerMessage, uids []models.UID, items []imap.FetchItem, procFunc func(*imap.Message) error, ) { messages := make(chan *imap.Message) done := make(chan struct{}) - missingUids := make(map[uint32]bool) + missingUids := make(map[models.UID]bool) for _, uid := range uids { missingUids[uid] = true } @@ -251,14 +251,14 @@ func (imapw *IMAPWorker) handleFetchMessages( defer log.PanicHandler() for _msg := range messages { - delete(missingUids, _msg.Uid) + delete(missingUids, models.Uint32ToUid(_msg.Uid)) err := procFunc(_msg) if err != nil { log.Errorf("failed to process message <%d>: %v", _msg.Uid, err) imapw.worker.PostMessage(&types.MessageInfo{ Message: types.RespondTo(msg), Info: &models.MessageInfo{ - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), Error: err, }, }, nil) diff --git a/worker/imap/flags.go b/worker/imap/flags.go index 60137bd3..31d3bea3 100644 --- a/worker/imap/flags.go +++ b/worker/imap/flags.go @@ -81,7 +81,7 @@ func (imapw *IMAPWorker) handleAnsweredMessages(msg *types.AnsweredMessages) { Message: types.RespondTo(msg), Info: &models.MessageInfo{ Flags: translateImapFlags(_msg.Flags), - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), }, }, nil) return nil @@ -100,7 +100,7 @@ func (imapw *IMAPWorker) handleFlagMessages(msg *types.FlagMessages) { Message: types.RespondTo(msg), Info: &models.MessageInfo{ Flags: translateImapFlags(_msg.Flags), - Uid: _msg.Uid, + Uid: models.Uint32ToUid(_msg.Uid), }, }, nil) return nil @@ -108,7 +108,7 @@ func (imapw *IMAPWorker) handleFlagMessages(msg *types.FlagMessages) { } func (imapw *IMAPWorker) handleStoreOps( - msg types.WorkerMessage, uids []uint32, item imap.StoreItem, flag interface{}, + msg types.WorkerMessage, uids []models.UID, item imap.StoreItem, flag interface{}, procFunc func(*imap.Message) error, ) { messages := make(chan *imap.Message) diff --git a/worker/imap/imap.go b/worker/imap/imap.go index fbdcb2b9..67d56264 100644 --- a/worker/imap/imap.go +++ b/worker/imap/imap.go @@ -14,12 +14,12 @@ func init() { imap.CharsetReader = charset.Reader } -func toSeqSet(uids []uint32) *imap.SeqSet { - var set imap.SeqSet +func toSeqSet(uids []models.UID) *imap.SeqSet { + set := new(imap.SeqSet) for _, uid := range uids { - set.AddNum(uid) + set.AddNum(models.UidToUint32(uid)) } - return &set + return set } func translateBodyStructure(bs *imap.BodyStructure) *models.BodyStructure { diff --git a/worker/imap/list.go b/worker/imap/list.go index d12ae4bd..e3c9db3e 100644 --- a/worker/imap/list.go +++ b/worker/imap/list.go @@ -139,6 +139,6 @@ func (imapw *IMAPWorker) handleSearchDirectory(msg *types.SearchDirectory) { imapw.worker.PostMessage(&types.SearchResults{ Message: types.RespondTo(msg), - Uids: uids, + Uids: models.Uint32ToUidList(uids), }, nil) } diff --git a/worker/imap/open.go b/worker/imap/open.go index 355709a7..b1314a4b 100644 --- a/worker/imap/open.go +++ b/worker/imap/open.go @@ -5,6 +5,7 @@ import ( sortthread "github.com/emersion/go-imap-sortthread" + "git.sr.ht/~rjarry/aerc/models" "git.sr.ht/~rjarry/aerc/worker/types" ) @@ -85,9 +86,10 @@ func (imapw *IMAPWorker) handleFetchDirectoryContents( // Only initialize if we are not filtering imapw.seqMap.Initialize(uids) } + imapw.worker.PostMessage(&types.DirectoryContents{ Message: types.RespondTo(msg), - Uids: uids, + Uids: models.Uint32ToUidList(uids), }, nil) imapw.worker.PostMessage(&types.Done{Message: types.RespondTo(msg)}, nil) } @@ -146,7 +148,7 @@ func (imapw *IMAPWorker) handleDirectoryThreaded( var uids []uint32 for i := len(aercThreads) - 1; i >= 0; i-- { aercThreads[i].Walk(func(t *types.Thread, level int, currentErr error) error { //nolint:errcheck // error indicates skipped threads - uids = append(uids, t.Uid) + uids = append(uids, models.UidToUint32(t.Uid)) return nil }) } @@ -175,7 +177,7 @@ func convertThreads(threads []*sortthread.Thread, parent *types.Thread) ([]*type for i := 0; i < len(threads); i++ { t := threads[i] conv[i] = &types.Thread{ - Uid: t.Id, + Uid: models.Uint32ToUid(t.Id), } // Set the first child node diff --git a/worker/imap/worker.go b/worker/imap/worker.go index edb68ec4..28eb907c 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -289,7 +289,7 @@ func (w *IMAPWorker) handleImapUpdate(update client.Update) { Envelope: translateEnvelope(msg.Envelope), Flags: translateImapFlags(msg.Flags), InternalDate: msg.InternalDate, - Uid: msg.Uid, + Uid: models.Uint32ToUid(msg.Uid), }, }, nil) case *client.ExpungeUpdate: @@ -297,7 +297,7 @@ func (w *IMAPWorker) handleImapUpdate(update client.Update) { w.worker.Errorf("ExpungeUpdate unknown seqnum: %d", update.SeqNum) } else { w.worker.PostMessage(&types.MessagesDeleted{ - Uids: []uint32{uid}, + Uids: []models.UID{models.Uint32ToUid(uid)}, }, nil) } } |