mirror of
https://github.com/m1k1o/neko.git
synced 2024-07-24 14:40:50 +12:00
upload dialog API.
This commit is contained in:
parent
98dc08cba9
commit
2b3bb6e21a
@ -69,6 +69,7 @@ func (h *RoomHandler) Route(r chi.Router) {
|
||||
|
||||
r.With(h.uploadMiddleware).Route("/upload", func(r chi.Router) {
|
||||
r.Post("/drop", h.uploadDrop)
|
||||
r.Post("/dialog", h.uploadDialog)
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -86,3 +86,65 @@ func (h *RoomHandler) uploadDrop(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
utils.HttpSuccess(w)
|
||||
}
|
||||
|
||||
|
||||
func (h *RoomHandler) uploadDialog(w http.ResponseWriter, r *http.Request) {
|
||||
r.ParseMultipartForm(MAX_UPLOAD_SIZE)
|
||||
|
||||
if r.MultipartForm == nil {
|
||||
utils.HttpBadRequest(w, "No MultipartForm received.")
|
||||
return
|
||||
}
|
||||
|
||||
defer r.MultipartForm.RemoveAll()
|
||||
|
||||
if !h.desktop.IsFileChooserDialogOpen() {
|
||||
utils.HttpBadRequest(w, "Open file chooser dialog first.")
|
||||
return
|
||||
}
|
||||
|
||||
req_files := r.MultipartForm.File["files"]
|
||||
if len(req_files) == 0 {
|
||||
utils.HttpBadRequest(w, "No files received.")
|
||||
return
|
||||
}
|
||||
|
||||
dir, err := ioutil.TempDir("", "neko-dialog-*")
|
||||
if err != nil {
|
||||
utils.HttpInternalServerError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
for _, req_file := range req_files {
|
||||
path := path.Join(dir, req_file.Filename)
|
||||
|
||||
srcFile, err := req_file.Open()
|
||||
if err != nil {
|
||||
utils.HttpInternalServerError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
defer srcFile.Close()
|
||||
|
||||
dstFile, err := os.OpenFile(path, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
utils.HttpInternalServerError(w, err)
|
||||
return
|
||||
}
|
||||
|
||||
defer dstFile.Close()
|
||||
|
||||
_, err = io.Copy(dstFile, srcFile)
|
||||
if err != nil {
|
||||
utils.HttpInternalServerError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if err := h.desktop.HandleFileChooserDialog(dir); err != nil {
|
||||
utils.HttpInternalServerError(w, "Unable to handle file chooser dialog.")
|
||||
return
|
||||
}
|
||||
|
||||
utils.HttpSuccess(w)
|
||||
}
|
||||
|
58
internal/desktop/filechooser.go
Normal file
58
internal/desktop/filechooser.go
Normal file
@ -0,0 +1,58 @@
|
||||
package desktop
|
||||
|
||||
import (
|
||||
"os/exec"
|
||||
)
|
||||
|
||||
func (manager *DesktopManagerCtx) HandleFileChooserDialog(uri string) error {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
// TOOD: Use native API.
|
||||
cmd := exec.Command(
|
||||
"xdotool",
|
||||
"search", "--name", "Open", "windowfocus",
|
||||
"sleep", "0.2",
|
||||
"key", "--clearmodifiers", "ctrl+l",
|
||||
"type", "--args", "1", uri + "//",
|
||||
"key", "--clearmodifiers", "Return",
|
||||
"sleep", "1",
|
||||
"key", "--clearmodifiers", "Down",
|
||||
"key", "--clearmodifiers", "ctrl+a",
|
||||
"key", "--clearmodifiers", "Return",
|
||||
"sleep", "0.3",
|
||||
)
|
||||
|
||||
_, err := cmd.Output()
|
||||
return err
|
||||
}
|
||||
|
||||
func (manager *DesktopManagerCtx) CloseFileChooserDialog() error {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
// TOOD: Use native API.
|
||||
cmd := exec.Command(
|
||||
"xdotool",
|
||||
"search", "--name", "Open", "windowfocus",
|
||||
"sleep", "0.2",
|
||||
"key", "--clearmodifiers", "alt+f4",
|
||||
)
|
||||
|
||||
_, err := cmd.Output()
|
||||
return err
|
||||
}
|
||||
|
||||
func (manager *DesktopManagerCtx) IsFileChooserDialogOpen() bool {
|
||||
mu.Lock()
|
||||
defer mu.Unlock()
|
||||
|
||||
// TOOD: Use native API.
|
||||
cmd := exec.Command(
|
||||
"xdotool",
|
||||
"search", "--name", "Open", "windowfocus",
|
||||
)
|
||||
|
||||
_, err := cmd.Output()
|
||||
return err == nil
|
||||
}
|
@ -66,4 +66,9 @@ type DesktopManager interface {
|
||||
|
||||
// drop
|
||||
DropFiles(x int, y int, files []string) bool
|
||||
|
||||
// filechooser
|
||||
HandleFileChooserDialog(uri string) error
|
||||
CloseFileChooserDialog() error
|
||||
IsFileChooserDialogOpen() bool
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user