-
Notifications
You must be signed in to change notification settings - Fork 378
/
cgo_bridge.go
90 lines (70 loc) · 1.79 KB
/
cgo_bridge.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
// +build darwin,cgo,!catalyst
package driver
/*
#cgo CFLAGS: -x objective-c
#cgo darwin LDFLAGS: -framework Foundation -framework MultipeerConnectivity
#include <stdlib.h>
#include "mc-driver.h"
*/
import "C"
import (
"unsafe"
proximity "berty.tech/berty/v2/go/internal/proximitytransport"
)
var ProtocolName string
//export HandleFoundPeer
func HandleFoundPeer(remotePID *C.char) int {
goPID := C.GoString(remotePID)
t, ok := proximity.TransportMap.Load(ProtocolName)
if !ok {
return 0
}
if t.(proximity.ProximityTransport).HandleFoundPeer(goPID) {
return 1
}
return 0
}
//export HandleLostPeer
func HandleLostPeer(remotePID *C.char) {
goPID := C.GoString(remotePID)
t, ok := proximity.TransportMap.Load(ProtocolName)
if !ok {
return
}
t.(proximity.ProximityTransport).HandleLostPeer(goPID)
}
//export ReceiveFromPeer
func ReceiveFromPeer(remotePID *C.char, payload unsafe.Pointer, length C.int) {
goPID := C.GoString(remotePID)
goPayload := C.GoBytes(payload, length)
t, ok := proximity.TransportMap.Load(ProtocolName)
if !ok {
return
}
t.(proximity.ProximityTransport).ReceiveFromPeer(goPID, goPayload)
}
func Start(localPID string) {
cPID := C.CString(localPID)
defer C.free(unsafe.Pointer(cPID))
C.StartMCDriver(cPID)
}
func Stop() {
C.StopMCDriver()
}
func DialPeer(remotePID string) bool {
cPID := C.CString(remotePID)
defer C.free(unsafe.Pointer(cPID))
return C.DialPeer(cPID) == 1
}
func SendToPeer(remotePID string, payload []byte) bool {
cPID := C.CString(remotePID)
defer C.free(unsafe.Pointer(cPID))
cPayload := C.CBytes(payload)
defer C.free(cPayload)
return C.SendToPeer(cPID, cPayload, C.int(len(payload))) == 1
}
func CloseConnWithPeer(remotePID string) {
cPID := C.CString(remotePID)
defer C.free(unsafe.Pointer(cPID))
C.CloseConnWithPeer(cPID)
}