/
virtualmachine.go
83 lines (68 loc) · 2.04 KB
/
virtualmachine.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package goprlapi
/*
#cgo LDFLAGS: -framework ParallelsVirtualizationSDK
#include <ParallelsVirtualizationSDK/Parallels.h>
*/
import "C"
import (
"fmt"
"github.com/rickard-von-essen/goprlapi/key"
"unsafe"
)
type VirtualMachine struct {
handle C.PRL_HANDLE
displayConnected bool
}
func (v *VirtualMachine) Name() string {
var buf = make([]byte, 1024)
var sName C.PRL_STR = (C.PRL_STR)(unsafe.Pointer(&buf))
var nBufSize C.PRL_UINT32 = 1024
res := C.PrlVmCfg_GetName(v.handle, sName, &nBufSize)
name := C.GoStringN((*_Ctype_char)(unsafe.Pointer(sName)), C.int(nBufSize-1))
if res >= 0 {
return name
}
return ""
}
func (v *VirtualMachine) DisplayConnect() error {
// PDCQ_HIGH_QUALITY = 1<<0
// PDCC_NO_COMPRESSION = 1<<18
// 1 | 1<<18 = 262145 = 0x40001
//C.PrlDevDisplay_ConnectToVm(v.handle, C.enum_PDCT_HIGH_QUALITY_WITHOUT_COMPRESSION)
hJob := C.PrlDevDisplay_ConnectToVm(v.handle, C.PRL_DISPLAY_CODEC_TYPE(0x40001))
defer C.PrlHandle_Free(hJob)
res := C.PrlJob_Wait(hJob, 10000)
if res < 0 {
return from_prl_error("PrlJob_Wait", res)
}
v.displayConnected = true
return nil
}
func (v *VirtualMachine) DisplayDisconnect() error {
v.displayConnected = false
res := C.PrlDevDisplay_DisconnectFromVm(v.handle)
if res < 0 {
return from_prl_error("PrlDevDisplay_DisconnectFromVm", res)
}
return nil
}
func (v *VirtualMachine) SendKeyEvent(key key.Key, event key.KeyEvent) error {
if !v.displayConnected {
return fmt.Errorf("Must connect to display before sending keyboard events!")
}
res := C.PrlDevKeyboard_SendKeyEventEx(v.handle, C.PRL_KEY(key), C.PRL_KEY_EVENT(event))
if res < 0 {
return from_prl_error("PrlDevKeyboard_SendKeyEvent", res)
}
return nil
}
func (v *VirtualMachine) SendKeyPressedAndReleased(key key.Key) error {
if !v.displayConnected {
return fmt.Errorf("Must connect to display before sending keyboard events!")
}
res := C.PrlDevKeyboard_SendKeyPressedAndReleased(v.handle, C.PRL_KEY(key))
if res < 0 {
return from_prl_error("PrlDevKeyboard_SendKeyPressedAndReleased", res)
}
return nil
}