diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-04-26 16:31:45 +0200 |
|---|---|---|
| committer | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2022-04-26 16:31:45 +0200 |
| commit | 39f0e8e26ab37c4b83c1933ba90bae15cd7e04fc (patch) | |
| tree | a1d496c73fa5d2793105151835cb7e06b82c17b8 /exports | |
| parent | 5608d9a858c2323002305ea1fedb5793a40edc58 (diff) | |
State: Add a state map to exports instead of a global singleton
Diffstat (limited to 'exports')
| -rw-r--r-- | exports/exports.go | 79 |
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)) } |
