-
Notifications
You must be signed in to change notification settings - Fork 26
/
cgo_bridge.go
127 lines (103 loc) · 2.41 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
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
119
120
121
122
123
124
125
126
127
//go:build darwin && cgo && !catalyst
// +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 (
"fmt"
"unsafe"
"go.uber.org/zap"
proximity "berty.tech/weshnet/pkg/proximitytransport"
)
var (
Logger *zap.Logger
ProtocolName string
)
//export MCHandleFoundPeer
func MCHandleFoundPeer(remotePID *C.char) int {
goPID := C.GoString(remotePID)
proximity.TransportMapMutex.RLock()
t, ok := proximity.TransportMap[ProtocolName]
proximity.TransportMapMutex.RUnlock()
if !ok {
return 0
}
if t.HandleFoundPeer(goPID) {
return 1
}
return 0
}
//export MCHandleLostPeer
func MCHandleLostPeer(remotePID *C.char) {
goPID := C.GoString(remotePID)
proximity.TransportMapMutex.RLock()
t, ok := proximity.TransportMap[ProtocolName]
proximity.TransportMapMutex.RUnlock()
if !ok {
return
}
t.HandleLostPeer(goPID)
}
//export MCReceiveFromPeer
func MCReceiveFromPeer(remotePID *C.char, payload unsafe.Pointer, length C.int) {
goPID := C.GoString(remotePID)
goPayload := C.GoBytes(payload, length)
proximity.TransportMapMutex.RLock()
t, ok := proximity.TransportMap[ProtocolName]
proximity.TransportMapMutex.RUnlock()
if !ok {
return
}
t.ReceiveFromPeer(goPID, goPayload)
}
//export MCLog
func MCLog(level C.enum_level, message *C.char) { //nolint:golint
if Logger == nil {
fmt.Println("logger not found")
return
}
goMessage := C.GoString(message)
switch level {
case C.Debug:
Logger.Debug(goMessage)
case C.Info:
Logger.Info(goMessage)
case C.Warn:
Logger.Warn(goMessage)
case C.Error:
Logger.Error(goMessage)
}
}
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)
}
func MCUseExternalLogger() {
C.MCUseExternalLogger()
}