summaryrefslogtreecommitdiff
path: root/exports/disco.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2022-09-14 13:56:49 +0200
committerjwijenbergh <jeroenwijenbergh@protonmail.com>2022-09-14 13:56:49 +0200
commitda83f54606c9c1d2786d87074ee17ed972d2e1b2 (patch)
tree0be57934f9f467c87576abb0b457fb54b2d25d52 /exports/disco.go
parentfd34e72da8c604517050ada7e883ba982829d985 (diff)
Refactor: Return without json
Diffstat (limited to 'exports/disco.go')
-rw-r--r--exports/disco.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/exports/disco.go b/exports/disco.go
new file mode 100644
index 0000000..9ee2af9
--- /dev/null
+++ b/exports/disco.go
@@ -0,0 +1,97 @@
+package main
+
+/*
+// for free
+#include <stdlib.h>
+#include "c/disco.h"
+*/
+import "C"
+
+import (
+ "unsafe"
+
+ "github.com/jwijenbergh/eduvpn-common"
+ "github.com/jwijenbergh/eduvpn-common/internal/types"
+)
+
+func getCPtrDiscoOrganization(
+ state *eduvpn.VPNState,
+ organization *types.DiscoveryOrganization,
+) *C.discoveryOrganization {
+ returnedStruct := (*C.discoveryOrganization)(
+ C.malloc(C.size_t(unsafe.Sizeof(C.discoveryOrganization{}))),
+ )
+ returnedStruct.display_name = C.CString(state.GetTranslated(organization.DisplayName))
+ returnedStruct.org_id = C.CString(organization.OrgId)
+ returnedStruct.secure_internet_home = C.CString(organization.SecureInternetHome)
+ returnedStruct.keyword_list = C.CString(state.GetTranslated(organization.KeywordList))
+ return returnedStruct
+}
+
+func getCPtrDiscoOrganizations(
+ state *eduvpn.VPNState,
+ organizations *types.DiscoveryOrganizations,
+) (C.size_t, **C.discoveryOrganization) {
+ totalOrganizations := C.size_t(len(organizations.List))
+ var organizationsPtr **C.discoveryOrganization
+ if totalOrganizations > 0 {
+ organizationsPtr = (**C.discoveryOrganization)(
+ C.malloc(totalOrganizations * C.size_t(unsafe.Sizeof(uintptr(0)))),
+ )
+ cOrganizations := (*[1<<30 - 1]*C.discoveryOrganization)(unsafe.Pointer(organizationsPtr))[:totalOrganizations:totalOrganizations]
+ index := 0
+ for _, organization := range organizations.List {
+ cOrganization := getCPtrDiscoOrganization(state, &organization)
+ cOrganizations[index] = cOrganization
+ index += 1
+ }
+ }
+ return totalOrganizations, organizationsPtr
+}
+
+func freeDiscoOrganization(cOrganization *C.discoveryOrganization) {
+ C.free(unsafe.Pointer(cOrganization.display_name))
+ C.free(unsafe.Pointer(cOrganization.org_id))
+ C.free(unsafe.Pointer(cOrganization.secure_internet_home))
+ C.free(unsafe.Pointer(cOrganization.keyword_list))
+ C.free(unsafe.Pointer(cOrganization))
+}
+
+//export FreeDiscoOrganizations
+func FreeDiscoOrganizations(cOrganizations *C.discoveryOrganizations) {
+ if cOrganizations.total_organizations > 0 {
+ organizations := (*[1<<30 - 1]*C.discoveryOrganization)(unsafe.Pointer(cOrganizations.organizations))[:cOrganizations.total_organizations:cOrganizations.total_organizations]
+ for i := C.size_t(0); i < cOrganizations.total_organizations; i++ {
+ freeDiscoOrganization(organizations[i])
+ }
+ C.free(unsafe.Pointer(cOrganizations.organizations))
+ }
+ C.free(unsafe.Pointer(cOrganizations))
+}
+
+//export GetDiscoOrganizations
+func GetDiscoOrganizations(name *C.char) *C.discoveryOrganizations {
+ nameStr := C.GoString(name)
+ state, stateErr := GetVPNState(nameStr)
+ // TODO
+ if stateErr != nil {
+ panic(stateErr)
+ }
+ organizations, organizationsErr := state.GetDiscoOrganizations()
+ // TODO
+ if organizationsErr != nil {
+ panic(organizationsErr)
+ }
+
+ returnedStruct := (*C.discoveryOrganizations)(
+ C.malloc(C.size_t(unsafe.Sizeof(C.discoveryOrganizations{}))),
+ )
+
+ returnedStruct.version = C.ulonglong(organizations.Version)
+ returnedStruct.total_organizations, returnedStruct.organizations = getCPtrDiscoOrganizations(
+ state,
+ organizations,
+ )
+
+ return returnedStruct
+}