diff options
author | Grant Limberg <glimberg@gmail.com> | 2015-04-24 17:58:59 -0700 |
---|---|---|
committer | Grant Limberg <glimberg@gmail.com> | 2015-04-24 17:58:59 -0700 |
commit | 52a20b4b0ffefa5b1eea63e57daa7bd28005ca6d (patch) | |
tree | 302cbe8d328438e11c5ce9c1f31ec0863d04a44d /java/jni | |
parent | f3c29d3f0d877910a15c049d2b70b65002dd39a5 (diff) | |
download | infinitytier-52a20b4b0ffefa5b1eea63e57daa7bd28005ca6d.tar.gz infinitytier-52a20b4b0ffefa5b1eea63e57daa7bd28005ca6d.zip |
create PeerRole and PeerPhysicalPath objects
Diffstat (limited to 'java/jni')
-rw-r--r-- | java/jni/ZT1_jniutils.cpp | 280 | ||||
-rw-r--r-- | java/jni/ZT1_jniutils.h | 5 |
2 files changed, 285 insertions, 0 deletions
diff --git a/java/jni/ZT1_jniutils.cpp b/java/jni/ZT1_jniutils.cpp index 87340f12..a086dece 100644 --- a/java/jni/ZT1_jniutils.cpp +++ b/java/jni/ZT1_jniutils.cpp @@ -155,6 +155,41 @@ jobject createEvent(JNIEnv *env, ZT1_Event event) return eventObject; } +jobject createPeerRole(JNIEnv *env, ZT1_PeerRole role) +{ + static jclass peerRoleClass = NULL; + jobject peerRoleObject = NULL; + + if(peerRoleClass == NULL) + { + peerRoleClass = env->FindClass("com/zerotierone/sdk/PeerRole"); + if(peerRoleClass == NULL) + { + return NULL; + } + } + + std::string fieldName; + switch(role) + { + case ZT1_PEER_ROLE_LEAF: + fieldName = "PEER_ROLE_LEAF"; + break; + case ZT1_PEER_ROLE_HUB: + fieldName = "PEER_ROLE_HUB"; + break; + case ZT1_PEER_ROLE_SUPERNODE: + fieldName = "PEER_ROLE_SUPERNODE"; + break; + } + + jfieldID enumField = env->GetStaticFieldID(peerRoleClass, fieldName.c_str(), "Lcom/zerotierone/sdk/PeerRole;"); + + peerRoleObject = env->GetStaticObjectField(peerRoleClass, enumField); + + return peerRoleObject; +} + jobject createVirtualNetworkType(JNIEnv *env, ZT1_VirtualNetworkType type) { static jclass vntypeClass = NULL; @@ -342,6 +377,251 @@ jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc) return multicastGroupObj; } +jobject newPeerPhysicalPath(JNIEnv *env, const ZT1_PeerPhysicalPath &ppp) +{ + static jclass pppClass = NULL; + + static jfieldID addressField = NULL; + static jfieldID lastSendField = NULL; + static jfieldID lastReceiveField = NULL; + static jfieldID fixedField = NULL; + static jfieldID activeField = NULL; + static jfieldID preferredField = NULL; + + static jmethodID ppp_constructor = NULL; + + if(pppClass == NULL) + { + pppClass = env->FindClass("com/zerotierone/sdk/PeerPhysicalPath"); + if(pppClass == NULL) + { + return NULL; + } + } + + if(addressField == NULL) + { + addressField = env->GetFieldID(pppClass, "address", "Ljava/net/InetAddress;"); + if(addressField == NULL) + { + return NULL; + } + } + + if(lastSendField == NULL) + { + lastSendField = env->GetFieldID(pppClass, "lastSend", "J"); + if(lastSendField == NULL) + { + return NULL; + } + } + + if(lastReceiveField == NULL) + { + lastReceiveField = env->GetFieldID(pppClass, "lastReceive", "J"); + if(lastReceiveField == NULL) + { + return NULL; + } + } + + if(fixedField == NULL) + { + fixedField = env->GetFieldID(pppClass, "fixed", "Z"); + if(fixedField == NULL) + { + return NULL; + } + } + + if(activeField == NULL) + { + activeField = env->GetFieldID(pppClass, "active", "Z"); + if(activeField == NULL) + { + return NULL; + } + } + + if(preferredField == NULL) + { + preferredField = env->GetFieldID(pppClass, "preferred", "Z"); + if(preferredField == NULL) + { + return NULL; + } + } + + if(ppp_constructor == NULL) + { + ppp_constructor = env->GetMethodID(pppClass, "<init>", "()V"); + if(ppp_constructor == NULL) + { + return NULL; + } + } + + jobject pppObject = env->NewObject(pppClass, ppp_constructor); + if(pppObject == NULL) + { + return NULL; // out of memory + } + + jobject addressObject = newInetAddress(env, ppp.address); + + env->SetObjectField(pppClass, addressField, addressObject); + env->SetLongField(pppClass, lastSendField, ppp.lastSend); + env->SetLongField(pppClass, lastReceiveField, ppp.lastReceive); + env->SetBooleanField(pppClass, fixedField, ppp.fixed); + env->SetBooleanField(pppClass, activeField, ppp.active); + env->SetBooleanField(pppClass, preferredField, ppp.preferred); + + return pppObject; +} + +jobject newPeer(JNIEnv *env, const ZT1_Peer &peer) +{ + static jclass peerClass = NULL; + + static jfieldID addressField = NULL; + static jfieldID lastUnicastFrameField = NULL; + static jfieldID lastMulticastFrameField = NULL; + static jfieldID versionMajorField = NULL; + static jfieldID versionMinorField = NULL; + static jfieldID versionRevField = NULL; + static jfieldID latencyField = NULL; + static jfieldID roleField = NULL; + static jfieldID pathsField = NULL; + + static jmethodID peer_constructor = NULL; + + if(peerClass == NULL) + { + peerClass = env->FindClass("com/zerotierone/sdk/Peer"); + if(peerClass == NULL) + { + return NULL; + } + } + + if(addressField == NULL) + { + addressField = env->GetFieldID(peerClass, "address", "J"); + if(addressField == NULL) + { + return NULL; + } + } + + if(lastUnicastFrameField == NULL) + { + lastUnicastFrameField = env->GetFieldID(peerClass, "lastUnicastFrame", "J"); + if(lastUnicastFrameField == NULL) + { + return NULL; + } + } + + if(lastMulticastFrameField == NULL) + { + lastMulticastFrameField = env->GetFieldID(peerClass, "lastMulticastFrame", "J"); + if(lastMulticastFrameField == NULL) + { + return NULL; + } + } + + if(versionMajorField == NULL) + { + versionMajorField = env->GetFieldID(peerClass, "versionMajor", "I"); + if(versionMajorField == NULL) + { + return NULL; + } + } + + if(versionMinorField == NULL) + { + versionMinorField = env->GetFieldID(peerClass, "versionMinor", "I"); + if(versionMinorField == NULL) + { + return NULL; + } + } + + if(versionRevField == NULL) + { + versionRevField = env->GetFieldID(peerClass, "versionRev", "I"); + if(versionRevField == NULL) + { + return NULL; + } + } + + if(latencyField == NULL) + { + latencyField = env->GetFieldID(peerClass, "latency", "I"); + if(latencyField == NULL) + { + return NULL; + } + } + + if(roleField == NULL) + { + roleField = env->GetFieldID(peerClass, "role", "Lcom/zerotierone/sdk/PeerRole;"); + if(roleField == NULL) + { + return NULL; + } + } + + if(pathsField == NULL) + { + pathsField = env->GetFieldID(peerClass, "paths", "Ljava.util.ArrayList;"); + if(pathsField == NULL) + { + return NULL; + } + } + + if(peer_constructor == NULL) + { + peer_constructor = env->GetMethodID(peerClass, "<init>", "()V"); + if(peer_constructor == NULL) + { + return NULL; + } + } + + jobject peerObject = env->NewObject(peerClass, peer_constructor); + if(peerObject == NULL) + { + return NULL; // out of memory + } + + env->SetLongField(peerClass, addressField, (jlong)peer.address); + env->SetLongField(peerClass, lastUnicastFrameField, (jlong)peer.lastUnicastFrame); + env->SetLongField(peerClass, lastMulticastFrameField, (jlong)peer.lastMulticastFrame); + env->SetIntField(peerClass, versionMajorField, peer.versionMajor); + env->SetIntField(peerClass, versionMinorField, peer.versionMinor); + env->SetIntField(peerClass, versionRevField, peer.versionRev); + env->SetIntField(peerClass, latencyField, peer.latency); + env->SetObjectField(peerClass, roleField, createPeerRole(env, peer.role)); + + jobject arrayObject = newArrayList(env); + for(unsigned int i = 0; i < peer.pathCount; ++i) + { + jobject path = newPeerPhysicalPath(env, peer.paths[i]); + appendItemToArrayList(env, arrayObject, path); + } + + env->SetObjectField(peerClass, pathsField, arrayObject); + + return peerObject; +} + #ifdef __cplusplus } #endif
\ No newline at end of file diff --git a/java/jni/ZT1_jniutils.h b/java/jni/ZT1_jniutils.h index e881e394..614474a7 100644 --- a/java/jni/ZT1_jniutils.h +++ b/java/jni/ZT1_jniutils.h @@ -11,6 +11,7 @@ jobject createResultObject(JNIEnv *env, ZT1_ResultCode code); 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 newArrayList(JNIEnv *env); bool appendItemToArrayList(JNIEnv *env, jobject array, jobject object); @@ -18,6 +19,10 @@ bool appendItemToArrayList(JNIEnv *env, jobject array, jobject object); jobject newInetAddress(JNIEnv *env, const sockaddr_storage &addr); jobject newMulticastGroup(JNIEnv *env, const ZT1_MulticastGroup &mc); + +jobject newPeer(JNIEnv *env, const ZT1_Peer &peer); +jobject newPeerPhysicalPath(JNIEnv *env, const ZT1_PeerPhysicalPath &ppp); + #ifdef __cplusplus } #endif |