diff --git a/go.mod b/go.mod index cedfc5e..ecd805e 100644 --- a/go.mod +++ b/go.mod @@ -20,12 +20,3 @@ require ( github.com/philhofer/fwd v1.1.2 // indirect golang.org/x/sys v0.8.0 // indirect ) - -retract ( - [v0.0.1, v0.0.11] - v1.0.0 - [v2.0.1, v2.0.2] - [v3.0.0, v3.2.1] - v4.0.0 - [v5.0.0, v5.0.4] -) \ No newline at end of file diff --git a/pkg/attachment.go b/pkg/attachment.go index e3d37c3..15fc6e9 100644 --- a/pkg/attachment.go +++ b/pkg/attachment.go @@ -17,7 +17,7 @@ package pst import ( - "github.com/mooijtech/go-pst/pkg/properties" + "github.com/mooijtech/go-pst/v6/pkg/properties" "io" "github.com/rotisserie/eris" @@ -25,6 +25,7 @@ import ( // Attachment represents a message attachment. type Attachment struct { + Identifier Identifier PropertyContext *PropertyContext LocalDescriptors []LocalDescriptor properties.Attachment @@ -163,6 +164,7 @@ func (message *Message) GetAttachment(attachmentIndex int) (*Attachment, error) } attachment := &Attachment{ + Identifier: attachmentLocalDescriptor.Identifier, PropertyContext: attachmentPropertyContext, LocalDescriptors: attachmentLocalDescriptors, } @@ -174,6 +176,48 @@ func (message *Message) GetAttachment(attachmentIndex int) (*Attachment, error) return attachment, nil } +// GetAttachment returns the attachment. +// Note that the properties aren't populated (call PropertyContext.Populate). +func (file *File) GetAttachment(messageIdentifier Identifier) (*Attachment, error) { + attachmentsNode, err := file.GetNodeBTreeNode(messageIdentifier) + + if err != nil { + return nil, eris.Wrap(err, "failed to find node b-tree node") + } + + attachmentsDataNode, err := file.GetBlockBTreeNode(attachmentsNode.DataIdentifier) + + if err != nil { + return nil, eris.Wrap(err, "failed to find block b-tree node") + } + + attachmentsHeapOnNode, err := file.GetHeapOnNode(attachmentsDataNode) + + if err != nil { + return nil, eris.Wrap(err, "failed to get Heap-on-Node") + } + + localDescriptors, err := file.GetLocalDescriptors(attachmentsNode) + + if err != nil { + return nil, eris.Wrap(err, "failed to find local descriptors") + } + + propertyContext, err := file.GetPropertyContext(attachmentsHeapOnNode) + + attachment := &Attachment{ + Identifier: messageIdentifier, + PropertyContext: propertyContext, + LocalDescriptors: localDescriptors, + } + + if err := propertyContext.Populate(attachment, localDescriptors); err != nil { + return nil, eris.Wrap(err, "failed to populate attachment property context") + } + + return attachment, nil +} + // GetAllAttachments returns the attachments of this message. // See AttachmentIterator. func (message *Message) GetAllAttachments() ([]*Attachment, error) { diff --git a/pkg/message.go b/pkg/message.go index 959a599..9099e9f 100644 --- a/pkg/message.go +++ b/pkg/message.go @@ -19,7 +19,7 @@ package pst import ( _ "embed" "fmt" - "github.com/mooijtech/go-pst/pkg/properties" + "github.com/mooijtech/go-pst/v6/pkg/properties" "github.com/pkg/errors" "github.com/rotisserie/eris" "github.com/tinylib/msgp/msgp"