forked from chrischdi/gphoto2go
-
Notifications
You must be signed in to change notification settings - Fork 2
/
gphoto2go.go
75 lines (60 loc) · 1.53 KB
/
gphoto2go.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
package gphoto2go
// #cgo pkg-config: libgphoto2
// #include <gphoto2.h>
// #include <stdlib.h>
import "C"
import (
"unsafe"
)
const (
captureImage = C.GP_CAPTURE_IMAGE
captureMovie = C.GP_CAPTURE_MOVIE
captureSound = C.GP_CAPTURE_SOUND
)
// CameraEventType code
type CameraEventType int
const (
eventUnknown CameraEventType = C.GP_EVENT_UNKNOWN
eventTimeout CameraEventType = C.GP_EVENT_TIMEOUT
eventFileAdded CameraEventType = C.GP_EVENT_FILE_ADDED
)
// CameraEvent struct
type CameraEvent struct {
Type CameraEventType
Folder string
File string
}
// CameraFilePath struct
type CameraFilePath struct {
Name string
Folder string
}
func cCameraEventToGoCameraEvent(voidPtr unsafe.Pointer, eventType C.CameraEventType) *CameraEvent {
ce := new(CameraEvent)
ce.Type = CameraEventType(eventType)
if ce.Type == eventFileAdded {
cameraFilePath := (*C.CameraFilePath)(voidPtr)
ce.File = C.GoString((*C.char)(&cameraFilePath.name[0]))
ce.Folder = C.GoString((*C.char)(&cameraFilePath.folder[0]))
}
return ce
}
func cameraListToMap(cameraList *C.CameraList) (map[string]string, int) {
size := int(C.gp_list_count(cameraList))
vals := make(map[string]string)
if size < 0 {
return vals, size
}
for i := 0; i < size; i++ {
var cKey *C.char
var cVal *C.char
C.gp_list_get_name(cameraList, C.int(i), &cKey)
C.gp_list_get_value(cameraList, C.int(i), &cVal)
defer C.free(unsafe.Pointer(cKey))
defer C.free(unsafe.Pointer(cVal))
key := C.GoString(cKey)
val := C.GoString(cVal)
vals[key] = val
}
return vals, 0
}