about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2019-03-31 11:10:10 -0400
committerDrew DeVault <sir@cmpwn.com>2019-03-31 11:10:10 -0400
commit1f23868652a2ce0e81bddd048e3e828efaff2d69 (patch)
tree9d7fd0362d7b43df2d674ac2ad17b79e2c2196a9
parent5d0402aeea1dcc69adb46227ab1cd73b5e768880 (diff)
downloadaerc-1f23868652a2ce0e81bddd048e3e828efaff2d69.tar.gz
Pull BodyStructure up from IMAP worker
-rw-r--r--lib/msgstore.go16
-rw-r--r--worker/imap/fetch.go10
-rw-r--r--worker/types/messages.go24
3 files changed, 40 insertions, 10 deletions
diff --git a/lib/msgstore.go b/lib/msgstore.go
index 3c77c49..c6cd2c3 100644
--- a/lib/msgstore.go
+++ b/lib/msgstore.go
@@ -1,6 +1,8 @@
 package lib
 
 import (
+	"time"
+
 	"github.com/emersion/go-imap"
 	"github.com/mohamedattahri/mail"
 
@@ -91,10 +93,22 @@ func (store *MessageStore) FetchBodies(uids []uint32,
 func (store *MessageStore) merge(
 	to *types.MessageInfo, from *types.MessageInfo) {
 
-	// TODO: Merge more shit
+	if from.BodyStructure != nil {
+		to.BodyStructure = from.BodyStructure
+	}
 	if from.Envelope != nil {
 		to.Envelope = from.Envelope
 	}
+	if len(from.Flags) != 0 {
+		to.Flags = from.Flags
+	}
+	if from.Size != 0 {
+		to.Size = from.Size
+	}
+	var zero time.Time
+	if from.InternalDate != zero {
+		to.InternalDate = from.InternalDate
+	}
 }
 
 func (store *MessageStore) Update(msg types.WorkerMessage) {
diff --git a/worker/imap/fetch.go b/worker/imap/fetch.go
index 884ab73..d229126 100644
--- a/worker/imap/fetch.go
+++ b/worker/imap/fetch.go
@@ -12,6 +12,7 @@ func (imapw *IMAPWorker) handleFetchMessageHeaders(
 
 	imapw.worker.Logger.Printf("Fetching message headers")
 	items := []imap.FetchItem{
+		imap.FetchBodyStructure,
 		imap.FetchEnvelope,
 		imap.FetchInternalDate,
 		imap.FetchFlags,
@@ -57,10 +58,11 @@ func (imapw *IMAPWorker) handleFetchMessages(
 					}, nil)
 				} else {
 					imapw.worker.PostMessage(&types.MessageInfo{
-						Envelope:     _msg.Envelope,
-						Flags:        _msg.Flags,
-						InternalDate: _msg.InternalDate,
-						Uid:          _msg.Uid,
+						BodyStructure: _msg.BodyStructure,
+						Envelope:      _msg.Envelope,
+						Flags:         _msg.Flags,
+						InternalDate:  _msg.InternalDate,
+						Uid:           _msg.Uid,
 					}, nil)
 				}
 			}
diff --git a/worker/types/messages.go b/worker/types/messages.go
index f38bb22..b1d1485 100644
--- a/worker/types/messages.go
+++ b/worker/types/messages.go
@@ -2,6 +2,7 @@ package types
 
 import (
 	"crypto/x509"
+	"io"
 	"time"
 
 	"github.com/emersion/go-imap"
@@ -86,6 +87,12 @@ type FetchMessageBodies struct {
 	Uids imap.SeqSet
 }
 
+type FetchMessageBodyPart struct {
+	Message
+	Uid  uint32
+	Part int
+}
+
 type DeleteMessages struct {
 	Message
 	Uids imap.SeqSet
@@ -120,11 +127,12 @@ type DirectoryContents struct {
 
 type MessageInfo struct {
 	Message
-	Envelope     *imap.Envelope
-	Flags        []string
-	InternalDate time.Time
-	Size         uint32
-	Uid          uint32
+	BodyStructure *imap.BodyStructure
+	Envelope      *imap.Envelope
+	Flags         []string
+	InternalDate  time.Time
+	Size          uint32
+	Uid           uint32
 }
 
 type MessageBody struct {
@@ -133,6 +141,12 @@ type MessageBody struct {
 	Uid  uint32
 }
 
+type MessageBodyPart struct {
+	Message
+	Reader *io.Reader
+	Uid    uint32
+}
+
 type MessagesDeleted struct {
 	Message
 	Uids []uint32