mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-02 03:28:28 -04:00
core: migrate to dankgo shared go modules, embed quickshell in DMS
binary to mount at runtime, -c or DMS_SHELL_DIR overrides required to explicitly override embedded configuration
This commit is contained in:
@@ -1,9 +1,15 @@
|
||||
package errdefs
|
||||
|
||||
type ErrorType int
|
||||
import (
|
||||
dankerrdefs "github.com/AvengeMedia/dankgo/errdefs"
|
||||
)
|
||||
|
||||
type ErrorType = dankerrdefs.ErrorType
|
||||
|
||||
type CustomError = dankerrdefs.CustomError
|
||||
|
||||
const (
|
||||
ErrTypeNotLinux ErrorType = iota
|
||||
ErrTypeNotLinux ErrorType = dankerrdefs.AppErrorBase + iota
|
||||
ErrTypeInvalidArchitecture
|
||||
ErrTypeUnsupportedDistribution
|
||||
ErrTypeUnsupportedVersion
|
||||
@@ -22,20 +28,8 @@ const (
|
||||
ErrTypeGeneric
|
||||
)
|
||||
|
||||
type CustomError struct {
|
||||
Type ErrorType
|
||||
Message string
|
||||
}
|
||||
|
||||
func (e *CustomError) Error() string {
|
||||
return e.Message
|
||||
}
|
||||
|
||||
func NewCustomError(errType ErrorType, message string) error {
|
||||
return &CustomError{
|
||||
Type: errType,
|
||||
Message: message,
|
||||
}
|
||||
return dankerrdefs.NewCustomError(errType, message)
|
||||
}
|
||||
|
||||
const (
|
||||
|
||||
@@ -5,8 +5,8 @@ import (
|
||||
"sync"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/dbusutil"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
+19
-207
@@ -1,220 +1,32 @@
|
||||
package log
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
"regexp"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/charmbracelet/lipgloss"
|
||||
cblog "github.com/charmbracelet/log"
|
||||
"github.com/mattn/go-isatty"
|
||||
"github.com/muesli/termenv"
|
||||
danklog "github.com/AvengeMedia/dankgo/log"
|
||||
)
|
||||
|
||||
// Logger embeds the Charm Logger and adds Printf/Fatalf
|
||||
type Logger struct{ *cblog.Logger }
|
||||
type Logger = danklog.Logger
|
||||
|
||||
// Printf routes goose/info-style logs through Infof.
|
||||
func (l *Logger) Printf(format string, v ...any) { l.Infof(format, v...) }
|
||||
|
||||
// Fatalf keeps goose’s contract of exiting the program.
|
||||
func (l *Logger) Fatalf(format string, v ...any) { l.Logger.Fatalf(format, v...) }
|
||||
|
||||
var (
|
||||
logger *Logger
|
||||
initLogger sync.Once
|
||||
|
||||
logMu sync.Mutex
|
||||
logFile *os.File
|
||||
logStderr io.Writer = os.Stderr
|
||||
|
||||
ansiRe = regexp.MustCompile(`\x1b\[[0-9;]*[a-zA-Z]`)
|
||||
)
|
||||
|
||||
// ansiStripWriter strips ANSI escape sequences before forwarding to w. Used
|
||||
// for the file sink so colored stderr stays colored while the file stays plain.
|
||||
type ansiStripWriter struct{ w io.Writer }
|
||||
|
||||
func (a *ansiStripWriter) Write(p []byte) (int, error) {
|
||||
stripped := ansiRe.ReplaceAll(p, nil)
|
||||
if _, err := a.w.Write(stripped); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return len(p), nil
|
||||
func init() {
|
||||
danklog.SetEnvPrefix("DMS")
|
||||
}
|
||||
|
||||
func parseLogLevel(level string) cblog.Level {
|
||||
switch strings.ToLower(level) {
|
||||
case "debug":
|
||||
return cblog.DebugLevel
|
||||
case "info":
|
||||
return cblog.InfoLevel
|
||||
case "warn", "warning":
|
||||
return cblog.WarnLevel
|
||||
case "error":
|
||||
return cblog.ErrorLevel
|
||||
case "fatal":
|
||||
return cblog.FatalLevel
|
||||
default:
|
||||
return cblog.InfoLevel
|
||||
}
|
||||
}
|
||||
func GetLogger() *Logger { return danklog.GetLogger() }
|
||||
|
||||
func GetQtLoggingRules() string {
|
||||
level := os.Getenv("DMS_LOG_LEVEL")
|
||||
if level == "" {
|
||||
level = "info"
|
||||
}
|
||||
func GetQtLoggingRules() string { return danklog.GetQtLoggingRules() }
|
||||
|
||||
// scene carries QML engine warnings (e.g. QQuickImage "Cannot open" cache
|
||||
// probes); suppressed except at debug level
|
||||
var rules []string
|
||||
switch strings.ToLower(level) {
|
||||
case "fatal":
|
||||
rules = []string{"*.debug=false", "*.info=false", "*.warning=false", "*.critical=false"}
|
||||
case "error":
|
||||
rules = []string{"*.debug=false", "*.info=false", "*.warning=false"}
|
||||
case "warn", "warning":
|
||||
rules = []string{"*.debug=false", "*.info=false", "scene.warning=false"}
|
||||
case "info":
|
||||
rules = []string{"*.debug=false", "scene.warning=false"}
|
||||
case "debug":
|
||||
return ""
|
||||
default:
|
||||
rules = []string{"*.debug=false", "scene.warning=false"}
|
||||
}
|
||||
func SetLevel(level string) { danklog.SetLevel(level) }
|
||||
|
||||
return strings.Join(rules, ";")
|
||||
}
|
||||
func SetLogFile(path string) error { return danklog.SetLogFile(path) }
|
||||
|
||||
// GetLogger returns a logger instance
|
||||
func GetLogger() *Logger {
|
||||
initLogger.Do(func() {
|
||||
styles := cblog.DefaultStyles()
|
||||
// Attempt to match the colors used by qml/quickshell logs
|
||||
styles.Levels[cblog.FatalLevel] = lipgloss.NewStyle().
|
||||
SetString(" FATAL").
|
||||
Foreground(lipgloss.Color("1"))
|
||||
styles.Levels[cblog.ErrorLevel] = lipgloss.NewStyle().
|
||||
SetString(" ERROR").
|
||||
Foreground(lipgloss.Color("9"))
|
||||
styles.Levels[cblog.WarnLevel] = lipgloss.NewStyle().
|
||||
SetString(" WARN").
|
||||
Foreground(lipgloss.Color("3"))
|
||||
styles.Levels[cblog.InfoLevel] = lipgloss.NewStyle().
|
||||
SetString(" INFO").
|
||||
Foreground(lipgloss.Color("2"))
|
||||
styles.Levels[cblog.DebugLevel] = lipgloss.NewStyle().
|
||||
SetString(" DEBUG").
|
||||
Foreground(lipgloss.Color("4"))
|
||||
func ApplyEnvOverrides() { danklog.ApplyEnvOverrides() }
|
||||
|
||||
base := cblog.New(logStderr)
|
||||
base.SetStyles(styles)
|
||||
base.SetReportTimestamp(false)
|
||||
|
||||
level := cblog.InfoLevel
|
||||
if envLevel := os.Getenv("DMS_LOG_LEVEL"); envLevel != "" {
|
||||
level = parseLogLevel(envLevel)
|
||||
}
|
||||
base.SetLevel(level)
|
||||
base.SetPrefix(" go")
|
||||
|
||||
logger = &Logger{base}
|
||||
|
||||
if path := os.Getenv("DMS_LOG_FILE"); path != "" {
|
||||
logMu.Lock()
|
||||
_ = setLogFile(logger, path)
|
||||
logMu.Unlock()
|
||||
}
|
||||
})
|
||||
return logger
|
||||
}
|
||||
|
||||
// SetLevel updates the active log level. Accepts the same strings as
|
||||
// DMS_LOG_LEVEL. Unknown values default to info.
|
||||
func SetLevel(level string) {
|
||||
GetLogger().SetLevel(parseLogLevel(level))
|
||||
}
|
||||
|
||||
// SetLogFile makes the logger append to path in addition to stderr. Passing an
|
||||
// empty string detaches the file sink. Atomic per-line writes (≤PIPE_BUF) on
|
||||
// O_APPEND keep concurrent Go and QML writers from corrupting each other.
|
||||
//
|
||||
// Color handling: charmbracelet/log auto-detects color support from its
|
||||
// io.Writer, and io.MultiWriter doesn't pass that through, so we force the ANSI
|
||||
// profile when stderr is a TTY and route the file through ansiStripWriter so
|
||||
// the file stays plain while stderr keeps its colors.
|
||||
func SetLogFile(path string) error {
|
||||
l := GetLogger()
|
||||
logMu.Lock()
|
||||
defer logMu.Unlock()
|
||||
return setLogFile(l, path)
|
||||
}
|
||||
|
||||
func setLogFile(l *Logger, path string) error {
|
||||
if logFile != nil {
|
||||
logFile.Close()
|
||||
logFile = nil
|
||||
}
|
||||
|
||||
if path == "" {
|
||||
l.SetOutput(logStderr)
|
||||
applyColorProfile(l, logStderr)
|
||||
return nil
|
||||
}
|
||||
|
||||
f, err := os.OpenFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0o644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
logFile = f
|
||||
out := io.MultiWriter(logStderr, &ansiStripWriter{w: f})
|
||||
l.SetOutput(out)
|
||||
applyColorProfile(l, logStderr)
|
||||
return nil
|
||||
}
|
||||
|
||||
// applyColorProfile forces the renderer's color profile to match what stderr
|
||||
// would produce on its own, undoing the auto-downgrade triggered by wrapping
|
||||
// stderr in a non-TTY writer (e.g. io.MultiWriter).
|
||||
func applyColorProfile(l *Logger, stderr io.Writer) {
|
||||
f, ok := stderr.(*os.File)
|
||||
if !ok {
|
||||
l.SetColorProfile(termenv.Ascii)
|
||||
return
|
||||
}
|
||||
if isatty.IsTerminal(f.Fd()) {
|
||||
l.SetColorProfile(termenv.ANSI)
|
||||
return
|
||||
}
|
||||
l.SetColorProfile(termenv.Ascii)
|
||||
}
|
||||
|
||||
// ApplyEnvOverrides re-reads DMS_LOG_LEVEL and DMS_LOG_FILE and reconfigures
|
||||
// the singleton. Safe to call after CLI flags have rewritten the environment.
|
||||
func ApplyEnvOverrides() {
|
||||
GetLogger()
|
||||
if level := os.Getenv("DMS_LOG_LEVEL"); level != "" {
|
||||
SetLevel(level)
|
||||
}
|
||||
if path := os.Getenv("DMS_LOG_FILE"); path != "" {
|
||||
if err := SetLogFile(path); err != nil {
|
||||
Warnf("Failed to open log file %q: %v", path, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// * Convenience wrappers
|
||||
|
||||
func Debug(msg any, keyvals ...any) { GetLogger().Debug(msg, keyvals...) }
|
||||
func Debugf(format string, v ...any) { GetLogger().Debugf(format, v...) }
|
||||
func Info(msg any, keyvals ...any) { GetLogger().Info(msg, keyvals...) }
|
||||
func Infof(format string, v ...any) { GetLogger().Infof(format, v...) }
|
||||
func Warn(msg any, keyvals ...any) { GetLogger().Warn(msg, keyvals...) }
|
||||
func Warnf(format string, v ...any) { GetLogger().Warnf(format, v...) }
|
||||
func Error(msg any, keyvals ...any) { GetLogger().Error(msg, keyvals...) }
|
||||
func Errorf(format string, v ...any) { GetLogger().Errorf(format, v...) }
|
||||
func Fatal(msg any, keyvals ...any) { GetLogger().Fatal(msg, keyvals...) }
|
||||
func Fatalf(format string, v ...any) { GetLogger().Fatalf(format, v...) }
|
||||
func Debug(msg any, keyvals ...any) { danklog.Debug(msg, keyvals...) }
|
||||
func Debugf(format string, v ...any) { danklog.Debugf(format, v...) }
|
||||
func Info(msg any, keyvals ...any) { danklog.Info(msg, keyvals...) }
|
||||
func Infof(format string, v ...any) { danklog.Infof(format, v...) }
|
||||
func Warn(msg any, keyvals ...any) { danklog.Warn(msg, keyvals...) }
|
||||
func Warnf(format string, v ...any) { danklog.Warnf(format, v...) }
|
||||
func Error(msg any, keyvals ...any) { danklog.Error(msg, keyvals...) }
|
||||
func Errorf(format string, v ...any) { danklog.Errorf(format, v...) }
|
||||
func Fatal(msg any, keyvals ...any) { danklog.Fatal(msg, keyvals...) }
|
||||
func Fatalf(format string, v ...any) { danklog.Fatalf(format, v...) }
|
||||
|
||||
@@ -34,7 +34,7 @@ import (
|
||||
"unsafe"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
func registerServerProxy(ctx *client.Context, proxy client.Proxy, serverID uint32) {
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
package apppicker
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/desktop"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "apppicker.open", "browser.open":
|
||||
handleOpen(conn, req, manager)
|
||||
@@ -17,7 +15,7 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleOpen(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleOpen(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
log.Infof("AppPicker: Received %s request with params: %+v", req.Method, req.Params)
|
||||
|
||||
target, ok := models.Get[string](req, "target")
|
||||
|
||||
@@ -3,7 +3,7 @@ package apppicker
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type Manager struct {
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package bluez
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
type BluetoothEvent struct {
|
||||
@@ -14,7 +12,7 @@ type BluetoothEvent struct {
|
||||
Data BluetoothState `json:"data"`
|
||||
}
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "bluetooth.getState":
|
||||
handleGetState(conn, req, manager)
|
||||
@@ -47,11 +45,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleStartDiscovery(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleStartDiscovery(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.StartDiscovery(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -59,7 +57,7 @@ func handleStartDiscovery(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "discovery started"})
|
||||
}
|
||||
|
||||
func handleStopDiscovery(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleStopDiscovery(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.StopDiscovery(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -67,7 +65,7 @@ func handleStopDiscovery(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "discovery stopped"})
|
||||
}
|
||||
|
||||
func handleSetPowered(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetPowered(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
powered, err := params.Bool(req.Params, "powered")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -82,7 +80,7 @@ func handleSetPowered(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "powered state updated"})
|
||||
}
|
||||
|
||||
func handlePairDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handlePairDevice(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
devicePath, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -97,7 +95,7 @@ func handlePairDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "pairing initiated"})
|
||||
}
|
||||
|
||||
func handleConnectDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleConnectDevice(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
devicePath, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -112,7 +110,7 @@ func handleConnectDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "connecting"})
|
||||
}
|
||||
|
||||
func handleDisconnectDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDisconnectDevice(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
devicePath, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -127,7 +125,7 @@ func handleDisconnectDevice(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "disconnected"})
|
||||
}
|
||||
|
||||
func handleRemoveDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleRemoveDevice(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
devicePath, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -142,7 +140,7 @@ func handleRemoveDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "device removed"})
|
||||
}
|
||||
|
||||
func handleTrustDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleTrustDevice(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
devicePath, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -157,7 +155,7 @@ func handleTrustDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "device trusted"})
|
||||
}
|
||||
|
||||
func handleUntrustDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleUntrustDevice(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
devicePath, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -172,7 +170,7 @@ func handleUntrustDevice(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "device untrusted"})
|
||||
}
|
||||
|
||||
func handlePairingSubmit(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handlePairingSubmit(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
token, err := params.String(req.Params, "token")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -190,7 +188,7 @@ func handlePairingSubmit(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "pairing response submitted"})
|
||||
}
|
||||
|
||||
func handlePairingCancel(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handlePairingCancel(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
token, err := params.String(req.Params, "token")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -205,7 +203,7 @@ func handlePairingCancel(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "pairing cancelled"})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
@@ -216,7 +214,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Data: initialState,
|
||||
}
|
||||
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[BluetoothEvent]{
|
||||
if err := conn.WriteResponse(models.Response[BluetoothEvent]{
|
||||
ID: req.ID,
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
@@ -228,7 +226,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Type: "state_changed",
|
||||
Data: state,
|
||||
}
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[BluetoothEvent]{
|
||||
if err := conn.WriteResponse(models.Response[BluetoothEvent]{
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
return
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
||||
"github.com/AvengeMedia/dankgo/dbusutil"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/errdefs"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type SubscriptionBroker struct {
|
||||
|
||||
@@ -3,7 +3,7 @@ package bluez
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
package brightness
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, m *Manager) {
|
||||
switch req.Method {
|
||||
case "brightness.getState":
|
||||
handleGetState(conn, req, m)
|
||||
@@ -28,11 +26,11 @@ func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
}
|
||||
|
||||
func handleSetBrightness(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleSetBrightness(conn *models.Conn, req models.Request, m *Manager) {
|
||||
device, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -56,7 +54,7 @@ func handleSetBrightness(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
}
|
||||
|
||||
func handleIncrement(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleIncrement(conn *models.Conn, req models.Request, m *Manager) {
|
||||
device, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -75,7 +73,7 @@ func handleIncrement(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
}
|
||||
|
||||
func handleDecrement(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleDecrement(conn *models.Conn, req models.Request, m *Manager) {
|
||||
device, err := params.String(req.Params, "device")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -94,19 +92,19 @@ func handleDecrement(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
}
|
||||
|
||||
func handleRescan(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleRescan(conn *models.Conn, req models.Request, m *Manager) {
|
||||
m.Rescan()
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, m *Manager) {
|
||||
clientID := fmt.Sprintf("brightness-%d", req.ID)
|
||||
|
||||
ch := m.Subscribe(clientID)
|
||||
defer m.Unsubscribe(clientID)
|
||||
|
||||
initialState := m.GetState()
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &initialState,
|
||||
}); err != nil {
|
||||
@@ -114,7 +112,7 @@ func handleSubscribe(conn net.Conn, req models.Request, m *Manager) {
|
||||
}
|
||||
|
||||
for state := range ch {
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &state,
|
||||
}); err != nil {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type DeviceClass string
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package browser
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "browser.open":
|
||||
url, ok := models.Get[string](req, "url")
|
||||
|
||||
@@ -3,7 +3,7 @@ package browser
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type Manager struct {
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
package clipboard
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
clipboardstore "github.com/AvengeMedia/DankMaterialShell/core/internal/clipboard"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, m *Manager) {
|
||||
switch req.Method {
|
||||
case "clipboard.getState":
|
||||
handleGetState(conn, req, m)
|
||||
@@ -58,11 +56,11 @@ func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
}
|
||||
|
||||
func handleGetHistory(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetHistory(conn *models.Conn, req models.Request, m *Manager) {
|
||||
history := m.GetHistory()
|
||||
for i := range history {
|
||||
history[i].Data = nil
|
||||
@@ -70,7 +68,7 @@ func handleGetHistory(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, history)
|
||||
}
|
||||
|
||||
func handleGetEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetEntry(conn *models.Conn, req models.Request, m *Manager) {
|
||||
id, err := params.Int(req.Params, "id")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -90,7 +88,7 @@ func handleGetEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, entry)
|
||||
}
|
||||
|
||||
func handleDeleteEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleDeleteEntry(conn *models.Conn, req models.Request, m *Manager) {
|
||||
id, err := params.Int(req.Params, "id")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -105,12 +103,12 @@ func handleDeleteEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "entry deleted"})
|
||||
}
|
||||
|
||||
func handleClearHistory(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleClearHistory(conn *models.Conn, req models.Request, m *Manager) {
|
||||
m.ClearHistory()
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "history cleared"})
|
||||
}
|
||||
|
||||
func handleCopy(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleCopy(conn *models.Conn, req models.Request, m *Manager) {
|
||||
text, err := params.String(req.Params, "text")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -125,7 +123,7 @@ func handleCopy(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "copied to clipboard"})
|
||||
}
|
||||
|
||||
func handleCopyEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleCopyEntry(conn *models.Conn, req models.Request, m *Manager) {
|
||||
id, err := params.Int(req.Params, "id")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -173,7 +171,7 @@ func handleCopyEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "copied to clipboard"})
|
||||
}
|
||||
|
||||
func handlePaste(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handlePaste(conn *models.Conn, req models.Request, m *Manager) {
|
||||
text, err := m.PasteText()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -183,7 +181,7 @@ func handlePaste(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, map[string]string{"text": text})
|
||||
}
|
||||
|
||||
func handleSendPaste(conn net.Conn, req models.Request) {
|
||||
func handleSendPaste(conn *models.Conn, req models.Request) {
|
||||
shift, _ := models.Get[bool](req, "shift")
|
||||
|
||||
if err := clipboardstore.SendPasteKeystroke(shift); err != nil {
|
||||
@@ -194,14 +192,14 @@ func handleSendPaste(conn net.Conn, req models.Request) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "paste sent"})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, m *Manager) {
|
||||
clientID := fmt.Sprintf("clipboard-%d", req.ID)
|
||||
|
||||
ch := m.Subscribe(clientID)
|
||||
defer m.Unsubscribe(clientID)
|
||||
|
||||
initialState := m.GetState()
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &initialState,
|
||||
}); err != nil {
|
||||
@@ -209,7 +207,7 @@ func handleSubscribe(conn net.Conn, req models.Request, m *Manager) {
|
||||
}
|
||||
|
||||
for state := range ch {
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &state,
|
||||
}); err != nil {
|
||||
@@ -218,7 +216,7 @@ func handleSubscribe(conn net.Conn, req models.Request, m *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleSearch(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleSearch(conn *models.Conn, req models.Request, m *Manager) {
|
||||
p := SearchParams{
|
||||
Query: params.StringOpt(req.Params, "query", ""),
|
||||
MimeType: params.StringOpt(req.Params, "mimeType", ""),
|
||||
@@ -241,11 +239,11 @@ func handleSearch(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.Search(p))
|
||||
}
|
||||
|
||||
func handleGetConfig(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetConfig(conn *models.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.GetConfig())
|
||||
}
|
||||
|
||||
func handleSetConfig(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleSetConfig(conn *models.Conn, req models.Request, m *Manager) {
|
||||
cfg := m.GetConfig()
|
||||
|
||||
if v, ok := models.Get[float64](req, "maxHistory"); ok {
|
||||
@@ -275,7 +273,7 @@ func handleSetConfig(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "config updated"})
|
||||
}
|
||||
|
||||
func handleStore(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleStore(conn *models.Conn, req models.Request, m *Manager) {
|
||||
data, err := params.String(req.Params, "data")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -292,7 +290,7 @@ func handleStore(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "stored"})
|
||||
}
|
||||
|
||||
func handlePinEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handlePinEntry(conn *models.Conn, req models.Request, m *Manager) {
|
||||
id, err := params.Int(req.Params, "id")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -307,7 +305,7 @@ func handlePinEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "entry pinned"})
|
||||
}
|
||||
|
||||
func handleUnpinEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleUnpinEntry(conn *models.Conn, req models.Request, m *Manager) {
|
||||
id, err := params.Int(req.Params, "id")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -322,17 +320,17 @@ func handleUnpinEntry(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "entry unpinned"})
|
||||
}
|
||||
|
||||
func handleGetPinnedEntries(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetPinnedEntries(conn *models.Conn, req models.Request, m *Manager) {
|
||||
pinned := m.GetPinnedEntries()
|
||||
models.Respond(conn, req.ID, pinned)
|
||||
}
|
||||
|
||||
func handleGetPinnedCount(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetPinnedCount(conn *models.Conn, req models.Request, m *Manager) {
|
||||
count := m.GetPinnedCount()
|
||||
models.Respond(conn, req.ID, map[string]int{"count": count})
|
||||
}
|
||||
|
||||
func handleCopyFile(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleCopyFile(conn *models.Conn, req models.Request, m *Manager) {
|
||||
filePath, err := params.String(req.Params, "filePath")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
|
||||
@@ -311,14 +311,15 @@ func TestHandleGetEntry_ReturnsExistingEntry(t *testing.T) {
|
||||
history := m.GetHistory()
|
||||
require.Len(t, history, 1)
|
||||
|
||||
conn := newClipboardTestConn()
|
||||
mc := newClipboardTestConn()
|
||||
conn := models.NewConn(mc)
|
||||
handleGetEntry(conn, models.Request{
|
||||
ID: 1,
|
||||
Params: map[string]any{"id": float64(history[0].ID)},
|
||||
}, m)
|
||||
|
||||
var resp models.Response[Entry]
|
||||
require.NoError(t, json.NewDecoder(conn.writeBuf).Decode(&resp))
|
||||
require.NoError(t, json.NewDecoder(mc.writeBuf).Decode(&resp))
|
||||
assert.Empty(t, resp.Error)
|
||||
require.NotNil(t, resp.Result)
|
||||
assert.Equal(t, history[0].ID, resp.Result.ID)
|
||||
@@ -327,7 +328,8 @@ func TestHandleGetEntry_ReturnsExistingEntry(t *testing.T) {
|
||||
|
||||
func TestHandleGetEntry_MissingIDReturnsNullResult(t *testing.T) {
|
||||
m := newTestManagerWithDB(t)
|
||||
conn := newClipboardTestConn()
|
||||
mc := newClipboardTestConn()
|
||||
conn := models.NewConn(mc)
|
||||
|
||||
handleGetEntry(conn, models.Request{
|
||||
ID: 1,
|
||||
@@ -335,7 +337,7 @@ func TestHandleGetEntry_MissingIDReturnsNullResult(t *testing.T) {
|
||||
}, m)
|
||||
|
||||
var resp models.Response[any]
|
||||
require.NoError(t, json.NewDecoder(conn.writeBuf).Decode(&resp))
|
||||
require.NoError(t, json.NewDecoder(mc.writeBuf).Decode(&resp))
|
||||
assert.Empty(t, resp.Error)
|
||||
assert.Nil(t, resp.Result)
|
||||
}
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package cups
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
type CUPSEvent struct {
|
||||
@@ -20,7 +18,7 @@ type TestPageResult struct {
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "cups.subscribe":
|
||||
handleSubscribe(conn, req, manager)
|
||||
@@ -77,7 +75,7 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetPrinters(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetPrinters(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printers, err := manager.GetPrinters()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -86,7 +84,7 @@ func handleGetPrinters(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, printers)
|
||||
}
|
||||
|
||||
func handleGetJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetJobs(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.String(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -101,7 +99,7 @@ func handleGetJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, jobs)
|
||||
}
|
||||
|
||||
func handlePausePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handlePausePrinter(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.String(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -115,7 +113,7 @@ func handlePausePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "paused"})
|
||||
}
|
||||
|
||||
func handleResumePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleResumePrinter(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.String(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -129,7 +127,7 @@ func handleResumePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "resumed"})
|
||||
}
|
||||
|
||||
func handleCancelJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleCancelJob(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
jobID, err := params.Int(req.Params, "jobID")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -143,7 +141,7 @@ func handleCancelJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "job canceled"})
|
||||
}
|
||||
|
||||
func handlePurgeJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handlePurgeJobs(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.String(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -157,7 +155,7 @@ func handlePurgeJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "jobs canceled"})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
@@ -168,7 +166,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Data: initialState,
|
||||
}
|
||||
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[CUPSEvent]{
|
||||
if err := conn.WriteResponse(models.Response[CUPSEvent]{
|
||||
ID: req.ID,
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
@@ -180,7 +178,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Type: "state_changed",
|
||||
Data: state,
|
||||
}
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[CUPSEvent]{
|
||||
if err := conn.WriteResponse(models.Response[CUPSEvent]{
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
return
|
||||
@@ -188,7 +186,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetDevices(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetDevices(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
devices, err := manager.GetDevices()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -197,7 +195,7 @@ func handleGetDevices(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, devices)
|
||||
}
|
||||
|
||||
func handleGetPPDs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetPPDs(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
ppds, err := manager.GetPPDs()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -206,7 +204,7 @@ func handleGetPPDs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, ppds)
|
||||
}
|
||||
|
||||
func handleGetClasses(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetClasses(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
classes, err := manager.GetClasses()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -215,7 +213,7 @@ func handleGetClasses(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, classes)
|
||||
}
|
||||
|
||||
func handleCreatePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleCreatePrinter(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
name, err := params.StringNonEmpty(req.Params, "name")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -246,7 +244,7 @@ func handleCreatePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "printer created"})
|
||||
}
|
||||
|
||||
func handleDeletePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDeletePrinter(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.StringNonEmpty(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -260,7 +258,7 @@ func handleDeletePrinter(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "printer deleted"})
|
||||
}
|
||||
|
||||
func handleAcceptJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleAcceptJobs(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.StringNonEmpty(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -274,7 +272,7 @@ func handleAcceptJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "accepting jobs"})
|
||||
}
|
||||
|
||||
func handleRejectJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleRejectJobs(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.StringNonEmpty(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -288,7 +286,7 @@ func handleRejectJobs(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "rejecting jobs"})
|
||||
}
|
||||
|
||||
func handleSetPrinterShared(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetPrinterShared(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.StringNonEmpty(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -308,7 +306,7 @@ func handleSetPrinterShared(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "sharing updated"})
|
||||
}
|
||||
|
||||
func handleSetPrinterLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetPrinterLocation(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.StringNonEmpty(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -328,7 +326,7 @@ func handleSetPrinterLocation(conn net.Conn, req models.Request, manager *Manage
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "location updated"})
|
||||
}
|
||||
|
||||
func handleSetPrinterInfo(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetPrinterInfo(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.StringNonEmpty(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -348,7 +346,7 @@ func handleSetPrinterInfo(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "info updated"})
|
||||
}
|
||||
|
||||
func handleMoveJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleMoveJob(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
jobID, err := params.Int(req.Params, "jobID")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -368,7 +366,7 @@ func handleMoveJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "job moved"})
|
||||
}
|
||||
|
||||
func handlePrintTestPage(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handlePrintTestPage(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
printerName, err := params.StringNonEmpty(req.Params, "printerName")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -383,7 +381,7 @@ func handlePrintTestPage(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, TestPageResult{Success: true, JobID: jobID, Message: "test page queued"})
|
||||
}
|
||||
|
||||
func handleAddPrinterToClass(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleAddPrinterToClass(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
className, err := params.StringNonEmpty(req.Params, "className")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -403,7 +401,7 @@ func handleAddPrinterToClass(conn net.Conn, req models.Request, manager *Manager
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "printer added to class"})
|
||||
}
|
||||
|
||||
func handleRemovePrinterFromClass(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleRemovePrinterFromClass(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
className, err := params.StringNonEmpty(req.Params, "className")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -423,7 +421,7 @@ func handleRemovePrinterFromClass(conn net.Conn, req models.Request, manager *Ma
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "printer removed from class"})
|
||||
}
|
||||
|
||||
func handleDeleteClass(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDeleteClass(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
className, err := params.StringNonEmpty(req.Params, "className")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -437,7 +435,7 @@ func handleDeleteClass(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "class deleted"})
|
||||
}
|
||||
|
||||
func handleRestartJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleRestartJob(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
jobID, err := params.Int(req.Params, "jobID")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -451,7 +449,7 @@ func handleRestartJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "job restarted"})
|
||||
}
|
||||
|
||||
func handleHoldJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleHoldJob(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
jobID, err := params.Int(req.Params, "jobID")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -467,7 +465,7 @@ func handleHoldJob(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "job held"})
|
||||
}
|
||||
|
||||
func handleTestConnection(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleTestConnection(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
host, err := params.StringNonEmpty(req.Params, "host")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
|
||||
@@ -41,7 +41,7 @@ func TestHandleGetPrinters(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -66,7 +66,7 @@ func TestHandleGetPrinters_Error(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -98,7 +98,7 @@ func TestHandleGetJobs(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -125,7 +125,7 @@ func TestHandleGetJobs_MissingParam(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -150,7 +150,7 @@ func TestHandlePausePrinter(t *testing.T) {
|
||||
m := NewTestManager(mockClient, nil)
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -177,7 +177,7 @@ func TestHandleResumePrinter(t *testing.T) {
|
||||
m := NewTestManager(mockClient, nil)
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -204,7 +204,7 @@ func TestHandleCancelJob(t *testing.T) {
|
||||
m := NewTestManager(mockClient, nil)
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -231,7 +231,7 @@ func TestHandlePurgeJobs(t *testing.T) {
|
||||
m := NewTestManager(mockClient, nil)
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -258,7 +258,7 @@ func TestHandleRequest_UnknownMethod(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -285,7 +285,7 @@ func TestHandleGetDevices(t *testing.T) {
|
||||
|
||||
m := &Manager{client: mockClient}
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "cups.getDevices"}
|
||||
handleGetDevices(conn, req, m)
|
||||
@@ -307,7 +307,7 @@ func TestHandleGetPPDs(t *testing.T) {
|
||||
|
||||
m := &Manager{client: mockClient}
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "cups.getPPDs"}
|
||||
handleGetPPDs(conn, req, m)
|
||||
@@ -330,7 +330,7 @@ func TestHandleGetClasses(t *testing.T) {
|
||||
|
||||
m := &Manager{client: mockClient}
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "cups.getClasses"}
|
||||
handleGetClasses(conn, req, m)
|
||||
@@ -351,7 +351,7 @@ func TestHandleCreatePrinter(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -375,7 +375,7 @@ func TestHandleCreatePrinter_MissingParams(t *testing.T) {
|
||||
mockClient := mocks_cups.NewMockCUPSClientInterface(t)
|
||||
m := &Manager{client: mockClient}
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "cups.createPrinter", Params: map[string]any{}}
|
||||
handleCreatePrinter(conn, req, m)
|
||||
@@ -394,7 +394,7 @@ func TestHandleDeletePrinter(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -417,7 +417,7 @@ func TestHandleAcceptJobs(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -440,7 +440,7 @@ func TestHandleRejectJobs(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -463,7 +463,7 @@ func TestHandleSetPrinterShared(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -486,7 +486,7 @@ func TestHandleSetPrinterLocation(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -509,7 +509,7 @@ func TestHandleSetPrinterInfo(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -532,7 +532,7 @@ func TestHandleMoveJob(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -555,7 +555,7 @@ func TestHandlePrintTestPage(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -579,7 +579,7 @@ func TestHandleAddPrinterToClass(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -602,7 +602,7 @@ func TestHandleRemovePrinterFromClass(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -625,7 +625,7 @@ func TestHandleDeleteClass(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -648,7 +648,7 @@ func TestHandleRestartJob(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -671,7 +671,7 @@ func TestHandleHoldJob(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -694,7 +694,7 @@ func TestHandleHoldJob_WithHoldUntil(t *testing.T) {
|
||||
|
||||
m := NewTestManager(mockClient, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
|
||||
@@ -302,7 +302,7 @@ func TestHandleTestConnection_Success(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -325,7 +325,7 @@ func TestHandleTestConnection_Success(t *testing.T) {
|
||||
func TestHandleTestConnection_MissingHost(t *testing.T) {
|
||||
m := NewTestManager(nil, nil)
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -351,7 +351,7 @@ func TestHandleTestConnection_CustomPortAndProtocol(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
@@ -379,7 +379,7 @@ func TestHandleRequest_TestConnection(t *testing.T) {
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{
|
||||
ID: 1,
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/ipp"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type CUPSState struct {
|
||||
|
||||
@@ -2,10 +2,9 @@ package dbus
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
type objectParams struct {
|
||||
@@ -43,7 +42,7 @@ func extractObjectParams(p map[string]any, requirePath bool) (objectParams, erro
|
||||
return objectParams{bus: bus, dest: dest, path: path, iface: iface}, nil
|
||||
}
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, m *Manager, clientID string) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, m *Manager, clientID string) {
|
||||
switch req.Method {
|
||||
case "dbus.call":
|
||||
handleCall(conn, req, m)
|
||||
@@ -66,7 +65,7 @@ func HandleRequest(conn net.Conn, req models.Request, m *Manager, clientID strin
|
||||
}
|
||||
}
|
||||
|
||||
func handleCall(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleCall(conn *models.Conn, req models.Request, m *Manager) {
|
||||
op, err := extractObjectParams(req.Params, true)
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -95,7 +94,7 @@ func handleCall(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, result)
|
||||
}
|
||||
|
||||
func handleGetProperty(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetProperty(conn *models.Conn, req models.Request, m *Manager) {
|
||||
op, err := extractObjectParams(req.Params, true)
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -117,7 +116,7 @@ func handleGetProperty(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, result)
|
||||
}
|
||||
|
||||
func handleSetProperty(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleSetProperty(conn *models.Conn, req models.Request, m *Manager) {
|
||||
op, err := extractObjectParams(req.Params, true)
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -144,7 +143,7 @@ func handleSetProperty(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
||||
}
|
||||
|
||||
func handleGetAllProperties(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetAllProperties(conn *models.Conn, req models.Request, m *Manager) {
|
||||
op, err := extractObjectParams(req.Params, true)
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -160,7 +159,7 @@ func handleGetAllProperties(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, result)
|
||||
}
|
||||
|
||||
func handleIntrospect(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleIntrospect(conn *models.Conn, req models.Request, m *Manager) {
|
||||
bus, err := params.String(req.Params, "bus")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -184,7 +183,7 @@ func handleIntrospect(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, result)
|
||||
}
|
||||
|
||||
func handleListNames(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleListNames(conn *models.Conn, req models.Request, m *Manager) {
|
||||
bus, err := params.String(req.Params, "bus")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -200,7 +199,7 @@ func handleListNames(conn net.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, result)
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, m *Manager, clientID string) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, m *Manager, clientID string) {
|
||||
if id := params.StringOpt(req.Params, "clientId", ""); id != "" {
|
||||
clientID = id
|
||||
}
|
||||
@@ -225,7 +224,7 @@ func handleSubscribe(conn net.Conn, req models.Request, m *Manager, clientID str
|
||||
models.Respond(conn, req.ID, result)
|
||||
}
|
||||
|
||||
func handleUnsubscribe(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleUnsubscribe(conn *models.Conn, req models.Request, m *Manager) {
|
||||
subID, err := params.String(req.Params, "subscriptionId")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
||||
"github.com/AvengeMedia/dankgo/dbusutil"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package dbus
|
||||
|
||||
import (
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
package evdev
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, m *Manager) {
|
||||
switch req.Method {
|
||||
case "evdev.getState":
|
||||
handleGetState(conn, req, m)
|
||||
@@ -15,6 +13,6 @@ func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, m *Manager) {
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
}
|
||||
|
||||
@@ -52,7 +52,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
closeChan: make(chan struct{}),
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "evdev.getState",
|
||||
@@ -62,7 +63,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, m)
|
||||
|
||||
var resp models.Response[State]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -81,7 +82,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
closeChan: make(chan struct{}),
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 456,
|
||||
Method: "evdev.unknownMethod",
|
||||
@@ -91,7 +93,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, m)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 456, resp.ID)
|
||||
@@ -110,7 +112,8 @@ func TestHandleGetState(t *testing.T) {
|
||||
closeChan: make(chan struct{}),
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 789,
|
||||
Method: "evdev.getState",
|
||||
@@ -120,7 +123,7 @@ func TestHandleGetState(t *testing.T) {
|
||||
handleGetState(conn, req, m)
|
||||
|
||||
var resp models.Response[State]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 789, resp.ID)
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/fsnotify/fsnotify"
|
||||
evdev "github.com/holoplot/go-evdev"
|
||||
)
|
||||
|
||||
@@ -2,13 +2,12 @@ package freedesktop
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "freedesktop.getState":
|
||||
handleGetState(conn, req, manager)
|
||||
@@ -33,11 +32,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleSetIconFile(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetIconFile(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
iconPath, err := params.String(req.Params, "path")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -52,7 +51,7 @@ func handleSetIconFile(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "icon file set"})
|
||||
}
|
||||
|
||||
func handleSetRealName(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetRealName(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
name, err := params.String(req.Params, "name")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -67,7 +66,7 @@ func handleSetRealName(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "real name set"})
|
||||
}
|
||||
|
||||
func handleSetEmail(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetEmail(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
email, err := params.String(req.Params, "email")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -82,7 +81,7 @@ func handleSetEmail(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "email set"})
|
||||
}
|
||||
|
||||
func handleSetLanguage(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetLanguage(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
language, err := params.String(req.Params, "language")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -97,7 +96,7 @@ func handleSetLanguage(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "language set"})
|
||||
}
|
||||
|
||||
func handleSetLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetLocation(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
location, err := params.String(req.Params, "location")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -112,7 +111,7 @@ func handleSetLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "location set"})
|
||||
}
|
||||
|
||||
func handleGetUserIconFile(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetUserIconFile(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
username, err := params.String(req.Params, "username")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -128,7 +127,7 @@ func handleGetUserIconFile(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Value: iconFile})
|
||||
}
|
||||
|
||||
func handleGetColorScheme(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetColorScheme(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.updateSettingsState(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -138,7 +137,7 @@ func handleGetColorScheme(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, map[string]uint32{"colorScheme": state.Settings.ColorScheme})
|
||||
}
|
||||
|
||||
func handleSetIconTheme(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetIconTheme(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
iconTheme, err := params.String(req.Params, "iconTheme")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
|
||||
@@ -60,11 +60,12 @@ func mockGetAllAccountsProperties() *dbus.Call {
|
||||
}
|
||||
|
||||
func TestRespondError_Freedesktop(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
models.RespondError(conn, 123, "test error")
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -73,12 +74,13 @@ func TestRespondError_Freedesktop(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRespond_Freedesktop(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
result := models.SuccessResult{Success: true, Message: "test"}
|
||||
models.Respond(conn, 123, result)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -105,13 +107,14 @@ func TestHandleGetState(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "freedesktop.getState"}
|
||||
|
||||
handleGetState(conn, req, manager)
|
||||
|
||||
var resp models.Response[FreedeskState]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -130,7 +133,8 @@ func TestHandleSetIconFile(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setIconFile",
|
||||
@@ -140,7 +144,7 @@ func TestHandleSetIconFile(t *testing.T) {
|
||||
handleSetIconFile(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -163,7 +167,8 @@ func TestHandleSetIconFile(t *testing.T) {
|
||||
accountsObj: mockAccountsObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setIconFile",
|
||||
@@ -175,7 +180,7 @@ func TestHandleSetIconFile(t *testing.T) {
|
||||
handleSetIconFile(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -195,7 +200,8 @@ func TestHandleSetIconFile(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setIconFile",
|
||||
@@ -207,7 +213,7 @@ func TestHandleSetIconFile(t *testing.T) {
|
||||
handleSetIconFile(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -222,7 +228,8 @@ func TestHandleSetRealName(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setRealName",
|
||||
@@ -232,7 +239,7 @@ func TestHandleSetRealName(t *testing.T) {
|
||||
handleSetRealName(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -255,7 +262,8 @@ func TestHandleSetRealName(t *testing.T) {
|
||||
accountsObj: mockAccountsObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setRealName",
|
||||
@@ -267,7 +275,7 @@ func TestHandleSetRealName(t *testing.T) {
|
||||
handleSetRealName(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -285,7 +293,8 @@ func TestHandleSetEmail(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setEmail",
|
||||
@@ -295,7 +304,7 @@ func TestHandleSetEmail(t *testing.T) {
|
||||
handleSetEmail(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -318,7 +327,8 @@ func TestHandleSetEmail(t *testing.T) {
|
||||
accountsObj: mockAccountsObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setEmail",
|
||||
@@ -330,7 +340,7 @@ func TestHandleSetEmail(t *testing.T) {
|
||||
handleSetEmail(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -348,7 +358,8 @@ func TestHandleSetLanguage(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setLanguage",
|
||||
@@ -358,7 +369,7 @@ func TestHandleSetLanguage(t *testing.T) {
|
||||
handleSetLanguage(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -373,7 +384,8 @@ func TestHandleSetLocation(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.setLocation",
|
||||
@@ -383,7 +395,7 @@ func TestHandleSetLocation(t *testing.T) {
|
||||
handleSetLocation(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -398,7 +410,8 @@ func TestHandleGetUserIconFile(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.getUserIconFile",
|
||||
@@ -408,7 +421,7 @@ func TestHandleGetUserIconFile(t *testing.T) {
|
||||
handleGetUserIconFile(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -425,7 +438,8 @@ func TestHandleGetUserIconFile(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.accounts.getUserIconFile",
|
||||
@@ -437,7 +451,7 @@ func TestHandleGetUserIconFile(t *testing.T) {
|
||||
handleGetUserIconFile(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -456,13 +470,14 @@ func TestHandleGetColorScheme(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "freedesktop.settings.getColorScheme"}
|
||||
|
||||
handleGetColorScheme(conn, req, manager)
|
||||
|
||||
var resp models.Response[map[string]uint32]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -487,13 +502,14 @@ func TestHandleGetColorScheme(t *testing.T) {
|
||||
settingsObj: mockSettingsObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "freedesktop.settings.getColorScheme"}
|
||||
|
||||
handleGetColorScheme(conn, req, manager)
|
||||
|
||||
var resp models.Response[map[string]uint32]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -515,7 +531,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
}
|
||||
|
||||
t.Run("unknown method", func(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.unknown",
|
||||
@@ -524,7 +541,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -532,7 +549,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("valid method - getState", func(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "freedesktop.getState",
|
||||
@@ -541,7 +559,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[FreedeskState]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -560,7 +578,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, method := range tests {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: method,
|
||||
@@ -570,7 +589,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
||||
"github.com/AvengeMedia/dankgo/dbusutil"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package location
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
@@ -13,7 +11,7 @@ type LocationEvent struct {
|
||||
Data State `json:"data"`
|
||||
}
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "location.getState":
|
||||
handleGetState(conn, req, manager)
|
||||
@@ -25,11 +23,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
@@ -40,7 +38,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Data: initialState,
|
||||
}
|
||||
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[LocationEvent]{
|
||||
if err := conn.WriteResponse(models.Response[LocationEvent]{
|
||||
ID: req.ID,
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
@@ -52,7 +50,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Type: "state_changed",
|
||||
Data: state,
|
||||
}
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[LocationEvent]{
|
||||
if err := conn.WriteResponse(models.Response[LocationEvent]{
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
return
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"sync"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type State struct {
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
package loginctl
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "loginctl.getState":
|
||||
handleGetState(conn, req, manager)
|
||||
@@ -38,11 +36,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleLock(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleLock(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.Lock(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -50,7 +48,7 @@ func handleLock(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "locked"})
|
||||
}
|
||||
|
||||
func handleUnlock(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleUnlock(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.Unlock(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -58,7 +56,7 @@ func handleUnlock(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "unlocked"})
|
||||
}
|
||||
|
||||
func handleActivate(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleActivate(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.Activate(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -66,7 +64,7 @@ func handleActivate(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "activated"})
|
||||
}
|
||||
|
||||
func handleSetIdleHint(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetIdleHint(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
idle, err := params.Bool(req.Params, "idle")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -80,7 +78,7 @@ func handleSetIdleHint(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "idle hint set"})
|
||||
}
|
||||
|
||||
func handleSetLockedHint(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetLockedHint(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
locked, err := params.Bool(req.Params, "locked")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -94,7 +92,7 @@ func handleSetLockedHint(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "locked hint set"})
|
||||
}
|
||||
|
||||
func handleSetLockBeforeSuspend(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetLockBeforeSuspend(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
enabled, err := params.Bool(req.Params, "enabled")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -105,7 +103,7 @@ func handleSetLockBeforeSuspend(conn net.Conn, req models.Request, manager *Mana
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "lock before suspend set"})
|
||||
}
|
||||
|
||||
func handleSetSleepInhibitorEnabled(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetSleepInhibitorEnabled(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
enabled, err := params.Bool(req.Params, "enabled")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -116,7 +114,7 @@ func handleSetSleepInhibitorEnabled(conn net.Conn, req models.Request, manager *
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "sleep inhibitor setting updated"})
|
||||
}
|
||||
|
||||
func handleLockerReady(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleLockerReady(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
manager.lockTimerMu.Lock()
|
||||
if manager.lockTimer != nil {
|
||||
manager.lockTimer.Stop()
|
||||
@@ -133,7 +131,7 @@ func handleLockerReady(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "ok"})
|
||||
}
|
||||
|
||||
func handleTerminate(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleTerminate(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.Terminate(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -141,7 +139,7 @@ func handleTerminate(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "terminated"})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
@@ -151,7 +149,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Type: EventStateChanged,
|
||||
Data: initialState,
|
||||
}
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[SessionEvent]{
|
||||
if err := conn.WriteResponse(models.Response[SessionEvent]{
|
||||
ID: req.ID,
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
@@ -163,7 +161,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Type: EventStateChanged,
|
||||
Data: state,
|
||||
}
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[SessionEvent]{
|
||||
if err := conn.WriteResponse(models.Response[SessionEvent]{
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
return
|
||||
|
||||
@@ -44,11 +44,12 @@ func (m *mockNetConn) Close() error {
|
||||
}
|
||||
|
||||
func TestRespondError_Loginctl(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
models.RespondError(conn, 123, "test error")
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -57,12 +58,13 @@ func TestRespondError_Loginctl(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRespond_Loginctl(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
result := models.SuccessResult{Success: true, Message: "test"}
|
||||
models.Respond(conn, 123, result)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -85,13 +87,14 @@ func TestHandleGetState(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.getState"}
|
||||
|
||||
handleGetState(conn, req, manager)
|
||||
|
||||
var resp models.Response[SessionState]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -114,12 +117,13 @@ func TestHandleLock(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.lock"}
|
||||
handleLock(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -140,12 +144,13 @@ func TestHandleLock(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.lock"}
|
||||
handleLock(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -165,12 +170,13 @@ func TestHandleUnlock(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.unlock"}
|
||||
handleUnlock(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -191,12 +197,13 @@ func TestHandleUnlock(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.unlock"}
|
||||
handleUnlock(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -216,12 +223,13 @@ func TestHandleActivate(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.activate"}
|
||||
handleActivate(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -242,12 +250,13 @@ func TestHandleActivate(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.activate"}
|
||||
handleActivate(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -262,7 +271,8 @@ func TestHandleSetIdleHint(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "loginctl.setIdleHint",
|
||||
@@ -272,7 +282,7 @@ func TestHandleSetIdleHint(t *testing.T) {
|
||||
handleSetIdleHint(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -290,7 +300,8 @@ func TestHandleSetIdleHint(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "loginctl.setIdleHint",
|
||||
@@ -302,7 +313,7 @@ func TestHandleSetIdleHint(t *testing.T) {
|
||||
handleSetIdleHint(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -323,7 +334,8 @@ func TestHandleSetIdleHint(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "loginctl.setIdleHint",
|
||||
@@ -335,7 +347,7 @@ func TestHandleSetIdleHint(t *testing.T) {
|
||||
handleSetIdleHint(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -355,12 +367,13 @@ func TestHandleTerminate(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.terminate"}
|
||||
handleTerminate(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -381,12 +394,13 @@ func TestHandleTerminate(t *testing.T) {
|
||||
sessionObj: mockSessionObj,
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.terminate"}
|
||||
handleTerminate(conn, req, manager)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -404,7 +418,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
}
|
||||
|
||||
t.Run("unknown method", func(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "loginctl.unknown",
|
||||
@@ -413,7 +428,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -421,7 +436,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("valid method - getState", func(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "loginctl.getState",
|
||||
@@ -430,7 +446,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[SessionState]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -444,7 +460,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
|
||||
manager.sessionObj = mockSessionObj
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "loginctl.lock",
|
||||
@@ -453,7 +470,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -469,7 +486,8 @@ func TestHandleSubscribe(t *testing.T) {
|
||||
stateMutex: sync.RWMutex{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "loginctl.subscribe"}
|
||||
|
||||
done := make(chan bool)
|
||||
@@ -480,11 +498,11 @@ func TestHandleSubscribe(t *testing.T) {
|
||||
|
||||
time.Sleep(50 * time.Millisecond)
|
||||
|
||||
conn.Close()
|
||||
mc.Close()
|
||||
|
||||
if conn.writeBuf.Len() > 0 {
|
||||
if mc.writeBuf.Len() > 0 {
|
||||
var resp models.Response[SessionEvent]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
if err == nil {
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
require.NotNil(t, resp.Result)
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
||||
"github.com/AvengeMedia/dankgo/dbusutil"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package loginctl
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/dbusutil"
|
||||
"github.com/AvengeMedia/dankgo/dbusutil"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ package server
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/matugen"
|
||||
@@ -14,7 +13,7 @@ type MatugenQueueResult struct {
|
||||
Message string `json:"message,omitempty"`
|
||||
}
|
||||
|
||||
func handleMatugenQueue(conn net.Conn, req models.Request) {
|
||||
func handleMatugenQueue(conn *models.Conn, req models.Request) {
|
||||
opts := matugen.Options{
|
||||
StateDir: models.GetOr(req, "stateDir", ""),
|
||||
ShellDir: models.GetOr(req, "shellDir", ""),
|
||||
@@ -70,7 +69,7 @@ func handleMatugenQueue(conn net.Conn, req models.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleMatugenStatus(conn net.Conn, req models.Request) {
|
||||
func handleMatugenStatus(conn *models.Conn, req models.Request) {
|
||||
queue := matugen.GetQueue()
|
||||
models.Respond(conn, req.ID, map[string]bool{
|
||||
"running": queue.IsRunning(),
|
||||
|
||||
@@ -2,11 +2,10 @@ 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"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
type defaultResult struct {
|
||||
@@ -23,7 +22,7 @@ type queryResult struct {
|
||||
Defaults map[string]string `json:"defaults"`
|
||||
}
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request) {
|
||||
switch req.Method {
|
||||
case "mime.getDefault":
|
||||
handleGetDefault(conn, req)
|
||||
@@ -43,7 +42,7 @@ func HandleRequest(conn net.Conn, req models.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetDefault(conn net.Conn, req models.Request) {
|
||||
func handleGetDefault(conn *models.Conn, req models.Request) {
|
||||
mimeType, err := mimeParam(req.Params, "mimeType")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -55,7 +54,7 @@ func handleGetDefault(conn net.Conn, req models.Request) {
|
||||
})
|
||||
}
|
||||
|
||||
func handleSetDefault(conn net.Conn, req models.Request) {
|
||||
func handleSetDefault(conn *models.Conn, req models.Request) {
|
||||
mimeType, err := mimeParam(req.Params, "mimeType")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -73,7 +72,7 @@ func handleSetDefault(conn net.Conn, req models.Request) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
||||
}
|
||||
|
||||
func handleSetDefaults(conn net.Conn, req models.Request) {
|
||||
func handleSetDefaults(conn *models.Conn, req models.Request) {
|
||||
desktopID, err := params.StringNonEmpty(req.Params, "desktopId")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -91,7 +90,7 @@ func handleSetDefaults(conn net.Conn, req models.Request) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true})
|
||||
}
|
||||
|
||||
func handleAppsForMime(conn net.Conn, req models.Request) {
|
||||
func handleAppsForMime(conn *models.Conn, req models.Request) {
|
||||
mimeType, err := mimeParam(req.Params, "mimeType")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -107,7 +106,7 @@ func handleAppsForMime(conn net.Conn, req models.Request) {
|
||||
})
|
||||
}
|
||||
|
||||
func handleQueryDefaults(conn net.Conn, req models.Request) {
|
||||
func handleQueryDefaults(conn *models.Conn, req models.Request) {
|
||||
mimeTypes, err := mimeListParam(req, "mimeTypes")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
type Conn = ipc.ConnWriter
|
||||
|
||||
func NewConn(c net.Conn) *Conn { return ipc.NewConnWriter(c) }
|
||||
|
||||
type Request struct {
|
||||
ID int `json:"id,omitempty"`
|
||||
Method string `json:"method"`
|
||||
@@ -29,15 +33,13 @@ type Response[T any] struct {
|
||||
Error string `json:"error,omitempty"`
|
||||
}
|
||||
|
||||
func RespondError(conn net.Conn, id int, errMsg string) {
|
||||
func RespondError(conn *Conn, id int, errMsg string) {
|
||||
log.Errorf("DMS API Error: id=%d error=%s", id, errMsg)
|
||||
resp := Response[any]{ID: id, Error: errMsg}
|
||||
json.NewEncoder(conn).Encode(resp)
|
||||
_ = conn.WriteResponse(Response[any]{ID: id, Error: errMsg})
|
||||
}
|
||||
|
||||
func Respond[T any](conn net.Conn, id int, result T) {
|
||||
resp := Response[T]{ID: id, Result: &result}
|
||||
json.NewEncoder(conn).Encode(resp)
|
||||
func Respond[T any](conn *Conn, id int, result T) {
|
||||
_ = conn.WriteResponse(Response[T]{ID: id, Result: &result})
|
||||
}
|
||||
|
||||
type SuccessResult struct {
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
package network
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "network.getState":
|
||||
handleGetState(conn, req, manager)
|
||||
@@ -86,7 +84,7 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleCredentialsSubmit(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleCredentialsSubmit(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
token, err := params.String(req.Params, "token")
|
||||
if err != nil {
|
||||
log.Warnf("handleCredentialsSubmit: missing or invalid token parameter")
|
||||
@@ -113,7 +111,7 @@ func handleCredentialsSubmit(conn net.Conn, req models.Request, manager *Manager
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "credentials submitted"})
|
||||
}
|
||||
|
||||
func handleCredentialsCancel(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleCredentialsCancel(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
token, err := params.String(req.Params, "token")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -128,11 +126,11 @@ func handleCredentialsCancel(conn net.Conn, req models.Request, manager *Manager
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "credentials cancelled"})
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleScanWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleScanWiFi(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
device := params.StringOpt(req.Params, "device", "")
|
||||
var err error
|
||||
if device != "" {
|
||||
@@ -147,11 +145,11 @@ func handleScanWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "scanning"})
|
||||
}
|
||||
|
||||
func handleGetWiFiNetworks(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetWiFiNetworks(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetWiFiNetworks())
|
||||
}
|
||||
|
||||
func handleConnectWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleConnectWiFi(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
ssid, err := params.String(req.Params, "ssid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -204,7 +202,7 @@ func handleConnectWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "connecting"})
|
||||
}
|
||||
|
||||
func handleDisconnectWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDisconnectWiFi(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
device := params.StringOpt(req.Params, "device", "")
|
||||
var err error
|
||||
if device != "" {
|
||||
@@ -219,7 +217,7 @@ func handleDisconnectWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "disconnected"})
|
||||
}
|
||||
|
||||
func handleForgetWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleForgetWiFi(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
ssid, err := params.String(req.Params, "ssid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -234,7 +232,7 @@ func handleForgetWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "forgotten"})
|
||||
}
|
||||
|
||||
func handleToggleWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleToggleWiFi(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.ToggleWiFi(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -244,7 +242,7 @@ func handleToggleWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, map[string]bool{"enabled": state.WiFiEnabled})
|
||||
}
|
||||
|
||||
func handleEnableWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleEnableWiFi(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.EnableWiFi(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -252,7 +250,7 @@ func handleEnableWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, map[string]bool{"enabled": true})
|
||||
}
|
||||
|
||||
func handleDisableWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDisableWiFi(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.DisableWiFi(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -260,7 +258,7 @@ func handleDisableWiFi(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, map[string]bool{"enabled": false})
|
||||
}
|
||||
|
||||
func handleConnectEthernetSpecificConfig(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleConnectEthernetSpecificConfig(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
uuid, err := params.String(req.Params, "uuid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -273,7 +271,7 @@ func handleConnectEthernetSpecificConfig(conn net.Conn, req models.Request, mana
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "connecting"})
|
||||
}
|
||||
|
||||
func handleConnectEthernet(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleConnectEthernet(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.ConnectEthernet(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -281,7 +279,7 @@ func handleConnectEthernet(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "connecting"})
|
||||
}
|
||||
|
||||
func handleDisconnectEthernet(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDisconnectEthernet(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
device := params.StringOpt(req.Params, "device", "")
|
||||
var err error
|
||||
if device != "" {
|
||||
@@ -296,7 +294,7 @@ func handleDisconnectEthernet(conn net.Conn, req models.Request, manager *Manage
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "disconnected"})
|
||||
}
|
||||
|
||||
func handleSetPreference(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetPreference(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
preference, err := params.String(req.Params, "preference")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -311,7 +309,7 @@ func handleSetPreference(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, map[string]string{"preference": preference})
|
||||
}
|
||||
|
||||
func handleGetNetworkInfo(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetNetworkInfo(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
ssid, err := params.String(req.Params, "ssid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -327,7 +325,7 @@ func handleGetNetworkInfo(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, network)
|
||||
}
|
||||
|
||||
func handleGetNetworkQRCode(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetNetworkQRCode(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
ssid, err := params.String(req.Params, "ssid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -343,7 +341,7 @@ func handleGetNetworkQRCode(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, content)
|
||||
}
|
||||
|
||||
func handleGetNetworkQRCodeContent(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetNetworkQRCodeContent(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
ssid, err := params.String(req.Params, "ssid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -359,7 +357,7 @@ func handleGetNetworkQRCodeContent(conn net.Conn, req models.Request, manager *M
|
||||
models.Respond(conn, req.ID, content)
|
||||
}
|
||||
|
||||
func handleDeleteQRCode(conn net.Conn, req models.Request, _ *Manager) {
|
||||
func handleDeleteQRCode(conn *models.Conn, req models.Request, _ *Manager) {
|
||||
path, err := params.String(req.Params, "path")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -379,7 +377,7 @@ func handleDeleteQRCode(conn net.Conn, req models.Request, _ *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "QR code file deleted"})
|
||||
}
|
||||
|
||||
func handleGetWiredNetworkInfo(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetWiredNetworkInfo(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
uuid, err := params.String(req.Params, "uuid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -395,7 +393,7 @@ func handleGetWiredNetworkInfo(conn net.Conn, req models.Request, manager *Manag
|
||||
models.Respond(conn, req.ID, network)
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
@@ -405,7 +403,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Type: EventStateChanged,
|
||||
Data: initialState,
|
||||
}
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[NetworkEvent]{
|
||||
if err := conn.WriteResponse(models.Response[NetworkEvent]{
|
||||
ID: req.ID,
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
@@ -417,7 +415,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
Type: EventStateChanged,
|
||||
Data: state,
|
||||
}
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[NetworkEvent]{
|
||||
if err := conn.WriteResponse(models.Response[NetworkEvent]{
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
return
|
||||
@@ -425,7 +423,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleListVPNProfiles(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleListVPNProfiles(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
profiles, err := manager.ListVPNProfiles()
|
||||
if err != nil {
|
||||
log.Warnf("handleListVPNProfiles: failed to list profiles: %v", err)
|
||||
@@ -436,7 +434,7 @@ func handleListVPNProfiles(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, profiles)
|
||||
}
|
||||
|
||||
func handleListActiveVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleListActiveVPN(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
active, err := manager.ListActiveVPN()
|
||||
if err != nil {
|
||||
log.Warnf("handleListActiveVPN: failed to list active VPNs: %v", err)
|
||||
@@ -447,7 +445,7 @@ func handleListActiveVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, active)
|
||||
}
|
||||
|
||||
func handleConnectVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleConnectVPN(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
uuidOrName, ok := params.StringAlt(req.Params, "uuidOrName", "name", "uuid")
|
||||
if !ok {
|
||||
log.Warnf("handleConnectVPN: missing uuidOrName/name/uuid parameter")
|
||||
@@ -466,7 +464,7 @@ func handleConnectVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "VPN connection initiated"})
|
||||
}
|
||||
|
||||
func handleDisconnectVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDisconnectVPN(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
uuidOrName, ok := params.StringAlt(req.Params, "uuidOrName", "name", "uuid")
|
||||
if !ok {
|
||||
log.Warnf("handleDisconnectVPN: missing uuidOrName/name/uuid parameter")
|
||||
@@ -483,7 +481,7 @@ func handleDisconnectVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "VPN disconnected"})
|
||||
}
|
||||
|
||||
func handleDisconnectAllVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDisconnectAllVPN(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.DisconnectAllVPN(); err != nil {
|
||||
log.Warnf("handleDisconnectAllVPN: failed: %v", err)
|
||||
models.RespondError(conn, req.ID, fmt.Sprintf("failed to disconnect all VPNs: %v", err))
|
||||
@@ -493,7 +491,7 @@ func handleDisconnectAllVPN(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "All VPNs disconnected"})
|
||||
}
|
||||
|
||||
func handleClearVPNCredentials(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleClearVPNCredentials(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
uuidOrName, ok := params.StringAlt(req.Params, "uuid", "name", "uuidOrName")
|
||||
if !ok {
|
||||
log.Warnf("handleClearVPNCredentials: missing uuidOrName/name/uuid parameter")
|
||||
@@ -510,7 +508,7 @@ func handleClearVPNCredentials(conn net.Conn, req models.Request, manager *Manag
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "VPN credentials cleared"})
|
||||
}
|
||||
|
||||
func handleSetWiFiAutoconnect(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetWiFiAutoconnect(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
ssid, err := params.String(req.Params, "ssid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -531,7 +529,7 @@ func handleSetWiFiAutoconnect(conn net.Conn, req models.Request, manager *Manage
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "autoconnect updated"})
|
||||
}
|
||||
|
||||
func handleListVPNPlugins(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleListVPNPlugins(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
plugins, err := manager.ListVPNPlugins()
|
||||
if err != nil {
|
||||
log.Warnf("handleListVPNPlugins: failed to list plugins: %v", err)
|
||||
@@ -542,7 +540,7 @@ func handleListVPNPlugins(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, plugins)
|
||||
}
|
||||
|
||||
func handleImportVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleImportVPN(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
filePath, ok := params.StringAlt(req.Params, "file", "path")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing 'file' or 'path' parameter")
|
||||
@@ -561,7 +559,7 @@ func handleImportVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, result)
|
||||
}
|
||||
|
||||
func handleGetVPNConfig(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetVPNConfig(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
uuidOrName, ok := params.StringAlt(req.Params, "uuid", "name", "uuidOrName")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing 'uuid', 'name', or 'uuidOrName' parameter")
|
||||
@@ -578,7 +576,7 @@ func handleGetVPNConfig(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, config)
|
||||
}
|
||||
|
||||
func handleUpdateVPNConfig(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleUpdateVPNConfig(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
connUUID, err := params.String(req.Params, "uuid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -611,7 +609,7 @@ func handleUpdateVPNConfig(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "VPN config updated"})
|
||||
}
|
||||
|
||||
func handleDeleteVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDeleteVPN(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
uuidOrName, ok := params.StringAlt(req.Params, "uuid", "name", "uuidOrName")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing 'uuid', 'name', or 'uuidOrName' parameter")
|
||||
@@ -627,7 +625,7 @@ func handleDeleteVPN(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "VPN deleted"})
|
||||
}
|
||||
|
||||
func handleSetVPNCredentials(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetVPNCredentials(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
connUUID, err := params.String(req.Params, "uuid")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
|
||||
@@ -39,11 +39,12 @@ func (m *mockNetConn) Close() error {
|
||||
}
|
||||
|
||||
func TestRespondError_Network(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
models.RespondError(conn, 123, "test error")
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -52,12 +53,13 @@ func TestRespondError_Network(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRespond_Network(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
result := models.SuccessResult{Success: true, Message: "test"}
|
||||
models.Respond(conn, 123, result)
|
||||
|
||||
var resp models.Response[models.SuccessResult]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -76,13 +78,14 @@ func TestHandleGetState(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "network.getState"}
|
||||
|
||||
handleGetState(conn, req, manager)
|
||||
|
||||
var resp models.Response[NetworkState]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -102,13 +105,14 @@ func TestHandleGetWiFiNetworks(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{ID: 123, Method: "network.wifi.networks"}
|
||||
|
||||
handleGetWiFiNetworks(conn, req, manager)
|
||||
|
||||
var resp models.Response[[]WiFiNetwork]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -124,7 +128,8 @@ func TestHandleConnectWiFi(t *testing.T) {
|
||||
state: &NetworkState{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "network.wifi.connect",
|
||||
@@ -134,7 +139,7 @@ func TestHandleConnectWiFi(t *testing.T) {
|
||||
handleConnectWiFi(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -148,7 +153,8 @@ func TestHandleSetPreference(t *testing.T) {
|
||||
state: &NetworkState{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "network.preference.set",
|
||||
@@ -158,7 +164,7 @@ func TestHandleSetPreference(t *testing.T) {
|
||||
handleSetPreference(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -172,7 +178,8 @@ func TestHandleGetNetworkInfo(t *testing.T) {
|
||||
state: &NetworkState{},
|
||||
}
|
||||
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "network.info",
|
||||
@@ -182,7 +189,7 @@ func TestHandleGetNetworkInfo(t *testing.T) {
|
||||
handleGetNetworkInfo(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -198,7 +205,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
}
|
||||
|
||||
t.Run("unknown method", func(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "network.unknown",
|
||||
@@ -207,7 +215,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -215,7 +223,8 @@ func TestHandleRequest(t *testing.T) {
|
||||
})
|
||||
|
||||
t.Run("valid method - getState", func(t *testing.T) {
|
||||
conn := newMockNetConn()
|
||||
mc := newMockNetConn()
|
||||
conn := models.NewConn(mc)
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
Method: "network.getState",
|
||||
@@ -224,7 +233,7 @@ func TestHandleRequest(t *testing.T) {
|
||||
HandleRequest(conn, req, manager)
|
||||
|
||||
var resp models.Response[NetworkState]
|
||||
err := json.NewDecoder(conn.writeBuf).Decode(&resp)
|
||||
err := json.NewDecoder(mc.writeBuf).Decode(&resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/errdefs"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type SubscriptionBroker struct {
|
||||
|
||||
@@ -3,7 +3,7 @@ package network
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
package params
|
||||
|
||||
import "fmt"
|
||||
|
||||
func Get[T any](params map[string]any, key string) (T, error) {
|
||||
val, ok := params[key].(T)
|
||||
if !ok {
|
||||
var zero T
|
||||
return zero, fmt.Errorf("missing or invalid '%s' parameter", key)
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
func GetOpt[T any](params map[string]any, key string, def T) T {
|
||||
if val, ok := params[key].(T); ok {
|
||||
return val
|
||||
}
|
||||
return def
|
||||
}
|
||||
|
||||
func String(params map[string]any, key string) (string, error) {
|
||||
return Get[string](params, key)
|
||||
}
|
||||
|
||||
func StringNonEmpty(params map[string]any, key string) (string, error) {
|
||||
val, err := Get[string](params, key)
|
||||
if err != nil || val == "" {
|
||||
return "", fmt.Errorf("missing or invalid '%s' parameter", key)
|
||||
}
|
||||
return val, nil
|
||||
}
|
||||
|
||||
func StringOpt(params map[string]any, key string, def string) string {
|
||||
return GetOpt(params, key, def)
|
||||
}
|
||||
|
||||
func Int(params map[string]any, key string) (int, error) {
|
||||
val, err := Get[float64](params, key)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int(val), nil
|
||||
}
|
||||
|
||||
func IntOpt(params map[string]any, key string, def int) int {
|
||||
if val, ok := params[key].(float64); ok {
|
||||
return int(val)
|
||||
}
|
||||
return def
|
||||
}
|
||||
|
||||
func Float(params map[string]any, key string) (float64, error) {
|
||||
return Get[float64](params, key)
|
||||
}
|
||||
|
||||
func FloatOpt(params map[string]any, key string, def float64) float64 {
|
||||
return GetOpt(params, key, def)
|
||||
}
|
||||
|
||||
func Bool(params map[string]any, key string) (bool, error) {
|
||||
return Get[bool](params, key)
|
||||
}
|
||||
|
||||
func BoolOpt(params map[string]any, key string, def bool) bool {
|
||||
return GetOpt(params, key, def)
|
||||
}
|
||||
|
||||
func StringMap(params map[string]any, key string) (map[string]string, error) {
|
||||
rawMap, err := Get[map[string]any](params, key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result := make(map[string]string)
|
||||
for k, v := range rawMap {
|
||||
if str, ok := v.(string); ok {
|
||||
result[k] = str
|
||||
}
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func StringMapOpt(params map[string]any, key string) map[string]string {
|
||||
rawMap, ok := params[key].(map[string]any)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
result := make(map[string]string)
|
||||
for k, v := range rawMap {
|
||||
if str, ok := v.(string); ok {
|
||||
result[k] = str
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func Any(params map[string]any, key string) (any, bool) {
|
||||
val, ok := params[key]
|
||||
return val, ok
|
||||
}
|
||||
|
||||
func AnyMap(params map[string]any, key string) (map[string]any, bool) {
|
||||
val, ok := params[key].(map[string]any)
|
||||
return val, ok
|
||||
}
|
||||
|
||||
func StringAlt(params map[string]any, keys ...string) (string, bool) {
|
||||
for _, key := range keys {
|
||||
if val, ok := params[key].(string); ok {
|
||||
return val, true
|
||||
}
|
||||
}
|
||||
return "", false
|
||||
}
|
||||
@@ -1,154 +0,0 @@
|
||||
package params
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestGet(t *testing.T) {
|
||||
p := map[string]any{"key": "value"}
|
||||
val, err := Get[string](p, "key")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "value", val)
|
||||
|
||||
_, err = Get[string](p, "missing")
|
||||
assert.Error(t, err)
|
||||
|
||||
_, err = Get[int](p, "key")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestGetOpt(t *testing.T) {
|
||||
p := map[string]any{"key": "value"}
|
||||
assert.Equal(t, "value", GetOpt(p, "key", "default"))
|
||||
assert.Equal(t, "default", GetOpt(p, "missing", "default"))
|
||||
}
|
||||
|
||||
func TestString(t *testing.T) {
|
||||
p := map[string]any{"s": "hello", "n": 123}
|
||||
val, err := String(p, "s")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "hello", val)
|
||||
|
||||
_, err = String(p, "n")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestStringNonEmpty(t *testing.T) {
|
||||
p := map[string]any{"s": "hello", "empty": ""}
|
||||
val, err := StringNonEmpty(p, "s")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, "hello", val)
|
||||
|
||||
_, err = StringNonEmpty(p, "empty")
|
||||
assert.Error(t, err)
|
||||
|
||||
_, err = StringNonEmpty(p, "missing")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestStringOpt(t *testing.T) {
|
||||
p := map[string]any{"s": "hello"}
|
||||
assert.Equal(t, "hello", StringOpt(p, "s", "default"))
|
||||
assert.Equal(t, "default", StringOpt(p, "missing", "default"))
|
||||
}
|
||||
|
||||
func TestInt(t *testing.T) {
|
||||
p := map[string]any{"n": float64(42), "s": "str"}
|
||||
val, err := Int(p, "n")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 42, val)
|
||||
|
||||
_, err = Int(p, "s")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestIntOpt(t *testing.T) {
|
||||
p := map[string]any{"n": float64(42)}
|
||||
assert.Equal(t, 42, IntOpt(p, "n", 0))
|
||||
assert.Equal(t, 99, IntOpt(p, "missing", 99))
|
||||
}
|
||||
|
||||
func TestFloat(t *testing.T) {
|
||||
p := map[string]any{"f": 3.14, "s": "str"}
|
||||
val, err := Float(p, "f")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, 3.14, val)
|
||||
|
||||
_, err = Float(p, "s")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestFloatOpt(t *testing.T) {
|
||||
p := map[string]any{"f": 3.14}
|
||||
assert.Equal(t, 3.14, FloatOpt(p, "f", 0))
|
||||
assert.Equal(t, 1.0, FloatOpt(p, "missing", 1.0))
|
||||
}
|
||||
|
||||
func TestBool(t *testing.T) {
|
||||
p := map[string]any{"b": true, "s": "str"}
|
||||
val, err := Bool(p, "b")
|
||||
assert.NoError(t, err)
|
||||
assert.True(t, val)
|
||||
|
||||
_, err = Bool(p, "s")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestBoolOpt(t *testing.T) {
|
||||
p := map[string]any{"b": true}
|
||||
assert.True(t, BoolOpt(p, "b", false))
|
||||
assert.True(t, BoolOpt(p, "missing", true))
|
||||
}
|
||||
|
||||
func TestStringMap(t *testing.T) {
|
||||
p := map[string]any{
|
||||
"m": map[string]any{"a": "1", "b": "2", "c": 3},
|
||||
}
|
||||
val, err := StringMap(p, "m")
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, map[string]string{"a": "1", "b": "2"}, val)
|
||||
|
||||
_, err = StringMap(p, "missing")
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestStringMapOpt(t *testing.T) {
|
||||
p := map[string]any{
|
||||
"m": map[string]any{"a": "1"},
|
||||
}
|
||||
assert.Equal(t, map[string]string{"a": "1"}, StringMapOpt(p, "m"))
|
||||
assert.Nil(t, StringMapOpt(p, "missing"))
|
||||
}
|
||||
|
||||
func TestAny(t *testing.T) {
|
||||
p := map[string]any{"k": 123}
|
||||
val, ok := Any(p, "k")
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, 123, val)
|
||||
|
||||
_, ok = Any(p, "missing")
|
||||
assert.False(t, ok)
|
||||
}
|
||||
|
||||
func TestAnyMap(t *testing.T) {
|
||||
inner := map[string]any{"nested": true}
|
||||
p := map[string]any{"m": inner}
|
||||
val, ok := AnyMap(p, "m")
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, inner, val)
|
||||
|
||||
_, ok = AnyMap(p, "missing")
|
||||
assert.False(t, ok)
|
||||
}
|
||||
|
||||
func TestStringAlt(t *testing.T) {
|
||||
p := map[string]any{"b": "found"}
|
||||
val, ok := StringAlt(p, "a", "b", "c")
|
||||
assert.True(t, ok)
|
||||
assert.Equal(t, "found", val)
|
||||
|
||||
_, ok = StringAlt(p, "x", "y")
|
||||
assert.False(t, ok)
|
||||
}
|
||||
@@ -2,12 +2,11 @@ package plugins
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request) {
|
||||
switch req.Method {
|
||||
case "plugins.list":
|
||||
HandleList(conn, req)
|
||||
|
||||
@@ -12,8 +12,9 @@ import (
|
||||
)
|
||||
|
||||
func TestHandleList(t *testing.T) {
|
||||
conn := net.NewMockConn(t)
|
||||
conn.EXPECT().Write(mock.Anything).Return(0, nil).Maybe()
|
||||
mc := net.NewMockConn(t)
|
||||
conn := models.NewConn(mc)
|
||||
mc.EXPECT().Write(mock.Anything).Return(0, nil).Maybe()
|
||||
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
@@ -25,8 +26,9 @@ func TestHandleList(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHandleListInstalled(t *testing.T) {
|
||||
conn := net.NewMockConn(t)
|
||||
conn.EXPECT().Write(mock.Anything).Return(0, nil).Maybe()
|
||||
mc := net.NewMockConn(t)
|
||||
conn := models.NewConn(mc)
|
||||
mc.EXPECT().Write(mock.Anything).Return(0, nil).Maybe()
|
||||
|
||||
req := models.Request{
|
||||
ID: 123,
|
||||
@@ -38,9 +40,10 @@ func TestHandleListInstalled(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHandleInstallMissingName(t *testing.T) {
|
||||
conn := net.NewMockConn(t)
|
||||
mc := net.NewMockConn(t)
|
||||
conn := models.NewConn(mc)
|
||||
var written []byte
|
||||
conn.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
mc.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
written = b
|
||||
return len(b), nil
|
||||
}).Maybe()
|
||||
@@ -61,9 +64,10 @@ func TestHandleInstallMissingName(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHandleInstallInvalidName(t *testing.T) {
|
||||
conn := net.NewMockConn(t)
|
||||
mc := net.NewMockConn(t)
|
||||
conn := models.NewConn(mc)
|
||||
var written []byte
|
||||
conn.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
mc.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
written = b
|
||||
return len(b), nil
|
||||
}).Maybe()
|
||||
@@ -85,9 +89,10 @@ func TestHandleInstallInvalidName(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHandleUninstallMissingName(t *testing.T) {
|
||||
conn := net.NewMockConn(t)
|
||||
mc := net.NewMockConn(t)
|
||||
conn := models.NewConn(mc)
|
||||
var written []byte
|
||||
conn.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
mc.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
written = b
|
||||
return len(b), nil
|
||||
}).Maybe()
|
||||
@@ -107,9 +112,10 @@ func TestHandleUninstallMissingName(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHandleUpdateMissingName(t *testing.T) {
|
||||
conn := net.NewMockConn(t)
|
||||
mc := net.NewMockConn(t)
|
||||
conn := models.NewConn(mc)
|
||||
var written []byte
|
||||
conn.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
mc.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
written = b
|
||||
return len(b), nil
|
||||
}).Maybe()
|
||||
@@ -129,9 +135,10 @@ func TestHandleUpdateMissingName(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestHandleSearchMissingQuery(t *testing.T) {
|
||||
conn := net.NewMockConn(t)
|
||||
mc := net.NewMockConn(t)
|
||||
conn := models.NewConn(mc)
|
||||
var written []byte
|
||||
conn.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
mc.EXPECT().Write(mock.Anything).RunAndReturn(func(b []byte) (int, error) {
|
||||
written = b
|
||||
return len(b), nil
|
||||
}).Maybe()
|
||||
|
||||
@@ -2,13 +2,12 @@ package plugins
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/plugins"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleInstall(conn net.Conn, req models.Request) {
|
||||
func HandleInstall(conn *models.Conn, req models.Request) {
|
||||
idOrName, ok := models.Get[string](req, "name")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'name' parameter")
|
||||
|
||||
@@ -2,13 +2,12 @@ package plugins
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/plugins"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleList(conn net.Conn, req models.Request) {
|
||||
func HandleList(conn *models.Conn, req models.Request) {
|
||||
registry, err := plugins.NewRegistry()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, fmt.Sprintf("failed to create registry: %v", err))
|
||||
|
||||
@@ -2,13 +2,12 @@ package plugins
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/plugins"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleListInstalled(conn net.Conn, req models.Request) {
|
||||
func HandleListInstalled(conn *models.Conn, req models.Request) {
|
||||
manager, err := plugins.NewManager()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err))
|
||||
|
||||
@@ -2,13 +2,12 @@ package plugins
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/plugins"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleSearch(conn net.Conn, req models.Request) {
|
||||
func HandleSearch(conn *models.Conn, req models.Request) {
|
||||
query, ok := models.Get[string](req, "query")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'query' parameter")
|
||||
|
||||
@@ -2,13 +2,12 @@ package plugins
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/plugins"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleUninstall(conn net.Conn, req models.Request) {
|
||||
func HandleUninstall(conn *models.Conn, req models.Request) {
|
||||
name, ok := models.Get[string](req, "name")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'name' parameter")
|
||||
|
||||
@@ -2,13 +2,12 @@ package plugins
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/plugins"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleUpdate(conn net.Conn, req models.Request) {
|
||||
func HandleUpdate(conn *models.Conn, req models.Request) {
|
||||
name, ok := models.Get[string](req, "name")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'name' parameter")
|
||||
|
||||
@@ -2,7 +2,6 @@ package server
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/apppicker"
|
||||
@@ -28,7 +27,7 @@ import (
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/wlroutput"
|
||||
)
|
||||
|
||||
func RouteRequest(conn net.Conn, req models.Request) {
|
||||
func RouteRequest(conn *models.Conn, req models.Request) {
|
||||
if strings.HasPrefix(req.Method, "network.") {
|
||||
if networkManager == nil {
|
||||
models.RespondError(conn, req.ID, "network manager not initialized")
|
||||
@@ -223,7 +222,7 @@ func RouteRequest(conn net.Conn, req models.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleClipboardSetConfig(conn net.Conn, req models.Request) {
|
||||
func handleClipboardSetConfig(conn *models.Conn, req models.Request) {
|
||||
cfg := clipboard.LoadConfig()
|
||||
|
||||
if v, ok := models.Get[float64](req, "maxHistory"); ok {
|
||||
|
||||
+57
-125
@@ -1,19 +1,12 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/json"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation"
|
||||
@@ -39,7 +32,9 @@ import (
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/wayland"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/wlcontext"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/wlroutput"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/ipc"
|
||||
"github.com/AvengeMedia/dankgo/paths"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
const APIVersion = 28
|
||||
@@ -88,74 +83,10 @@ var capabilitySubscribers syncmap.Map[string, chan ServerInfo]
|
||||
var cupsSubscribers syncmap.Map[string, bool]
|
||||
var cupsSubscriberCount atomic.Int32
|
||||
|
||||
func getSocketDir() string {
|
||||
if runtime := os.Getenv("XDG_RUNTIME_DIR"); runtime != "" {
|
||||
return runtime
|
||||
}
|
||||
|
||||
if os.Getuid() == 0 {
|
||||
if _, err := os.Stat("/run"); err == nil {
|
||||
return "/run/dankdots"
|
||||
}
|
||||
return "/var/run/dankdots"
|
||||
}
|
||||
|
||||
return os.TempDir()
|
||||
}
|
||||
var appPaths = paths.New("danklinux")
|
||||
|
||||
func GetSocketPath() string {
|
||||
return filepath.Join(getSocketDir(), fmt.Sprintf("danklinux-%d.sock", os.Getpid()))
|
||||
}
|
||||
|
||||
func FindSocket() (string, error) {
|
||||
dir := getSocketDir()
|
||||
entries, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
for _, entry := range entries {
|
||||
if strings.HasPrefix(entry.Name(), "danklinux-") && strings.HasSuffix(entry.Name(), ".sock") {
|
||||
return filepath.Join(dir, entry.Name()), nil
|
||||
}
|
||||
}
|
||||
return "", fmt.Errorf("no dms socket found")
|
||||
}
|
||||
|
||||
func cleanupStaleSockets() {
|
||||
dir := getSocketDir()
|
||||
entries, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, entry := range entries {
|
||||
if !strings.HasPrefix(entry.Name(), "danklinux-") || !strings.HasSuffix(entry.Name(), ".sock") {
|
||||
continue
|
||||
}
|
||||
|
||||
pidStr := strings.TrimPrefix(entry.Name(), "danklinux-")
|
||||
pidStr = strings.TrimSuffix(pidStr, ".sock")
|
||||
pid, err := strconv.Atoi(pidStr)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
process, err := os.FindProcess(pid)
|
||||
if err != nil {
|
||||
socketPath := filepath.Join(dir, entry.Name())
|
||||
os.Remove(socketPath)
|
||||
log.Debugf("Removed stale socket: %s", socketPath)
|
||||
continue
|
||||
}
|
||||
|
||||
err = process.Signal(syscall.Signal(0))
|
||||
if err != nil {
|
||||
socketPath := filepath.Join(dir, entry.Name())
|
||||
os.Remove(socketPath)
|
||||
log.Debugf("Removed stale socket: %s", socketPath)
|
||||
}
|
||||
}
|
||||
return appPaths.SocketPath()
|
||||
}
|
||||
|
||||
func InitializeNetworkManager() error {
|
||||
@@ -397,36 +328,21 @@ func InitializeSysUpdateManager() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleConnection(conn net.Conn) {
|
||||
defer conn.Close()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Errorf("handleConnection panic recovered: panic=%v\n%s", r, debug.Stack())
|
||||
}
|
||||
}()
|
||||
func routeHandler(_ context.Context, conn *models.Conn, req ipc.Request, _ *ipc.Subscriber) {
|
||||
routeRequestRecovered(conn, models.Request(req))
|
||||
}
|
||||
|
||||
caps := getCapabilities()
|
||||
capsData, _ := json.Marshal(caps)
|
||||
conn.Write(capsData)
|
||||
conn.Write([]byte("\n"))
|
||||
scanner := bufio.NewScanner(conn)
|
||||
scanner.Buffer(make([]byte, bufio.MaxScanTokenSize), 64*1024*1024) // grow up to 64 MB for large clipboard payloads
|
||||
for scanner.Scan() {
|
||||
line := scanner.Bytes()
|
||||
|
||||
var req models.Request
|
||||
if err := json.Unmarshal(line, &req); err != nil {
|
||||
log.Warnf("handleConnection: Failed to unmarshal JSON: %v, line: %s", err, string(line))
|
||||
models.RespondError(conn, 0, "invalid json")
|
||||
continue
|
||||
}
|
||||
|
||||
go routeRequestRecovered(conn, req)
|
||||
func subscribeHandler(_ context.Context, conn *models.Conn, req ipc.Request, _ *ipc.Subscriber) {
|
||||
switch req.Method {
|
||||
case "subscribe":
|
||||
routeRequestRecovered(conn, models.Request(req))
|
||||
default:
|
||||
models.RespondError(conn, req.ID, fmt.Sprintf("unknown method: %s", req.Method))
|
||||
}
|
||||
}
|
||||
|
||||
// routeRequestRecovered keeps a panicking handler from taking down the whole daemon
|
||||
func routeRequestRecovered(conn net.Conn, req models.Request) {
|
||||
func routeRequestRecovered(conn *models.Conn, req models.Request) {
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
log.Errorf("RouteRequest panic recovered: method=%s panic=%v\n%s", req.Method, r, debug.Stack())
|
||||
@@ -595,7 +511,7 @@ func notifyCapabilityChange() {
|
||||
})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request) {
|
||||
clientID := fmt.Sprintf("meta-client-%p", conn)
|
||||
|
||||
dbusClient := dbusClientID
|
||||
@@ -1300,7 +1216,7 @@ func handleSubscribe(conn net.Conn, req models.Request) {
|
||||
}()
|
||||
|
||||
info := getServerInfo()
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[ServiceEvent]{
|
||||
if err := conn.WriteResponse(models.Response[ServiceEvent]{
|
||||
ID: req.ID,
|
||||
Result: &ServiceEvent{Service: "server", Data: info},
|
||||
}); err != nil {
|
||||
@@ -1309,7 +1225,7 @@ func handleSubscribe(conn net.Conn, req models.Request) {
|
||||
}
|
||||
|
||||
for event := range eventChan {
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[ServiceEvent]{
|
||||
if err := conn.WriteResponse(models.Response[ServiceEvent]{
|
||||
ID: req.ID,
|
||||
Result: &event,
|
||||
}); err != nil {
|
||||
@@ -1382,8 +1298,39 @@ func cleanupManagers() {
|
||||
}
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
ipc *ipc.Server
|
||||
}
|
||||
|
||||
func New() *Server {
|
||||
return &Server{ipc: ipc.NewServer(ipc.Config{
|
||||
AppName: appPaths.Name,
|
||||
APIVersion: APIVersion,
|
||||
CapabilitiesFunc: func() []string { return getCapabilities().Capabilities },
|
||||
MaxLineSize: 64 * 1024 * 1024, // large clipboard payloads
|
||||
SubscribeHandler: subscribeHandler,
|
||||
}, routeHandler)}
|
||||
}
|
||||
|
||||
func (s *Server) Listen() error { return s.ipc.Listen() }
|
||||
|
||||
func (s *Server) SocketPath() string { return s.ipc.SocketPath() }
|
||||
|
||||
func (s *Server) Close() {
|
||||
s.ipc.Close()
|
||||
}
|
||||
|
||||
func Start(printDocs bool) error {
|
||||
cleanupStaleSockets()
|
||||
s := New()
|
||||
if err := s.Listen(); err != nil {
|
||||
return err
|
||||
}
|
||||
return s.Serve(printDocs)
|
||||
}
|
||||
|
||||
func (s *Server) Serve(printDocs bool) error {
|
||||
defer s.ipc.Close()
|
||||
defer cleanupManagers()
|
||||
|
||||
// Tailscale manager always starts — reconnects internally via WatchIPNBus.
|
||||
// The capability is only advertised once tailscaled is reachable; the
|
||||
@@ -1393,17 +1340,7 @@ func Start(printDocs bool) error {
|
||||
notifyCapabilityChange()
|
||||
})
|
||||
|
||||
socketPath := GetSocketPath()
|
||||
os.Remove(socketPath)
|
||||
|
||||
listener, err := net.Listen("unix", socketPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer listener.Close()
|
||||
defer cleanupManagers()
|
||||
|
||||
log.Infof("DMS API Server listening on: %s", socketPath)
|
||||
log.Infof("DMS API Server listening on: %s", s.ipc.SocketPath())
|
||||
log.Infof("API Version: %d", APIVersion)
|
||||
log.Info("Protocol: JSON over Unix socket")
|
||||
log.Info("Request format: {\"id\": <any>, \"method\": \"...\", \"params\": {...}}")
|
||||
@@ -1768,21 +1705,16 @@ func Start(printDocs bool) error {
|
||||
log.Info("")
|
||||
log.Infof("Ready! Capabilities: %v", getCapabilities().Capabilities)
|
||||
|
||||
listenerErrChan := make(chan error, 1)
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
serveErrChan := make(chan error, 1)
|
||||
go func() {
|
||||
for {
|
||||
conn, err := listener.Accept()
|
||||
if err != nil {
|
||||
listenerErrChan <- err
|
||||
return
|
||||
}
|
||||
go handleConnection(conn)
|
||||
}
|
||||
serveErrChan <- s.ipc.Serve(ctx)
|
||||
}()
|
||||
|
||||
select {
|
||||
case err := <-listenerErrChan:
|
||||
case err := <-serveErrChan:
|
||||
return err
|
||||
case err := <-fatalErrChan:
|
||||
return err
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
@@ -14,32 +13,6 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestGetSocketDir(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
xdgRuntimeDir string
|
||||
uid int
|
||||
expectedSubstr string
|
||||
}{
|
||||
{
|
||||
name: "uses XDG_RUNTIME_DIR when set",
|
||||
xdgRuntimeDir: "/run/user/1000",
|
||||
expectedSubstr: "/run/user/1000",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if tt.xdgRuntimeDir != "" {
|
||||
t.Setenv("XDG_RUNTIME_DIR", tt.xdgRuntimeDir)
|
||||
}
|
||||
|
||||
result := getSocketDir()
|
||||
assert.Contains(t, result, tt.expectedSubstr)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetSocketPath(t *testing.T) {
|
||||
path := GetSocketPath()
|
||||
assert.Contains(t, path, "danklinux-")
|
||||
@@ -81,11 +54,11 @@ func (m *mockConn) Close() error {
|
||||
}
|
||||
|
||||
func TestRespondError(t *testing.T) {
|
||||
conn := &mockConn{}
|
||||
models.RespondError(conn, 123, "test error")
|
||||
mc := &mockConn{}
|
||||
models.RespondError(models.NewConn(mc), 123, "test error")
|
||||
|
||||
var resp models.Response[any]
|
||||
err := json.Unmarshal(conn.written, &resp)
|
||||
err := json.Unmarshal(mc.written, &resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -94,12 +67,12 @@ func TestRespondError(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestRespond(t *testing.T) {
|
||||
conn := &mockConn{}
|
||||
mc := &mockConn{}
|
||||
result := map[string]string{"foo": "bar"}
|
||||
models.Respond(conn, 123, result)
|
||||
models.Respond(models.NewConn(mc), 123, result)
|
||||
|
||||
var resp models.Response[map[string]string]
|
||||
err := json.Unmarshal(conn.written, &resp)
|
||||
err := json.Unmarshal(mc.written, &resp)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, 123, resp.ID)
|
||||
@@ -157,24 +130,3 @@ func TestResponse_JSON(t *testing.T) {
|
||||
assert.Nil(t, decoded.Result)
|
||||
})
|
||||
}
|
||||
|
||||
func TestCleanupStaleSockets(t *testing.T) {
|
||||
tempDir := t.TempDir()
|
||||
t.Setenv("XDG_RUNTIME_DIR", tempDir)
|
||||
|
||||
staleSocket := filepath.Join(tempDir, "danklinux-4194305.sock")
|
||||
err := os.WriteFile(staleSocket, []byte{}, 0o600)
|
||||
require.NoError(t, err)
|
||||
|
||||
activeSocket := filepath.Join(tempDir, fmt.Sprintf("danklinux-%d.sock", os.Getpid()))
|
||||
err = os.WriteFile(activeSocket, []byte{}, 0o600)
|
||||
require.NoError(t, err)
|
||||
|
||||
cleanupStaleSockets()
|
||||
|
||||
_, err = os.Stat(staleSocket)
|
||||
assert.True(t, os.IsNotExist(err))
|
||||
|
||||
_, err = os.Stat(activeSocket)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,11 @@
|
||||
package sysupdate
|
||||
|
||||
import (
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, m *Manager) {
|
||||
switch req.Method {
|
||||
case "sysupdate.getState":
|
||||
models.Respond(conn, req.ID, m.GetState())
|
||||
@@ -39,7 +37,7 @@ func HandleRequest(conn net.Conn, req models.Request, m *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleUpgrade(conn net.Conn, req models.Request, m *Manager) {
|
||||
func handleUpgrade(conn *models.Conn, req models.Request, m *Manager) {
|
||||
opts := UpgradeOptions{
|
||||
IncludeFlatpak: params.BoolOpt(req.Params, "includeFlatpak", true),
|
||||
IncludeAUR: params.BoolOpt(req.Params, "includeAUR", true),
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -2,13 +2,12 @@ package tailscale
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
// HandleRequest routes an IPC request to the appropriate handler.
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
switch req.Method {
|
||||
case "tailscale.getStatus":
|
||||
handleGetStatus(conn, req, manager)
|
||||
@@ -27,17 +26,17 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetStatus(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetStatus(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
state := manager.GetState()
|
||||
models.Respond(conn, req.ID, state)
|
||||
}
|
||||
|
||||
func handleRefresh(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleRefresh(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
manager.RefreshState()
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "refreshed"})
|
||||
}
|
||||
|
||||
func handleConnect(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleConnect(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.Connect(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -45,7 +44,7 @@ func handleConnect(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "connected"})
|
||||
}
|
||||
|
||||
func handleDisconnect(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleDisconnect(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if err := manager.Disconnect(); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
return
|
||||
@@ -53,7 +52,7 @@ func handleDisconnect(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "disconnected"})
|
||||
}
|
||||
|
||||
func handleSetExitNode(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetExitNode(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
id := models.GetOr(req, "id", "")
|
||||
if err := manager.SetExitNode(id); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -62,7 +61,7 @@ func handleSetExitNode(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "exit node updated"})
|
||||
}
|
||||
|
||||
func handleSetAllowLanAccess(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetAllowLanAccess(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
enabled := models.GetOr(req, "enabled", false)
|
||||
if err := manager.SetAllowLANAccess(enabled); err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
|
||||
@@ -47,7 +47,7 @@ func TestHandleGetStatus(t *testing.T) {
|
||||
defer m.Close()
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "tailscale.getStatus"}
|
||||
handleGetStatus(conn, req, m)
|
||||
@@ -66,7 +66,7 @@ func TestHandleRefresh(t *testing.T) {
|
||||
defer m.Close()
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "tailscale.refresh"}
|
||||
handleRefresh(conn, req, m)
|
||||
@@ -98,7 +98,7 @@ func TestHandleActions(t *testing.T) {
|
||||
defer m.Close()
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: tc.method, Params: tc.params}
|
||||
HandleRequest(conn, req, m)
|
||||
@@ -125,7 +125,7 @@ func TestHandleAction_BackendError(t *testing.T) {
|
||||
defer m.Close()
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "tailscale.connect"}
|
||||
HandleRequest(conn, req, m)
|
||||
@@ -141,7 +141,7 @@ func TestHandleRequest_UnknownMethod(t *testing.T) {
|
||||
defer m.Close()
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
conn := &mockConn{Buffer: buf}
|
||||
conn := models.NewConn(&mockConn{Buffer: buf})
|
||||
|
||||
req := models.Request{ID: 1, Method: "tailscale.unknownMethod"}
|
||||
HandleRequest(conn, req, m)
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"tailscale.com/client/local"
|
||||
"tailscale.com/ipn"
|
||||
"tailscale.com/ipn/ipnstate"
|
||||
@@ -133,7 +133,7 @@ func (m *Manager) watchLoop(ctx context.Context) {
|
||||
break
|
||||
}
|
||||
|
||||
if notify.State == nil && notify.NetMap == nil {
|
||||
if notify.State == nil && notify.NetMap == nil { //nolint:staticcheck // NetMap is deprecated upstream but still the only activity signal on some platforms
|
||||
continue
|
||||
}
|
||||
select {
|
||||
|
||||
@@ -1,15 +1,13 @@
|
||||
package thememode
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if manager == nil {
|
||||
models.RespondError(conn, req.ID, "theme mode manager not initialized")
|
||||
return
|
||||
@@ -37,11 +35,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleSetEnabled(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetEnabled(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
enabled, err := params.Bool(req.Params, "enabled")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -52,7 +50,7 @@ func handleSetEnabled(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "theme auto enabled set"})
|
||||
}
|
||||
|
||||
func handleSetMode(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetMode(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
mode, err := params.String(req.Params, "mode")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -68,7 +66,7 @@ func handleSetMode(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "theme auto mode set"})
|
||||
}
|
||||
|
||||
func handleSetSchedule(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetSchedule(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
startHour, err := params.Int(req.Params, "startHour")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -99,7 +97,7 @@ func handleSetSchedule(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleSetLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetLocation(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
lat, err := params.Float(req.Params, "latitude")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -115,7 +113,7 @@ func handleSetLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "theme auto location set"})
|
||||
}
|
||||
|
||||
func handleSetUseIPLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetUseIPLocation(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
use, err := params.Bool(req.Params, "use")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -126,18 +124,18 @@ func handleSetUseIPLocation(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "theme auto IP location set"})
|
||||
}
|
||||
|
||||
func handleTrigger(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleTrigger(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
manager.TriggerUpdate()
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "theme auto update triggered"})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
|
||||
initialState := manager.GetState()
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &initialState,
|
||||
}); err != nil {
|
||||
@@ -145,7 +143,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
|
||||
for state := range stateChan {
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
Result: &state,
|
||||
}); err != nil {
|
||||
return
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/loginctl"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/wayland"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -2,12 +2,11 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request) {
|
||||
switch req.Method {
|
||||
case "themes.list":
|
||||
HandleList(conn, req)
|
||||
|
||||
@@ -2,13 +2,12 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/themes"
|
||||
)
|
||||
|
||||
func HandleInstall(conn net.Conn, req models.Request) {
|
||||
func HandleInstall(conn *models.Conn, req models.Request) {
|
||||
idOrName, ok := models.Get[string](req, "name")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'name' parameter")
|
||||
|
||||
@@ -2,14 +2,13 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/themes"
|
||||
)
|
||||
|
||||
func HandleList(conn net.Conn, req models.Request) {
|
||||
func HandleList(conn *models.Conn, req models.Request) {
|
||||
registry, err := themes.NewRegistry()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, fmt.Sprintf("failed to create registry: %v", err))
|
||||
|
||||
@@ -2,7 +2,6 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/themes"
|
||||
@@ -79,7 +78,7 @@ func addVariantsInfo(info *ThemeInfo, variants *themes.ThemeVariants) {
|
||||
}
|
||||
}
|
||||
|
||||
func HandleListInstalled(conn net.Conn, req models.Request) {
|
||||
func HandleListInstalled(conn *models.Conn, req models.Request) {
|
||||
manager, err := themes.NewManager()
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, fmt.Sprintf("failed to create manager: %v", err))
|
||||
|
||||
@@ -2,13 +2,12 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/themes"
|
||||
)
|
||||
|
||||
func HandleSearch(conn net.Conn, req models.Request) {
|
||||
func HandleSearch(conn *models.Conn, req models.Request) {
|
||||
query, ok := models.Get[string](req, "query")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'query' parameter")
|
||||
|
||||
@@ -2,13 +2,12 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/themes"
|
||||
)
|
||||
|
||||
func HandleUninstall(conn net.Conn, req models.Request) {
|
||||
func HandleUninstall(conn *models.Conn, req models.Request) {
|
||||
idOrName, ok := models.Get[string](req, "name")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'name' parameter")
|
||||
|
||||
@@ -2,13 +2,12 @@ package themes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/themes"
|
||||
)
|
||||
|
||||
func HandleUpdate(conn net.Conn, req models.Request) {
|
||||
func HandleUpdate(conn *models.Conn, req models.Request) {
|
||||
idOrName, ok := models.Get[string](req, "name")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'name' parameter")
|
||||
|
||||
@@ -3,13 +3,12 @@ package wallpaper
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if manager == nil {
|
||||
models.RespondError(conn, req.ID, "wallpaper manager not initialized")
|
||||
return
|
||||
@@ -29,11 +28,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleSetConfig(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetConfig(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
raw, ok := params.Any(req.Params, "config")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing or invalid 'config' parameter")
|
||||
@@ -56,18 +55,18 @@ func handleSetConfig(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "wallpaper schedule set"})
|
||||
}
|
||||
|
||||
func handleTrigger(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleTrigger(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
manager.ResetSchedule(params.StringOpt(req.Params, "target", ""))
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "wallpaper schedule reset"})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
|
||||
initialState := manager.GetState()
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &initialState,
|
||||
}); err != nil {
|
||||
@@ -75,7 +74,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
|
||||
for state := range stateChan {
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
Result: &state,
|
||||
}); err != nil {
|
||||
return
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/loginctl"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type activeSchedule struct {
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
package wayland
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/models"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/server/params"
|
||||
"github.com/AvengeMedia/dankgo/ipc/params"
|
||||
)
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if manager == nil {
|
||||
models.RespondError(conn, req.ID, "wayland manager not initialized")
|
||||
return
|
||||
@@ -38,11 +36,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleSetTemperature(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetTemperature(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
var lowTemp, highTemp int
|
||||
|
||||
if temp, ok := models.Get[float64](req, "temp"); ok {
|
||||
@@ -71,7 +69,7 @@ func handleSetTemperature(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "temperature set"})
|
||||
}
|
||||
|
||||
func handleSetLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetLocation(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
lat, err := params.Float(req.Params, "latitude")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -92,7 +90,7 @@ func handleSetLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "location set"})
|
||||
}
|
||||
|
||||
func handleSetManualTimes(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetManualTimes(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
sunriseStr, sunriseOK := models.Get[string](req, "sunrise")
|
||||
sunsetStr, sunsetOK := models.Get[string](req, "sunset")
|
||||
|
||||
@@ -122,7 +120,7 @@ func handleSetManualTimes(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "manual times set"})
|
||||
}
|
||||
|
||||
func handleSetUseIPLocation(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetUseIPLocation(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
use, err := params.Bool(req.Params, "use")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -133,7 +131,7 @@ func handleSetUseIPLocation(conn net.Conn, req models.Request, manager *Manager)
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "IP location preference set"})
|
||||
}
|
||||
|
||||
func handleSetGamma(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetGamma(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
gamma, err := params.Float(req.Params, "gamma")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -148,7 +146,7 @@ func handleSetGamma(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "gamma set"})
|
||||
}
|
||||
|
||||
func handleSetEnabled(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSetEnabled(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
enabled, err := params.Bool(req.Params, "enabled")
|
||||
if err != nil {
|
||||
models.RespondError(conn, req.ID, err.Error())
|
||||
@@ -159,13 +157,13 @@ func handleSetEnabled(conn net.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "enabled state set"})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
|
||||
initialState := manager.GetState()
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &initialState,
|
||||
}); err != nil {
|
||||
@@ -173,7 +171,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
|
||||
for state := range stateChan {
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
Result: &state,
|
||||
}); err != nil {
|
||||
return
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/errdefs"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/geolocation"
|
||||
wlclient "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
"github.com/godbus/dbus/v5"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ package wlroutput
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/log"
|
||||
@@ -31,7 +30,7 @@ type ConfigurationRequest struct {
|
||||
Test bool `json:"test"`
|
||||
}
|
||||
|
||||
func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func HandleRequest(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
if manager == nil {
|
||||
models.RespondError(conn, req.ID, "wlroutput manager not initialized")
|
||||
return
|
||||
@@ -51,11 +50,11 @@ func HandleRequest(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
}
|
||||
|
||||
func handleGetState(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleGetState(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
models.Respond(conn, req.ID, manager.GetState())
|
||||
}
|
||||
|
||||
func handleApplyConfiguration(conn net.Conn, req models.Request, manager *Manager, test bool) {
|
||||
func handleApplyConfiguration(conn *models.Conn, req models.Request, manager *Manager, test bool) {
|
||||
headsParam, ok := models.Get[any](req, "heads")
|
||||
if !ok {
|
||||
models.RespondError(conn, req.ID, "missing 'heads' parameter")
|
||||
@@ -86,13 +85,13 @@ func handleApplyConfiguration(conn net.Conn, req models.Request, manager *Manage
|
||||
models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: msg})
|
||||
}
|
||||
|
||||
func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
func handleSubscribe(conn *models.Conn, req models.Request, manager *Manager) {
|
||||
clientID := fmt.Sprintf("client-%p", conn)
|
||||
stateChan := manager.Subscribe(clientID)
|
||||
defer manager.Unsubscribe(clientID)
|
||||
|
||||
initialState := manager.GetState()
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
ID: req.ID,
|
||||
Result: &initialState,
|
||||
}); err != nil {
|
||||
@@ -100,7 +99,7 @@ func handleSubscribe(conn net.Conn, req models.Request, manager *Manager) {
|
||||
}
|
||||
|
||||
for state := range stateChan {
|
||||
if err := json.NewEncoder(conn).Encode(models.Response[State]{
|
||||
if err := conn.WriteResponse(models.Response[State]{
|
||||
Result: &state,
|
||||
}); err != nil {
|
||||
return
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/internal/proto/wlr_output_management"
|
||||
wlclient "github.com/AvengeMedia/DankMaterialShell/core/pkg/go-wayland/wayland/client"
|
||||
"github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap"
|
||||
"github.com/AvengeMedia/dankgo/syncmap"
|
||||
)
|
||||
|
||||
type OutputMode struct {
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
//go:build !withshell
|
||||
|
||||
package shellembed
|
||||
|
||||
import "embed"
|
||||
|
||||
// Untagged builds (tests, vet, plain `go build`) carry no embedded UI;
|
||||
// config resolution then requires an explicit shell dir.
|
||||
var distFS embed.FS
|
||||
@@ -0,0 +1,12 @@
|
||||
//go:build withshell
|
||||
|
||||
package shellembed
|
||||
|
||||
import "embed"
|
||||
|
||||
// dist is populated from the repo's quickshell/ tree by `make sync-shell`
|
||||
// before any tagged build; it is never committed. all: keeps the .dankrev
|
||||
// revision key, which go:embed would otherwise skip as a dotfile.
|
||||
//
|
||||
//go:embed all:dist
|
||||
var distFS embed.FS
|
||||
@@ -0,0 +1,36 @@
|
||||
// Package shellembed carries the quickshell UI inside the dms binary and
|
||||
// materializes it at runtime via dankgo/shellapp/shellfs, since quickshell
|
||||
// needs a real filesystem path. Customization goes through -c /
|
||||
// DMS_SHELL_DIR instead of editing the extraction.
|
||||
package shellembed
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"path"
|
||||
|
||||
"github.com/AvengeMedia/dankgo/shellapp/shellfs"
|
||||
)
|
||||
|
||||
const (
|
||||
distRoot = "dist"
|
||||
shellEntry = "shell.qml"
|
||||
)
|
||||
|
||||
// Available reports whether this binary was built with the embedded UI
|
||||
// (the withshell build tag).
|
||||
func Available() bool {
|
||||
info, err := fs.Stat(distFS, path.Join(distRoot, shellEntry))
|
||||
return err == nil && !info.IsDir()
|
||||
}
|
||||
|
||||
func Extract(baseDir string) (string, error) {
|
||||
sub, err := fs.Sub(distFS, distRoot)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return shellfs.Extract(sub, baseDir)
|
||||
}
|
||||
|
||||
func Prune(baseDir, keep string) {
|
||||
shellfs.Prune(baseDir, keep)
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package shellembed
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func benchDir(b *testing.B) string {
|
||||
b.Helper()
|
||||
dir, err := os.MkdirTemp("", "shellembed-bench-")
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
b.Cleanup(func() {
|
||||
filepath.WalkDir(dir, func(p string, d os.DirEntry, err error) error {
|
||||
if err == nil && d.IsDir() {
|
||||
os.Chmod(p, 0o755)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
os.RemoveAll(dir)
|
||||
})
|
||||
return dir
|
||||
}
|
||||
|
||||
func BenchmarkExtractWarm(b *testing.B) {
|
||||
if !Available() {
|
||||
b.Skip("no embedded UI in this build")
|
||||
}
|
||||
base := benchDir(b)
|
||||
if _, err := Extract(base); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
b.ResetTimer()
|
||||
for b.Loop() {
|
||||
if _, err := Extract(base); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkExtractCold(b *testing.B) {
|
||||
if !Available() {
|
||||
b.Skip("no embedded UI in this build")
|
||||
}
|
||||
for b.Loop() {
|
||||
if _, err := Extract(benchDir(b)); err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package shellembed
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestAvailableFalseWithoutTag(t *testing.T) {
|
||||
if Available() {
|
||||
t.Fatal("Available() should be false in untagged test builds")
|
||||
}
|
||||
}
|
||||
@@ -4,39 +4,19 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/AvengeMedia/dankgo/paths"
|
||||
)
|
||||
|
||||
func XDGStateHome() string {
|
||||
if dir := os.Getenv("XDG_STATE_HOME"); dir != "" {
|
||||
return dir
|
||||
}
|
||||
home, _ := os.UserHomeDir()
|
||||
return filepath.Join(home, ".local", "state")
|
||||
}
|
||||
func XDGStateHome() string { return paths.XDGStateHome() }
|
||||
|
||||
func XDGDataHome() string {
|
||||
if dir := os.Getenv("XDG_DATA_HOME"); dir != "" {
|
||||
return dir
|
||||
}
|
||||
home, _ := os.UserHomeDir()
|
||||
return filepath.Join(home, ".local", "share")
|
||||
}
|
||||
func XDGDataHome() string { return paths.XDGDataHome() }
|
||||
|
||||
func XDGCacheHome() string {
|
||||
if dir, err := os.UserCacheDir(); err == nil {
|
||||
return dir
|
||||
}
|
||||
home, _ := os.UserHomeDir()
|
||||
return filepath.Join(home, ".cache")
|
||||
}
|
||||
func XDGCacheHome() string { return paths.XDGCacheHome() }
|
||||
|
||||
func XDGConfigHome() string {
|
||||
if dir, err := os.UserConfigDir(); err == nil {
|
||||
return dir
|
||||
}
|
||||
home, _ := os.UserHomeDir()
|
||||
return filepath.Join(home, ".config")
|
||||
}
|
||||
func XDGConfigHome() string { return paths.XDGConfigHome() }
|
||||
|
||||
func ExpandPath(path string) (string, error) { return paths.ExpandPath(path) }
|
||||
|
||||
func XDGPicturesDir() string {
|
||||
if dir := os.Getenv("XDG_PICTURES_DIR"); dir != "" {
|
||||
@@ -83,18 +63,3 @@ func EmacsConfigDir() string {
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func ExpandPath(path string) (string, error) {
|
||||
expanded := os.ExpandEnv(path)
|
||||
expanded = filepath.Clean(expanded)
|
||||
|
||||
if strings.HasPrefix(expanded, "~") {
|
||||
home, err := os.UserHomeDir()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
expanded = filepath.Join(home, expanded[1:])
|
||||
}
|
||||
|
||||
return expanded, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user