summaryrefslogtreecommitdiff
path: root/exports
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2022-04-26 16:31:45 +0200
committerjwijenbergh <jeroenwijenbergh@protonmail.com>2022-04-26 16:31:45 +0200
commit39f0e8e26ab37c4b83c1933ba90bae15cd7e04fc (patch)
treea1d496c73fa5d2793105151835cb7e06b82c17b8 /exports
parent5608d9a858c2323002305ea1fedb5793a40edc58 (diff)
State: Add a state map to exports instead of a global singleton
Diffstat (limited to 'exports')
-rw-r--r--exports/exports.go79
1 files changed, 65 insertions, 14 deletions
diff --git a/exports/exports.go b/exports/exports.go
index d81f1ce..f21a354 100644
--- a/exports/exports.go
+++ b/exports/exports.go
@@ -13,11 +13,16 @@ void call_callback(PythonCB callback, const char* oldstate, const char* newstate
}
*/
import "C"
+import "errors"
+import "fmt"
import "unsafe"
import "github.com/jwijenbergh/eduvpn-common"
var P_StateCallback C.PythonCB
+
+var VPNStates map[string]*eduvpn.VPNState
+
func StateCallback(old_state string, new_state string, data string) {
if P_StateCallback == nil {
return
@@ -31,18 +36,44 @@ func StateCallback(old_state string, new_state string, data string) {
C.free(unsafe.Pointer(data_c))
}
+
+func GetVPNState(name string) (*eduvpn.VPNState, error) {
+ state, exists := VPNStates[name]
+
+ if !exists || state == nil {
+ return nil, errors.New(fmt.Sprintf("State with name %s not found", name))
+ }
+
+ return state, nil
+}
+
//export Register
func Register(name *C.char, config_directory *C.char, stateCallback C.PythonCB, debug C.int) *C.char {
+ state := &eduvpn.VPNState{}
+ nameStr := C.GoString(name)
+
+ if VPNStates == nil {
+ VPNStates = make(map[string]*eduvpn.VPNState)
+ }
+ VPNStates[nameStr] = state
P_StateCallback = stateCallback
- state := eduvpn.GetVPNState()
- registerErr := state.Register(C.GoString(name), C.GoString(config_directory), StateCallback, debug != 0)
+ registerErr := state.Register(nameStr, C.GoString(config_directory), StateCallback, debug != 0)
+
+ if registerErr != nil {
+ delete(VPNStates, nameStr)
+ }
return C.CString(ErrorToString(registerErr))
}
//export Deregister
-func Deregister() {
- state := eduvpn.GetVPNState()
+func Deregister(name *C.char) *C.char {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ if stateErr != nil {
+ return C.CString(ErrorToString(stateErr))
+ }
state.Deregister()
+ return nil
}
func ErrorToString(error error) string {
@@ -54,38 +85,58 @@ func ErrorToString(error error) string {
}
//export CancelOAuth
-func CancelOAuth() (*C.char) {
- state := eduvpn.GetVPNState()
+func CancelOAuth(name *C.char) *C.char {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ if stateErr != nil {
+ return C.CString(ErrorToString(stateErr))
+ }
cancelErr := state.CancelOAuth()
cancelErrString := ErrorToString(cancelErr)
return C.CString(cancelErrString)
}
//export Connect
-func Connect(url *C.char) (*C.char, *C.char) {
- state := eduvpn.GetVPNState()
+func Connect(name *C.char, url *C.char) (*C.char, *C.char) {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ if stateErr != nil {
+ return nil, C.CString(ErrorToString(stateErr))
+ }
config, configErr := state.Connect(C.GoString(url))
return C.CString(config), C.CString(ErrorToString(configErr))
}
//export GetOrganizationsList
-func GetOrganizationsList() (*C.char, *C.char) {
- state := eduvpn.GetVPNState()
+func GetOrganizationsList(name *C.char) (*C.char, *C.char) {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ if stateErr != nil {
+ return nil, C.CString(ErrorToString(stateErr))
+ }
organizations, organizationsErr := state.GetDiscoOrganizations()
return C.CString(organizations), C.CString(ErrorToString(organizationsErr))
}
//export GetServersList
-func GetServersList() (*C.char, *C.char) {
- state := eduvpn.GetVPNState()
+func GetServersList(name *C.char) (*C.char, *C.char) {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ if stateErr != nil {
+ return nil, C.CString(ErrorToString(stateErr))
+ }
servers, serversErr := state.GetDiscoServers()
return C.CString(servers), C.CString(ErrorToString(serversErr))
}
//export SetProfileID
-func SetProfileID(data *C.char) *C.char {
- state := eduvpn.GetVPNState()
+func SetProfileID(name *C.char, data *C.char) *C.char {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ if stateErr != nil {
+ return C.CString(ErrorToString(stateErr))
+ }
profileErr := state.SetProfileID(C.GoString(data))
return C.CString(ErrorToString(profileErr))
}