aerc/commands/msgview/open.go
Andrew Jeffery fda3f43e7c Allow open to be asynchronous
This stops the ui being blocked while the resource is opened. The wait
ensures that resources are reclaimed when the process finishes while
aerc is still running.
2020-07-08 09:07:43 +02:00

72 lines
1.4 KiB
Go

package msgview
import (
"errors"
"fmt"
"io"
"io/ioutil"
"mime"
"os"
"time"
"git.sr.ht/~sircmpwn/aerc/lib"
"git.sr.ht/~sircmpwn/aerc/widgets"
)
type Open struct{}
func init() {
register(Open{})
}
func (Open) Aliases() []string {
return []string{"open"}
}
func (Open) Complete(aerc *widgets.Aerc, args []string) []string {
return nil
}
func (Open) Execute(aerc *widgets.Aerc, args []string) error {
if len(args) != 1 {
return errors.New("Usage: open")
}
mv := aerc.SelectedTab().(*widgets.MessageViewer)
p := mv.SelectedMessagePart()
store := mv.Store()
store.FetchBodyPart(p.Msg.Uid, p.Index, func(reader io.Reader) {
extension := ""
// try to determine the correct extension based on mimetype
if part, err := p.Msg.BodyStructure.PartAtIndex(p.Index); err == nil {
mimeType := fmt.Sprintf("%s/%s", part.MIMEType, part.MIMESubType)
if exts, _ := mime.ExtensionsByType(mimeType); exts != nil && len(exts) > 0 {
extension = exts[0]
}
}
tmpFile, err := ioutil.TempFile(os.TempDir(), "aerc-*"+extension)
if err != nil {
aerc.PushError(" " + err.Error())
return
}
defer tmpFile.Close()
_, err = io.Copy(tmpFile, reader)
if err != nil {
aerc.PushError(" " + err.Error())
return
}
lib.OpenFile(tmpFile.Name(), func(err error) {
aerc.PushError(" " + err.Error())
})
aerc.PushStatus("Opened", 10*time.Second)
})
return nil
}