imap: update to latest go-imap

This commit is contained in:
emersion 2018-01-14 11:21:34 +01:00
parent 6a205ff043
commit 442c03bbbc
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
2 changed files with 14 additions and 17 deletions

View File

@ -14,7 +14,7 @@ var errNotYetImplemented = errors.New("not yet implemented")
type backend struct { type backend struct {
sessions *auth.Manager sessions *auth.Manager
eventsManager *events.Manager eventsManager *events.Manager
updates chan interface{} updates chan imapbackend.Update
} }
func (be *backend) Login(username, password string) (imapbackend.User, error) { func (be *backend) Login(username, password string) (imapbackend.User, error) {
@ -33,10 +33,10 @@ func (be *backend) Login(username, password string) (imapbackend.User, error) {
return newUser(be, c, u, privateKeys) return newUser(be, c, u, privateKeys)
} }
func (be *backend) Updates() <-chan interface{} { func (be *backend) Updates() <-chan imapbackend.Update {
return be.updates return be.updates
} }
func New(sessions *auth.Manager, eventsManager *events.Manager) imapbackend.Backend { func New(sessions *auth.Manager, eventsManager *events.Manager) imapbackend.Backend {
return &backend{sessions, eventsManager, make(chan interface{}, 50)} return &backend{sessions, eventsManager, make(chan imapbackend.Update, 50)}
} }

View File

@ -179,9 +179,9 @@ func (u *user) poll() {
<-u.eventSent <-u.eventSent
} }
func (u *user) receiveEvents(updates chan<- interface{}, events <-chan *protonmail.Event) { func (u *user) receiveEvents(updates chan<- imapbackend.Update, events <-chan *protonmail.Event) {
for event := range events { for event := range events {
var eventUpdates []interface{} var eventUpdates []imapbackend.Update
if event.Refresh&protonmail.EventRefreshMail != 0 { if event.Refresh&protonmail.EventRefreshMail != 0 {
log.Println("Reinitializing the whole IMAP database") log.Println("Reinitializing the whole IMAP database")
@ -216,8 +216,7 @@ func (u *user) receiveEvents(updates chan<- interface{}, events <-chan *protonma
for labelID, seqNum := range seqNums { for labelID, seqNum := range seqNums {
if mbox := u.getMailboxByLabel(labelID); mbox != nil { if mbox := u.getMailboxByLabel(labelID); mbox != nil {
update := new(imapbackend.MailboxUpdate) update := new(imapbackend.MailboxUpdate)
update.Username = u.u.Name update.Update = imapbackend.NewUpdate(u.u.Name, mbox.name)
update.Mailbox = mbox.name
update.MailboxStatus = imap.NewMailboxStatus(mbox.name, []imap.StatusItem{imap.StatusMessages}) update.MailboxStatus = imap.NewMailboxStatus(mbox.name, []imap.StatusItem{imap.StatusMessages})
update.MailboxStatus.Messages = seqNum update.MailboxStatus.Messages = seqNum
eventUpdates = append(eventUpdates, update) eventUpdates = append(eventUpdates, update)
@ -234,8 +233,7 @@ func (u *user) receiveEvents(updates chan<- interface{}, events <-chan *protonma
for labelID, seqNum := range createdSeqNums { for labelID, seqNum := range createdSeqNums {
if mbox := u.getMailboxByLabel(labelID); mbox != nil { if mbox := u.getMailboxByLabel(labelID); mbox != nil {
update := new(imapbackend.MailboxUpdate) update := new(imapbackend.MailboxUpdate)
update.Username = u.u.Name update.Update = imapbackend.NewUpdate(u.u.Name, mbox.name)
update.Mailbox = mbox.name
update.MailboxStatus = imap.NewMailboxStatus(mbox.name, []imap.StatusItem{imap.StatusMessages}) update.MailboxStatus = imap.NewMailboxStatus(mbox.name, []imap.StatusItem{imap.StatusMessages})
update.MailboxStatus.Messages = seqNum update.MailboxStatus.Messages = seqNum
eventUpdates = append(eventUpdates, update) eventUpdates = append(eventUpdates, update)
@ -244,8 +242,7 @@ func (u *user) receiveEvents(updates chan<- interface{}, events <-chan *protonma
for labelID, seqNum := range deletedSeqNums { for labelID, seqNum := range deletedSeqNums {
if mbox := u.getMailboxByLabel(labelID); mbox != nil { if mbox := u.getMailboxByLabel(labelID); mbox != nil {
update := new(imapbackend.ExpungeUpdate) update := new(imapbackend.ExpungeUpdate)
update.Username = u.u.Name update.Update = imapbackend.NewUpdate(u.u.Name, mbox.name)
update.Mailbox = mbox.name
update.SeqNum = seqNum update.SeqNum = seqNum
eventUpdates = append(eventUpdates, update) eventUpdates = append(eventUpdates, update)
} }
@ -272,8 +269,7 @@ func (u *user) receiveEvents(updates chan<- interface{}, events <-chan *protonma
} }
update := new(imapbackend.MessageUpdate) update := new(imapbackend.MessageUpdate)
update.Username = u.u.Name update.Update = imapbackend.NewUpdate(u.u.Name, mbox.name)
update.Mailbox = mbox.name
update.Message = imap.NewMessage(seqNum, []imap.FetchItem{imap.FetchFlags}) update.Message = imap.NewMessage(seqNum, []imap.FetchItem{imap.FetchFlags})
update.Message.Flags = fetchFlags(msg) update.Message.Flags = fetchFlags(msg)
eventUpdates = append(eventUpdates, update) eventUpdates = append(eventUpdates, update)
@ -290,8 +286,7 @@ func (u *user) receiveEvents(updates chan<- interface{}, events <-chan *protonma
for labelID, seqNum := range seqNums { for labelID, seqNum := range seqNums {
if mbox := u.getMailboxByLabel(labelID); mbox != nil { if mbox := u.getMailboxByLabel(labelID); mbox != nil {
update := new(imapbackend.ExpungeUpdate) update := new(imapbackend.ExpungeUpdate)
update.Username = u.u.Name update.Update = imapbackend.NewUpdate(u.u.Name, mbox.name)
update.Mailbox = mbox.name
update.SeqNum = seqNum update.SeqNum = seqNum
eventUpdates = append(eventUpdates, update) eventUpdates = append(eventUpdates, update)
} }
@ -309,12 +304,14 @@ func (u *user) receiveEvents(updates chan<- interface{}, events <-chan *protonma
u.locker.Unlock() u.locker.Unlock()
} }
done := imapbackend.WaitUpdates(eventUpdates...)
for _, update := range eventUpdates { for _, update := range eventUpdates {
updates <- update updates <- update
} }
go func() { go func() {
<-done for _, update := range eventUpdates {
<-update.Done()
}
select { select {
case u.eventSent <- struct{}{}: case u.eventSent <- struct{}{}:
default: default: