From 28168fa673c359270089439179aa09107a882902 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Fri, 24 Apr 2015 18:39:17 -0700 Subject: implement VirtualNetworkConfigFunctionCallback --- java/jni/ZT1_jniutils.cpp | 39 +++++++++++++++++++++- java/jni/ZT1_jniutils.h | 1 + java/jni/com_zerotierone_sdk_Node.cpp | 39 ++++++++++++++++++++-- .../sdk/VirtualNetworkConfigListener.java | 5 ++- 4 files changed, 78 insertions(+), 6 deletions(-) (limited to 'java') diff --git a/java/jni/ZT1_jniutils.cpp b/java/jni/ZT1_jniutils.cpp index 01cb51cf..82f5dba8 100644 --- a/java/jni/ZT1_jniutils.cpp +++ b/java/jni/ZT1_jniutils.cpp @@ -215,11 +215,47 @@ jobject createVirtualNetworkType(JNIEnv *env, ZT1_VirtualNetworkType type) break; } - jfieldID enumField = env->GetStaticFieldID(vntypeClass, fieldName.c_str(), "Lcom/zerotierone/sdk/VirtyalNetworkType;"); + jfieldID enumField = env->GetStaticFieldID(vntypeClass, fieldName.c_str(), "Lcom/zerotierone/sdk/VirtualNetworkType;"); vntypeObject = env->GetStaticObjectField(vntypeClass, enumField); return vntypeObject; } +jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT1_VirtualNetworkConfigOperation op) +{ + static jclass vnetConfigOpClass = NULL; + jobject vnetConfigOpObject = NULL; + + if(vnetConfigOpClass == NULL) + { + vnetConfigOpClass = env->FindClass("com/zerotierone/sdk/VirtualNetworkConfigOperation"); + if(vnetConfigOpClass == NULL) + { + return NULL; + } + } + + std::string fieldName; + switch(op) + { + case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_UP: + fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_UP"; + break; + case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE: + fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_CONFIG_UPDATE"; + break; + case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN: + fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_DOWN"; + break; + case ZT1_VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY: + fieldName = "VIRTUAL_NETWORK_CONFIG_OPERATION_DESTROY"; + break; + } + + jfieldID enumField = env->GetStaticFieldID(vnetConfigOpClass, fieldName.c_str(), "Lcom/zerotierone/sdk/VirtualNetworkConfigOperation;"); + vnetConfigOpObject = env->GetStaticObjectField(vnetConfigOpClass, enumField); + return vnetConfigOpObject; +} + jobject newArrayList(JNIEnv *env) { if(arrayListClass == NULL) @@ -843,6 +879,7 @@ jobject newNetworkConfig(JNIEnv *env, const ZT1_VirtualNetworkConfig &vnetConfig return vnetConfigObj; } + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/java/jni/ZT1_jniutils.h b/java/jni/ZT1_jniutils.h index 88d34d6c..df22b0ca 100644 --- a/java/jni/ZT1_jniutils.h +++ b/java/jni/ZT1_jniutils.h @@ -12,6 +12,7 @@ jobject createVirtualNetworkStatus(JNIEnv *env, ZT1_VirtualNetworkStatus status) jobject createVirtualNetworkType(JNIEnv *env, ZT1_VirtualNetworkType type); jobject createEvent(JNIEnv *env, ZT1_Event event); jobject createPeerRole(JNIEnv *env, ZT1_PeerRole role); +jobject createVirtualNetworkConfigOperation(JNIEnv *env, ZT1_VirtualNetworkConfigOperation op); jobject newArrayList(JNIEnv *env); bool appendItemToArrayList(JNIEnv *env, jobject array, jobject object); diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index fb72ef86..fe8c8c3e 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -65,14 +65,49 @@ namespace { }; - int VirtualNetworkConfigFunctionCallback(ZT1_Node *node,void *userData,uint64_t,enum ZT1_VirtualNetworkConfigOperation,const ZT1_VirtualNetworkConfig *) + int VirtualNetworkConfigFunctionCallback(ZT1_Node *node,void *userData,uint64_t nwid,enum ZT1_VirtualNetworkConfigOperation operation, const ZT1_VirtualNetworkConfig *config) { JniRef *ref = (JniRef*)userData; assert(ref->node == node); JNIEnv *env = ref->env; - return 0; + static jclass configListenerClass = NULL; + static jmethodID callbackMethod = NULL; + + if(configListenerClass == NULL) + { + configListenerClass = env->GetObjectClass(ref->configListener); + if(configListenerClass == NULL) + { + return -1; + } + } + + if(callbackMethod == NULL) + { + callbackMethod = env->GetMethodID(configListenerClass, + "onNetworkConfigurationUpdated", + "(JLcom/zerotierone/sdk/VirtualNetworkConfigOperation;Lcom/zerotierone/sdk/VirtualNetworkConfig;)I"); + if(callbackMethod == NULL) + { + return -2; + } + } + + jobject operationObject = createVirtualNetworkConfigOperation(env, operation); + if(operationObject == NULL) + { + return -3; + } + + jobject networkConfigObject = newNetworkConfig(env, *config); + if(networkConfigObject == NULL) + { + return -4; + } + + return env->CallIntMethod(ref->configListener, callbackMethod, (jlong)nwid, operationObject, networkConfigObject); } void VirtualNetworkFrameFunctionCallback(ZT1_Node *node,void *userData,uint64_t,uint64_t,uint64_t,unsigned int,unsigned int,const void *,unsigned int) diff --git a/java/src/com/zerotierone/sdk/VirtualNetworkConfigListener.java b/java/src/com/zerotierone/sdk/VirtualNetworkConfigListener.java index 78d11987..9378b6c9 100644 --- a/java/src/com/zerotierone/sdk/VirtualNetworkConfigListener.java +++ b/java/src/com/zerotierone/sdk/VirtualNetworkConfigListener.java @@ -30,9 +30,8 @@ package com.zerotierone.sdk; public interface VirtualNetworkConfigListener { - public void onNetworkConfigurationUpdated( - Node node, - long someValue, + public int onNetworkConfigurationUpdated( + long nwid, VirtualNetworkConfigOperation op, VirtualNetworkConfig config); } \ No newline at end of file -- cgit v1.2.3