From 1ace50a6b927fde7ef3205001a7acd91e04ac2d7 Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Wed, 19 Jan 2022 13:18:09 +0100 Subject: [PATCH] imap: emits connection error on logout implements a new connection error message. This allows the worker to emit a connection-related error message to the ui when the imap client closes the loggedOut channel. Signed-off-by: Koni Marti --- widgets/account.go | 3 +++ worker/imap/worker.go | 29 +++++++++++++++++++++++++++++ worker/types/messages.go | 5 +++++ 3 files changed, 37 insertions(+) diff --git a/widgets/account.go b/widgets/account.go index cf5f1ec..beedabc 100644 --- a/widgets/account.go +++ b/widgets/account.go @@ -288,6 +288,9 @@ func (acct *AccountView) onMessage(msg types.WorkerMessage) { } case *types.LabelList: acct.labels = msg.Labels + case *types.ConnError: + acct.logger.Printf("Connection error = %v", msg.Error) + acct.aerc.PushError(fmt.Sprintf("%v", msg.Error)) case *types.Error: acct.logger.Printf("%v", msg.Error) acct.aerc.PushError(fmt.Sprintf("%v", msg.Error)) diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 81d954f..6ad7ed2 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -56,6 +56,7 @@ type IMAPWorker struct { worker *types.Worker // Map of sequence numbers to UIDs, index 0 is seq number 1 seqMap []uint32 + done chan struct{} } func NewIMAPWorker(worker *types.Worker) (types.Backend, error) { @@ -178,14 +179,22 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error { break } + w.stopConnectionObserver() + c.Updates = w.updates w.client = &imapClient{c, sortthread.NewThreadClient(c), sortthread.NewSortClient(c)} + + w.startConnectionObserver() + w.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) case *types.Disconnect: if w.client == nil || w.client.State() != imap.SelectedState { reterr = fmt.Errorf("Not connected") break } + + w.stopConnectionObserver() + if err := w.client.Logout(); err != nil { reterr = err break @@ -271,6 +280,26 @@ func (w *IMAPWorker) handleImapUpdate(update client.Update) { } } +func (w *IMAPWorker) startConnectionObserver() { + go func() { + select { + case <-w.client.LoggedOut(): + w.worker.PostMessage(&types.ConnError{ + Error: fmt.Errorf("Logged Out"), + }, nil) + case <-w.done: + return + } + }() +} + +func (w *IMAPWorker) stopConnectionObserver() { + if w.done != nil { + close(w.done) + } + w.done = make(chan struct{}) +} + func (w *IMAPWorker) connect() (*client.Client, error) { var ( conn *net.TCPConn diff --git a/worker/types/messages.go b/worker/types/messages.go index fb701bd..a5eae8d 100644 --- a/worker/types/messages.go +++ b/worker/types/messages.go @@ -48,6 +48,11 @@ type Error struct { Error error } +type ConnError struct { + Message + Error error +} + type Unsupported struct { Message }