diff options
| -rw-r--r-- | ui/account.go | 2 | ||||
| -rw-r--r-- | worker/imap/list.go | 37 | ||||
| -rw-r--r-- | worker/imap/worker.go | 6 | ||||
| -rw-r--r-- | worker/types/messages.go | 14 | 
4 files changed, 56 insertions, 3 deletions
| diff --git a/ui/account.go b/ui/account.go index 85c4751..8b1d0c5 100644 --- a/ui/account.go +++ b/ui/account.go @@ -35,6 +35,7 @@ func NewAccountTab(conf *config.AccountConfig,  	acc.Worker.PostAction(types.Connect{}, func(msg types.WorkerMessage) {  		if _, ok := msg.(types.Ack); ok {  			acc.logger.Println("Connected.") +			acc.Worker.PostAction(types.ListDirectories{}, nil)  		} else {  			acc.logger.Println("Connection failed.")  		} @@ -73,6 +74,7 @@ func (acc *AccountTab) HandleMessage(msg types.WorkerMessage) {  	msg = acc.Worker.ProcessMessage(msg)  	switch msg.(type) {  	case types.Ack: +	case types.Unsupported:  		// no-op  	case types.ApproveCertificate:  		// TODO: Ask the user diff --git a/worker/imap/list.go b/worker/imap/list.go new file mode 100644 index 0000000..f6d3677 --- /dev/null +++ b/worker/imap/list.go @@ -0,0 +1,37 @@ +package imap + +import ( +	"github.com/emersion/go-imap" + +	"git.sr.ht/~sircmpwn/aerc2/worker/types" +) + +func (imapw *IMAPWorker) handleListDirectories(msg types.ListDirectories) { +	mailboxes := make(chan *imap.MailboxInfo) +	done := make(chan error, 1) +	imapw.worker.Logger.Println("Listing mailboxes") +	go func() { +		done <- imapw.client.List("", "*", mailboxes) +	}() +	go func() { +		for { +			select { +			case err := <-done: +				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) +				} +				return +			case mbox := <-mailboxes: +				if mbox != nil { +					imapw.worker.Logger.Printf("%v\n", mbox.Name) +				} +			} +		} +	}() +} diff --git a/worker/imap/worker.go b/worker/imap/worker.go index 9fbaf0c..d6337bc 100644 --- a/worker/imap/worker.go +++ b/worker/imap/worker.go @@ -78,6 +78,7 @@ func (w *IMAPWorker) verifyPeerCert(msg types.WorkerMessage) func(  func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error {  	switch msg := msg.(type) {  	case types.Ping: +	case types.Unsupported:  		// No-op  	case types.Configure:  		u, err := url.Parse(msg.Config.Source) @@ -145,9 +146,8 @@ func (w *IMAPWorker) handleMessage(msg types.WorkerMessage) error {  		c.Updates = w.updates  		w.client = &imapClient{c, idle.NewClient(c)} - -		// TODO: don't idle right away -		go w.client.IdleWithFallback(nil, 0) +	case types.ListDirectories: +		w.handleListDirectories(msg)  	default:  		return errUnsupported  	} diff --git a/worker/types/messages.go b/worker/types/messages.go index 5259342..00937a9 100644 --- a/worker/types/messages.go +++ b/worker/types/messages.go @@ -26,10 +26,15 @@ func (m Message) InResponseTo() WorkerMessage {  // Meta-messages +// TODO: Figure out a nice way of merging Ack and Done  type Ack struct {  	Message  } +type Done struct { +	Message +} +  type Error struct {  	Message  	Error error @@ -58,8 +63,17 @@ type Disconnect struct {  	Message  } +type ListDirectories struct { +	Message +} +  // Messages +type Directory struct { +	Message +	Name *string +} +  // Respond with an Ack to approve or Disconnect to reject  type ApproveCertificate struct {  	Message | 
