/
platform.go
118 lines (90 loc) · 2.28 KB
/
platform.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package platform
// #cgo darwin LDFLAGS: -framework CoreFoundation -framework Cocoa
// #cgo linux pkg-config: gtk+-3.0 x11
// #cgo windows LDFLAGS: -lole32 -lshell32
// #include <stdlib.h>
// #include "platform.h"
import "C"
import (
"fmt"
"os"
"strings"
"unsafe"
"github.com/rotisserie/eris"
)
func init() {
C.PlatformInit()
}
func ShowError(msg string) {
cmsg := C.CString(msg)
C.ShowError(cmsg)
C.free(unsafe.Pointer(cmsg))
}
func OpenFolder(title, defaultPath string) (string, error) {
ctitle := C.CString(title)
cdefaultPath := C.CString(defaultPath)
defer C.free(unsafe.Pointer(ctitle))
defer C.free(unsafe.Pointer(cdefaultPath))
result := C.OpenFolderDialog(ctitle, cdefaultPath)
if result.code == 0 {
resultPath := C.GoString(result.string)
C.free(unsafe.Pointer(result.string))
return resultPath, nil
}
return "", eris.Errorf("Failed with code %d", result.code)
}
func CreateShortcut(shortcut, target string) error {
cShortcut := C.CString(shortcut)
cTarget := C.CString(target)
defer C.free(unsafe.Pointer(cShortcut))
defer C.free(unsafe.Pointer(cTarget))
result := C.CreateShortcut(cShortcut, cTarget)
if result != nil {
return eris.New(C.GoString(result))
}
_, err := os.Stat(shortcut)
if err != nil {
return eris.Wrap(err, "failed to verify shortcut")
}
return nil
}
func GetDesktopDirectory() string {
result := C.GetDesktopDirectory()
if result == nil {
return ""
}
path := C.GoString(result)
C.free(unsafe.Pointer(result))
return path
}
func GetStartMenuDirectory() string {
result := C.GetStartMenuDirectory()
if result == nil {
return ""
}
path := C.GoString(result)
C.free(unsafe.Pointer(result))
return path
}
func IsElevated() bool {
return bool(C.IsElevated())
}
func RunElevated(program string, args ...string) error {
cProgram := C.CString(program)
defer C.free(unsafe.Pointer(cProgram))
for idx, arg := range args {
if strings.ContainsAny(arg, "\"^") {
return eris.New("parameters containing \" or ^ are not supported")
}
args[idx] = fmt.Sprintf("\"%s\"", arg)
}
cArgs := C.CString(strings.Join(args, " "))
defer C.free(unsafe.Pointer(cArgs))
result := C.RunElevated(cProgram, cArgs)
if result == nil {
return nil
}
message := C.GoString(result)
C.free(unsafe.Pointer(result))
return eris.New(message)
}