From 1ace50a6b927fde7ef3205001a7acd91e04ac2d7 Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Wed, 19 Jan 2022 13:18:09 +0100 Subject: 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 --- worker/imap/worker.go | 29 +++++++++++++++++++++++++++++ worker/types/messages.go | 5 +++++ 2 files changed, 34 insertions(+) (limited to 'worker') 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 } -- cgit v1.2.3