Files
2022-05-10 19:54:49 +08:00

100 lines
2.4 KiB
Go

package worker
import (
"github.com/gorilla/websocket"
"github.com/lwch/logging"
"github.com/lwch/natpass/code/client/rule/vnc/vncnetwork"
"github.com/lwch/rdesktop"
"google.golang.org/protobuf/proto"
)
func (worker *Worker) runMouse(data *vncnetwork.MouseData) {
detach, err := attachDesktop()
if err != nil {
logging.Error("attach desktop: %v", err)
return
}
defer detach()
worker.cli.MouseMove(int(data.GetX()), int(data.GetY()))
var button rdesktop.MouseButton
switch data.GetBtn() {
case vncnetwork.MouseData_left:
button = rdesktop.MouseLeft
case vncnetwork.MouseData_right:
button = rdesktop.MouseRight
case vncnetwork.MouseData_middle:
button = rdesktop.MouseMiddle
}
switch data.GetType() {
case vncnetwork.Status_down:
worker.cli.ToggleMouse(button, true)
case vncnetwork.Status_up:
worker.cli.ToggleMouse(button, false)
}
}
func (worker *Worker) runKeyboard(data *vncnetwork.KeyboardData) {
detach, err := attachDesktop()
if err != nil {
logging.Error("attach desktop: %v", err)
return
}
defer detach()
switch data.Type {
case vncnetwork.Status_down:
worker.cli.ToggleKey(data.Key, true)
case vncnetwork.Status_up:
worker.cli.ToggleKey(data.Key, false)
}
}
func (worker *Worker) runScroll(data *vncnetwork.ScrollData) {
detach, err := attachDesktop()
if err != nil {
logging.Error("attach desktop: %v", err)
return
}
defer detach()
worker.cli.Scroll(int(data.X), int(data.Y))
}
func (worker *Worker) runClipboard(conn *websocket.Conn, data *vncnetwork.ClipboardData) {
detach, err := attachDesktop()
if err != nil {
logging.Error("attach desktop: %v", err)
return
}
defer detach()
if data.GetSet() {
worker.setClipboard(data)
} else {
worker.getClipboard(conn)
}
}
func (worker *Worker) setClipboard(data *vncnetwork.ClipboardData) {
switch data.GetXType() {
case vncnetwork.ClipboardData_file:
case vncnetwork.ClipboardData_image:
case vncnetwork.ClipboardData_text:
worker.cli.ClipboardSet(data.GetData())
}
}
func (worker *Worker) getClipboard(conn *websocket.Conn) {
data, _ := worker.cli.ClipboardGet()
var msg vncnetwork.VncMsg
msg.XType = vncnetwork.VncMsg_clipboard_event
msg.Payload = &vncnetwork.VncMsg_Clipboard{
Clipboard: &vncnetwork.ClipboardData{
Set: true,
XType: vncnetwork.ClipboardData_text,
Payload: &vncnetwork.ClipboardData_Data{
Data: data,
},
},
}
enc, _ := proto.Marshal(&msg)
conn.WriteMessage(websocket.BinaryMessage, enc)
}