From d8c7f962e4fe2d4a46f0aeb1c9d9a371d5e41ee0 Mon Sep 17 00:00:00 2001 From: jwijenbergh Date: Fri, 19 Aug 2022 16:32:35 +0200 Subject: State + FSM: Properly handle the disconnect flow - /disconnect is now called - A new state is added (DISCONNECTING) that waits for the disconnect to complete - A helper function is exposed (InFSMState) that can be used by clients to see in which state they are in --- exports/exports.go | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'exports') diff --git a/exports/exports.go b/exports/exports.go index e0e8464..3ebd7f0 100644 --- a/exports/exports.go +++ b/exports/exports.go @@ -26,7 +26,7 @@ var P_StateCallbacks map[string]C.PythonCB var VPNStates map[string]*eduvpn.VPNState -func StateCallback(name string, old_state eduvpn.VPNStateID, new_state eduvpn.VPNStateID, data interface{}) { +func StateCallback(name string, old_state eduvpn.StateID, new_state eduvpn.StateID, data interface{}) { P_StateCallback, exists := P_StateCallbacks[name] if !exists || P_StateCallback == nil { return @@ -73,7 +73,7 @@ func Register(name *C.char, config_directory *C.char, stateCallback C.PythonCB, } VPNStates[nameStr] = state P_StateCallbacks[nameStr] = stateCallback - registerErr := state.Register(nameStr, C.GoString(config_directory), func(old eduvpn.VPNStateID, new eduvpn.VPNStateID, data interface{}) { + registerErr := state.Register(nameStr, C.GoString(config_directory), func(old eduvpn.StateID, new eduvpn.StateID, data interface{}) { StateCallback(nameStr, old, new, data) }, debug != 0) @@ -254,6 +254,17 @@ func SetDisconnected(name *C.char) *C.char { return C.CString(ErrorToString(setDisconnectedErr)) } +//export SetDisconnecting +func SetDisconnecting(name *C.char) *C.char { + nameStr := C.GoString(name) + state, stateErr := GetVPNState(nameStr) + if stateErr != nil { + return C.CString(ErrorToString(stateErr)) + } + setDisconnectingErr := state.SetDisconnecting() + return C.CString(ErrorToString(setDisconnectingErr)) +} + //export SetConnecting func SetConnecting(name *C.char) *C.char { nameStr := C.GoString(name) @@ -301,6 +312,20 @@ func ShouldRenewButton(name *C.char) C.int { return C.int(0) } +//export InFSMState +func InFSMState(name *C.char, checkState C.int) C.int { + nameStr := C.GoString(name) + state, stateErr := GetVPNState(nameStr) + if stateErr != nil { + return C.int(0) + } + inStateBool := state.InFSMState(eduvpn.StateID(checkState)) + if inStateBool { + return C.int(1) + } + return C.int(0) +} + //export FreeString func FreeString(addr *C.char) { C.free(unsafe.Pointer(addr)) -- cgit v1.2.3