70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package imapclient
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/emersion/go-imap/v2"
|
|
)
|
|
|
|
// Enable sends an ENABLE command.
|
|
//
|
|
// This command requires support for IMAP4rev2 or the ENABLE extension.
|
|
func (c *Client) Enable(caps ...imap.Cap) *EnableCommand {
|
|
// Enabling an extension may change the IMAP syntax, so only allow the
|
|
// extensions we support here
|
|
for _, name := range caps {
|
|
switch name {
|
|
case imap.CapIMAP4rev2, imap.CapUTF8Accept, imap.CapMetadata, imap.CapMetadataServer:
|
|
// ok
|
|
default:
|
|
done := make(chan error)
|
|
close(done)
|
|
err := fmt.Errorf("imapclient: cannot enable %q: not supported", name)
|
|
return &EnableCommand{commandBase: commandBase{done: done, err: err}}
|
|
}
|
|
}
|
|
|
|
cmd := &EnableCommand{}
|
|
enc := c.beginCommand("ENABLE", cmd)
|
|
for _, c := range caps {
|
|
enc.SP().Atom(string(c))
|
|
}
|
|
enc.end()
|
|
return cmd
|
|
}
|
|
|
|
func (c *Client) handleEnabled() error {
|
|
caps, err := readCapabilities(c.dec)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.mutex.Lock()
|
|
for name := range caps {
|
|
c.enabled[name] = struct{}{}
|
|
}
|
|
c.mutex.Unlock()
|
|
|
|
if cmd := findPendingCmdByType[*EnableCommand](c); cmd != nil {
|
|
cmd.data.Caps = caps
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// EnableCommand is an ENABLE command.
|
|
type EnableCommand struct {
|
|
commandBase
|
|
data EnableData
|
|
}
|
|
|
|
func (cmd *EnableCommand) Wait() (*EnableData, error) {
|
|
return &cmd.data, cmd.wait()
|
|
}
|
|
|
|
// EnableData is the data returned by the ENABLE command.
|
|
type EnableData struct {
|
|
// Capabilities that were successfully enabled
|
|
Caps imap.CapSet
|
|
}
|