diff --git a/models/models.go b/models/models.go index 96683f2..e7325d2 100644 --- a/models/models.go +++ b/models/models.go @@ -51,6 +51,15 @@ type DirectoryInfo struct { // set to true if the value counts are accurate AccurateCounts bool + + // Caps contains the backend capabilities + Caps *Capabilities +} + +// Capabilities provides the backend capabilities +type Capabilities struct { + Sort bool + Thread bool } // A MessageInfo holds information about the structure of a message diff --git a/worker/imap/checkmail.go b/worker/imap/checkmail.go index d9dcfd3..57af3af 100644 --- a/worker/imap/checkmail.go +++ b/worker/imap/checkmail.go @@ -31,6 +31,7 @@ func (w *IMAPWorker) handleCheckMailMessage(msg *types.CheckMail) { Exists: int(status.Messages), Recent: int(status.Recent), Unseen: int(status.Unseen), + Caps: w.caps, }, SkipSort: true, }, nil) diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 7debd88..3ed646d 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -66,6 +66,8 @@ type IMAPWorker struct { idler *idler observer *observer cache *leveldb.DB + + caps *models.Capabilities } func NewIMAPWorker(worker *types.Worker) (types.Backend, error) { @@ -75,6 +77,7 @@ func NewIMAPWorker(worker *types.Worker) (types.Backend, error) { selected: &imap.MailboxStatus{}, idler: newIdler(imapConfig{}, worker), observer: newObserver(imapConfig{}, worker), + caps: &models.Capabilities{}, }, nil } @@ -83,6 +86,16 @@ func (w *IMAPWorker) newClient(c *client.Client) { w.client = &imapClient{c, sortthread.NewThreadClient(c), sortthread.NewSortClient(c)} w.idler.SetClient(w.client) w.observer.SetClient(w.client) + sort, err := w.client.sort.SupportSort() + if err == nil && sort { + w.caps.Sort = true + w.worker.Logger.Println("Server Capability found: Sort") + } + thread, err := w.client.thread.SupportThread() + if err == nil && thread { + w.caps.Thread = true + w.worker.Logger.Println("Server Capability found: Thread") + } } func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { @@ -226,6 +239,7 @@ func (w *IMAPWorker) handleImapUpdate(update client.Update) { Exists: int(status.Messages), Recent: int(status.Recent), Unseen: int(status.Unseen), + Caps: w.caps, }, }, nil) case *client.MessageUpdate: diff --git a/worker/maildir/worker.go b/worker/maildir/worker.go index cf2970e..0862838 100644 --- a/worker/maildir/worker.go +++ b/worker/maildir/worker.go @@ -186,6 +186,11 @@ func (w *Worker) getDirectoryInfo(name string) *models.DirectoryInfo { Unseen: 0, AccurateCounts: false, + + Caps: &models.Capabilities{ + Sort: true, + Thread: false, + }, } dir := w.c.Dir(name) diff --git a/worker/notmuch/worker.go b/worker/notmuch/worker.go index 51e8298..35e6840 100644 --- a/worker/notmuch/worker.go +++ b/worker/notmuch/worker.go @@ -228,6 +228,11 @@ func (w *worker) gatherDirectoryInfo(name string, query string) ( // total unread Unseen: count.Unread, AccurateCounts: true, + + Caps: &models.Capabilities{ + Sort: true, + Thread: true, + }, }, } return info, nil