mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-05-14 16:22:46 -04:00
018795125e
- Adds "DMS Opener" as an option (dms-open.desktop) - Add mime type GO utils - Add rememberance to App Picker modal
155 lines
3.8 KiB
Go
155 lines
3.8 KiB
Go
package mime
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/desktop"
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
|
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
|
)
|
|
|
|
type defaultResult struct {
|
|
MimeType string `json:"mimeType"`
|
|
DesktopID string `json:"desktopId"`
|
|
}
|
|
|
|
type appsResult struct {
|
|
MimeType string `json:"mimeType"`
|
|
DesktopIDs []string `json:"desktopIds"`
|
|
}
|
|
|
|
type queryResult struct {
|
|
Defaults map[string]string `json:"defaults"`
|
|
}
|
|
|
|
func HandleRequest(conn net.Conn, req models.Request) {
|
|
switch req.Method {
|
|
case "mime.getDefault":
|
|
handleGetDefault(conn, req)
|
|
case "mime.setDefault":
|
|
handleSetDefault(conn, req)
|
|
case "mime.setDefaults":
|
|
handleSetDefaults(conn, req)
|
|
case "mime.appsForMime":
|
|
handleAppsForMime(conn, req)
|
|
case "mime.queryDefaults":
|
|
handleQueryDefaults(conn, req)
|
|
case "mime.invalidate":
|
|
desktop.InvalidateCache()
|
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
|
default:
|
|
models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method))
|
|
}
|
|
}
|
|
|
|
func handleGetDefault(conn net.Conn, req models.Request) {
|
|
mimeType, err := mimeParam(req.Params, "mimeType")
|
|
if err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
models.Respond(conn, req.ID, defaultResult{
|
|
MimeType: mimeType,
|
|
DesktopID: desktop.GetDefault(mimeType),
|
|
})
|
|
}
|
|
|
|
func handleSetDefault(conn net.Conn, req models.Request) {
|
|
mimeType, err := mimeParam(req.Params, "mimeType")
|
|
if err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
desktopID, err := params.StringNonEmpty(req.Params, "desktopId")
|
|
if err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
if err := desktop.SetDefault(mimeType, desktopID); err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
|
}
|
|
|
|
func handleSetDefaults(conn net.Conn, req models.Request) {
|
|
desktopID, err := params.StringNonEmpty(req.Params, "desktopId")
|
|
if err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
mimeTypes, err := mimeListParam(req, "mimeTypes")
|
|
if err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
if err := desktop.SetDefaults(mimeTypes, desktopID); err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
|
}
|
|
|
|
func handleAppsForMime(conn net.Conn, req models.Request) {
|
|
mimeType, err := mimeParam(req.Params, "mimeType")
|
|
if err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
ids := desktop.AppsForMime(mimeType)
|
|
if ids == nil {
|
|
ids = []string{}
|
|
}
|
|
models.Respond(conn, req.ID, appsResult{
|
|
MimeType: mimeType,
|
|
DesktopIDs: ids,
|
|
})
|
|
}
|
|
|
|
func handleQueryDefaults(conn net.Conn, req models.Request) {
|
|
mimeTypes, err := mimeListParam(req, "mimeTypes")
|
|
if err != nil {
|
|
models.RespondError(conn, req.ID, err.Error())
|
|
return
|
|
}
|
|
models.Respond(conn, req.ID, queryResult{
|
|
Defaults: desktop.QueryDefaults(mimeTypes),
|
|
})
|
|
}
|
|
|
|
func mimeParam(p map[string]any, key string) (string, error) {
|
|
raw, err := params.StringNonEmpty(p, key)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
canonical := desktop.StripMimeParams(raw)
|
|
if canonical == "" {
|
|
return "", fmt.Errorf("invalid '%s' parameter", key)
|
|
}
|
|
return canonical, nil
|
|
}
|
|
|
|
func mimeListParam(req models.Request, key string) ([]string, error) {
|
|
raw, ok := models.Get[[]any](req, key)
|
|
if !ok {
|
|
return nil, fmt.Errorf("missing or invalid '%s' parameter", key)
|
|
}
|
|
out := make([]string, 0, len(raw))
|
|
for _, v := range raw {
|
|
s, ok := v.(string)
|
|
if !ok {
|
|
continue
|
|
}
|
|
canonical := desktop.StripMimeParams(s)
|
|
if canonical == "" {
|
|
continue
|
|
}
|
|
out = append(out, canonical)
|
|
}
|
|
if len(out) == 0 {
|
|
return nil, fmt.Errorf("no valid mime types provided")
|
|
}
|
|
return out, nil
|
|
}
|