Other: Poll events after each IMAP operation
This matches bridge's behaviour (except for it being a non-blocking wait). It also cleans up some unused connector methods.
This commit is contained in:
@ -79,20 +79,10 @@ func (conn *imapConnector) Authorize(username string, password []byte) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMailbox returns information about the mailbox with the given ID.
|
|
||||||
func (conn *imapConnector) GetMailbox(ctx context.Context, mailboxID imap.MailboxID) (imap.Mailbox, error) {
|
|
||||||
return safe.RLockRetErr(func() (imap.Mailbox, error) {
|
|
||||||
mailbox, ok := conn.apiLabels[string(mailboxID)]
|
|
||||||
if !ok {
|
|
||||||
return imap.Mailbox{}, fmt.Errorf("no such mailbox: %s", mailboxID)
|
|
||||||
}
|
|
||||||
|
|
||||||
return toIMAPMailbox(mailbox, conn.flags, conn.permFlags, conn.attrs), nil
|
|
||||||
}, conn.apiLabelsLock)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateMailbox creates a label with the given name.
|
// CreateMailbox creates a label with the given name.
|
||||||
func (conn *imapConnector) CreateMailbox(ctx context.Context, name []string) (imap.Mailbox, error) {
|
func (conn *imapConnector) CreateMailbox(ctx context.Context, name []string) (imap.Mailbox, error) {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
if len(name) < 2 {
|
if len(name) < 2 {
|
||||||
return imap.Mailbox{}, fmt.Errorf("invalid mailbox name %q", name)
|
return imap.Mailbox{}, fmt.Errorf("invalid mailbox name %q", name)
|
||||||
}
|
}
|
||||||
@ -162,6 +152,8 @@ func (conn *imapConnector) createFolder(ctx context.Context, name []string) (ima
|
|||||||
|
|
||||||
// UpdateMailboxName sets the name of the label with the given ID.
|
// UpdateMailboxName sets the name of the label with the given ID.
|
||||||
func (conn *imapConnector) UpdateMailboxName(ctx context.Context, labelID imap.MailboxID, name []string) error {
|
func (conn *imapConnector) UpdateMailboxName(ctx context.Context, labelID imap.MailboxID, name []string) error {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
if len(name) < 2 {
|
if len(name) < 2 {
|
||||||
return fmt.Errorf("invalid mailbox name %q", name)
|
return fmt.Errorf("invalid mailbox name %q", name)
|
||||||
}
|
}
|
||||||
@ -237,19 +229,11 @@ func (conn *imapConnector) updateFolder(ctx context.Context, labelID imap.Mailbo
|
|||||||
|
|
||||||
// DeleteMailbox deletes the label with the given ID.
|
// DeleteMailbox deletes the label with the given ID.
|
||||||
func (conn *imapConnector) DeleteMailbox(ctx context.Context, labelID imap.MailboxID) error {
|
func (conn *imapConnector) DeleteMailbox(ctx context.Context, labelID imap.MailboxID) error {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
return conn.client.DeleteLabel(ctx, string(labelID))
|
return conn.client.DeleteLabel(ctx, string(labelID))
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMessage returns the message with the given ID.
|
|
||||||
func (conn *imapConnector) GetMessage(ctx context.Context, messageID imap.MessageID) (imap.Message, []imap.MailboxID, error) {
|
|
||||||
message, err := conn.client.GetMessage(ctx, string(messageID))
|
|
||||||
if err != nil {
|
|
||||||
return imap.Message{}, nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return toIMAPMessage(message.MessageMetadata), mapTo[string, imap.MailboxID](message.LabelIDs), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateMessage creates a new message on the remote.
|
// CreateMessage creates a new message on the remote.
|
||||||
func (conn *imapConnector) CreateMessage(
|
func (conn *imapConnector) CreateMessage(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
@ -258,6 +242,8 @@ func (conn *imapConnector) CreateMessage(
|
|||||||
flags imap.FlagSet,
|
flags imap.FlagSet,
|
||||||
date time.Time,
|
date time.Time,
|
||||||
) (imap.Message, []byte, error) {
|
) (imap.Message, []byte, error) {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
// Compute the hash of the message (to match it against SMTP messages).
|
// Compute the hash of the message (to match it against SMTP messages).
|
||||||
hash, err := getMessageHash(literal)
|
hash, err := getMessageHash(literal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -308,11 +294,15 @@ func (conn *imapConnector) CreateMessage(
|
|||||||
|
|
||||||
// AddMessagesToMailbox labels the given messages with the given label ID.
|
// AddMessagesToMailbox labels the given messages with the given label ID.
|
||||||
func (conn *imapConnector) AddMessagesToMailbox(ctx context.Context, messageIDs []imap.MessageID, mailboxID imap.MailboxID) error {
|
func (conn *imapConnector) AddMessagesToMailbox(ctx context.Context, messageIDs []imap.MessageID, mailboxID imap.MailboxID) error {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
return conn.client.LabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(mailboxID))
|
return conn.client.LabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(mailboxID))
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveMessagesFromMailbox unlabels the given messages with the given label ID.
|
// RemoveMessagesFromMailbox unlabels the given messages with the given label ID.
|
||||||
func (conn *imapConnector) RemoveMessagesFromMailbox(ctx context.Context, messageIDs []imap.MessageID, mailboxID imap.MailboxID) error {
|
func (conn *imapConnector) RemoveMessagesFromMailbox(ctx context.Context, messageIDs []imap.MessageID, mailboxID imap.MailboxID) error {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
if err := conn.client.UnlabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(mailboxID)); err != nil {
|
if err := conn.client.UnlabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(mailboxID)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -345,6 +335,8 @@ func (conn *imapConnector) RemoveMessagesFromMailbox(ctx context.Context, messag
|
|||||||
|
|
||||||
// MoveMessages removes the given messages from one label and adds them to the other label.
|
// MoveMessages removes the given messages from one label and adds them to the other label.
|
||||||
func (conn *imapConnector) MoveMessages(ctx context.Context, messageIDs []imap.MessageID, labelFromID imap.MailboxID, labelToID imap.MailboxID) error {
|
func (conn *imapConnector) MoveMessages(ctx context.Context, messageIDs []imap.MessageID, labelFromID imap.MailboxID, labelToID imap.MailboxID) error {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
if err := conn.client.LabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(labelToID)); err != nil {
|
if err := conn.client.LabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), string(labelToID)); err != nil {
|
||||||
return fmt.Errorf("labeling messages: %w", err)
|
return fmt.Errorf("labeling messages: %w", err)
|
||||||
}
|
}
|
||||||
@ -358,6 +350,8 @@ func (conn *imapConnector) MoveMessages(ctx context.Context, messageIDs []imap.M
|
|||||||
|
|
||||||
// MarkMessagesSeen sets the seen value of the given messages.
|
// MarkMessagesSeen sets the seen value of the given messages.
|
||||||
func (conn *imapConnector) MarkMessagesSeen(ctx context.Context, messageIDs []imap.MessageID, seen bool) error {
|
func (conn *imapConnector) MarkMessagesSeen(ctx context.Context, messageIDs []imap.MessageID, seen bool) error {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
if seen {
|
if seen {
|
||||||
return conn.client.MarkMessagesRead(ctx, mapTo[imap.MessageID, string](messageIDs)...)
|
return conn.client.MarkMessagesRead(ctx, mapTo[imap.MessageID, string](messageIDs)...)
|
||||||
}
|
}
|
||||||
@ -367,6 +361,8 @@ func (conn *imapConnector) MarkMessagesSeen(ctx context.Context, messageIDs []im
|
|||||||
|
|
||||||
// MarkMessagesFlagged sets the flagged value of the given messages.
|
// MarkMessagesFlagged sets the flagged value of the given messages.
|
||||||
func (conn *imapConnector) MarkMessagesFlagged(ctx context.Context, messageIDs []imap.MessageID, flagged bool) error {
|
func (conn *imapConnector) MarkMessagesFlagged(ctx context.Context, messageIDs []imap.MessageID, flagged bool) error {
|
||||||
|
defer conn.goPoll()
|
||||||
|
|
||||||
if flagged {
|
if flagged {
|
||||||
return conn.client.LabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), liteapi.StarredLabel)
|
return conn.client.LabelMessages(ctx, mapTo[imap.MessageID, string](messageIDs), liteapi.StarredLabel)
|
||||||
}
|
}
|
||||||
@ -401,16 +397,16 @@ func (conn *imapConnector) SetUIDValidity(validity imap.UID) error {
|
|||||||
return conn.vault.SetUIDValidity(conn.addrID, validity)
|
return conn.vault.SetUIDValidity(conn.addrID, validity)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the connector will no longer be used and all resources should be closed/released.
|
|
||||||
func (conn *imapConnector) Close(ctx context.Context) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// IsMailboxVisible returns whether this mailbox should be visible over IMAP.
|
// IsMailboxVisible returns whether this mailbox should be visible over IMAP.
|
||||||
func (conn *imapConnector) IsMailboxVisible(_ context.Context, mailboxID imap.MailboxID) bool {
|
func (conn *imapConnector) IsMailboxVisible(_ context.Context, mailboxID imap.MailboxID) bool {
|
||||||
return atomic.LoadUint32(&conn.showAllMail) != 0 || mailboxID != liteapi.AllMailLabel
|
return atomic.LoadUint32(&conn.showAllMail) != 0 || mailboxID != liteapi.AllMailLabel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close the connector will no longer be used and all resources should be closed/released.
|
||||||
|
func (conn *imapConnector) Close(ctx context.Context) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (conn *imapConnector) importMessage(
|
func (conn *imapConnector) importMessage(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
literal []byte,
|
literal []byte,
|
||||||
|
|||||||
Reference in New Issue
Block a user