-
Notifications
You must be signed in to change notification settings - Fork 317
/
Copy pathnamespace.go
54 lines (46 loc) · 1.05 KB
/
namespace.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package imapserver
import (
"github.com/emersion/go-imap/v2"
"github.com/emersion/go-imap/v2/internal/imapwire"
)
func (c *Conn) handleNamespace(dec *imapwire.Decoder) error {
if !dec.ExpectCRLF() {
return dec.Err()
}
if err := c.checkState(imap.ConnStateAuthenticated); err != nil {
return err
}
session, ok := c.session.(SessionNamespace)
if !ok {
return newClientBugError("NAMESPACE is not supported")
}
data, err := session.Namespace()
if err != nil {
return err
}
enc := newResponseEncoder(c)
defer enc.end()
enc.Atom("*").SP().Atom("NAMESPACE").SP()
writeNamespace(enc.Encoder, data.Personal)
enc.SP()
writeNamespace(enc.Encoder, data.Other)
enc.SP()
writeNamespace(enc.Encoder, data.Shared)
return enc.CRLF()
}
func writeNamespace(enc *imapwire.Encoder, l []imap.NamespaceDescriptor) {
if l == nil {
enc.NIL()
return
}
enc.List(len(l), func(i int) {
descr := l[i]
enc.Special('(').String(descr.Prefix).SP()
if descr.Delim == 0 {
enc.NIL()
} else {
enc.Quoted(string(descr.Delim))
}
enc.Special(')')
})
}