fda3f43e7c
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.
71 lines
1.4 KiB
Go
71 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
|
|
}
|