diff options
Diffstat (limited to 'worker/maildir/container.go')
-rw-r--r-- | worker/maildir/container.go | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/worker/maildir/container.go b/worker/maildir/container.go index 14815c98..1bdc4e74 100644 --- a/worker/maildir/container.go +++ b/worker/maildir/container.go @@ -15,9 +15,10 @@ import ( // A Container is a directory which contains other directories which adhere to // the Maildir spec type Container struct { - dir string - log *log.Logger - uids *uidstore.Store + dir string + log *log.Logger + uids *uidstore.Store + recentUIDS map[uint32]struct{} // used to set the recent flag } // NewContainer creates a new container at the specified directory @@ -34,7 +35,8 @@ func NewContainer(dir string, l *log.Logger) (*Container, error) { if !s.IsDir() { return nil, fmt.Errorf("Given maildir '%s' not a directory", dir) } - return &Container{dir: dir, uids: uidstore.NewStore(), log: l}, nil + return &Container{dir: dir, uids: uidstore.NewStore(), log: l, + recentUIDS: make(map[uint32]struct{})}, nil } // ListFolders returns a list of maildir folders in the container @@ -72,17 +74,26 @@ func (c *Container) ListFolders() ([]string, error) { return folders, err } +// SyncNewMail adds emails from new to cur, tracking them +func (c *Container) SyncNewMail(dir maildir.Dir) error { + keys, err := dir.Unseen() + if err != nil { + return err + } + for _, key := range keys { + uid := c.uids.GetOrInsert(key) + c.recentUIDS[uid] = struct{}{} + } + return nil +} + // OpenDirectory opens an existing maildir in the container by name, moves new // messages into cur, and registers the new keys in the UIDStore. func (c *Container) OpenDirectory(name string) (maildir.Dir, error) { dir := c.Dir(name) - keys, err := dir.Unseen() - if err != nil { + if err := c.SyncNewMail(dir); err != nil { return dir, err } - for _, key := range keys { - c.uids.GetOrInsert(key) - } return dir, nil } @@ -91,6 +102,17 @@ func (c *Container) Dir(name string) maildir.Dir { return maildir.Dir(filepath.Join(c.dir, name)) } +// IsRecent returns if a uid has the Recent flag set +func (c *Container) IsRecent(uid uint32) bool { + _, ok := c.recentUIDS[uid] + return ok +} + +// ClearRecentFlag removes the Recent flag from the message with the given uid +func (c *Container) ClearRecentFlag(uid uint32) { + delete(c.recentUIDS, uid) +} + // UIDs fetches the unique message identifiers for the maildir func (c *Container) UIDs(d maildir.Dir) ([]uint32, error) { keys, err := d.Keys() |