~sircmpwn/aerc

2750f99a6049322b1361b5bfa4dff3b1df2b36ab — Drew DeVault 2 years ago cf66462
Issue IMAP SELECT command
4 files changed, 53 insertions(+), 1 deletions(-)

M widgets/directories.go
A worker/imap/open.go
M worker/imap/worker.go
M worker/types/messages.go
M widgets/directories.go => widgets/directories.go +1 -0
@@ 47,6 47,7 @@ func (dirlist *DirectoryList) UpdateList(done func(dirs []string)) {

func (dirlist *DirectoryList) Select(name string) {
	dirlist.selected = name
	dirlist.worker.PostAction(&types.OpenDirectory{Directory: name}, nil)
	dirlist.Invalidate()
}


A worker/imap/open.go => worker/imap/open.go +20 -0
@@ 0,0 1,20 @@
package imap

import (
	"git.sr.ht/~sircmpwn/aerc2/worker/types"
)

func (imapw *IMAPWorker) handleOpenDirectory(msg *types.OpenDirectory) {
	imapw.worker.Logger.Printf("Opening %s", msg.Directory)
	go func() {
		_, err := imapw.client.Select(msg.Directory, false)
		if err != nil {
			imapw.worker.PostMessage(&types.Error{
				Message: types.RespondTo(msg),
				Error:   err,
			}, nil)
		} else {
			imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil)
		}
	}()
}

M worker/imap/worker.go => worker/imap/worker.go +19 -1
@@ 149,12 149,30 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error {
		w.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil)
	case *types.ListDirectories:
		w.handleListDirectories(msg)
	case *types.OpenDirectory:
		w.handleOpenDirectory(msg)
	default:
		return errUnsupported
	}
	return nil
}

func (w *IMAPWorker) handleImapUpdate(update client.Update) {
	w.worker.Logger.Printf("(= %T", update)
	switch update := update.(type) {
	case *client.MailboxUpdate:
		status := update.Mailbox
		w.worker.PostMessage(&types.DirectoryInfo{
			ReadOnly: status.ReadOnly,
			Flags:    status.Flags,

			Exists: int(status.Messages),
			Recent: int(status.Recent),
			Unseen: int(status.Unseen),
		}, nil)
	}
}

func (w *IMAPWorker) Run() {
	for {
		select {


@@ 171,7 189,7 @@ func (w *IMAPWorker) Run() {
				}, nil)
			}
		case update := <-w.updates:
			w.worker.Logger.Printf("(= %T", update)
			w.handleImapUpdate(update)
		}
	}
}

M worker/types/messages.go => worker/types/messages.go +13 -0
@@ 63,6 63,11 @@ type ListDirectories struct {
	Message
}

type OpenDirectory struct {
	Message
	Directory string
}

// Messages

type CertificateApprovalRequest struct {


@@ 75,3 80,11 @@ type Directory struct {
	Attributes []string
	Name       string
}

type DirectoryInfo struct {
	Message
	ReadOnly bool
	Flags    []string

	Exists, Recent, Unseen int
}