From 5c9fbb90f5a83539c223f39eb879866018e4efc2 Mon Sep 17 00:00:00 2001 From: Brenton Bostick Date: Tue, 31 Jan 2023 12:04:21 -0500 Subject: [PATCH] add Event.fromInt --- java/jni/ZT_jnicache.cpp | 18 +-------- java/jni/ZT_jnicache.h | 9 +---- java/jni/ZT_jniutils.cpp | 37 ++----------------- java/jni/com_zerotierone_sdk_Node.cpp | 2 +- java/src/com/zerotier/sdk/Event.java | 53 ++++++++++++++++++++++----- 5 files changed, 52 insertions(+), 67 deletions(-) diff --git a/java/jni/ZT_jnicache.cpp b/java/jni/ZT_jnicache.cpp index ab5344b79..aeb2471c1 100644 --- a/java/jni/ZT_jnicache.cpp +++ b/java/jni/ZT_jnicache.cpp @@ -102,6 +102,7 @@ jmethodID VirtualNetworkRoute_ctor; // Static methods // +jmethodID Event_fromInt_method; jmethodID InetAddress_getByAddress_method; // @@ -158,14 +159,6 @@ jfieldID VirtualNetworkRoute_via_field; // Static fields // -jfieldID Event_EVENT_DOWN_field; -jfieldID Event_EVENT_FATAL_ERROR_IDENTITY_COLLISION_field; -jfieldID Event_EVENT_OFFLINE_field; -jfieldID Event_EVENT_ONLINE_field; -jfieldID Event_EVENT_REMOTE_TRACE_field; -jfieldID Event_EVENT_TRACE_field; -jfieldID Event_EVENT_UP_field; -jfieldID Event_EVENT_USER_MESSAGE_field; jfieldID PeerRole_PEER_ROLE_LEAF_field; jfieldID PeerRole_PEER_ROLE_MOON_field; jfieldID PeerRole_PEER_ROLE_PLANET_field; @@ -265,6 +258,7 @@ void setupJNICache(JavaVM *vm) { // Static methods // + EXCEPTIONANDNULLCHECK(Event_fromInt_method = env->GetStaticMethodID(Event_class, "fromInt", "(I)Lcom/zerotier/sdk/Event;")); EXCEPTIONANDNULLCHECK(InetAddress_getByAddress_method = env->GetStaticMethodID(InetAddress_class, "getByAddress", "([B)Ljava/net/InetAddress;")); // @@ -321,14 +315,6 @@ void setupJNICache(JavaVM *vm) { // Static fields // - EXCEPTIONANDNULLCHECK(Event_EVENT_DOWN_field = env->GetStaticFieldID(Event_class, "EVENT_DOWN", "Lcom/zerotier/sdk/Event;")); - EXCEPTIONANDNULLCHECK(Event_EVENT_FATAL_ERROR_IDENTITY_COLLISION_field = env->GetStaticFieldID(Event_class, "EVENT_FATAL_ERROR_IDENTITY_COLLISION", "Lcom/zerotier/sdk/Event;")); - EXCEPTIONANDNULLCHECK(Event_EVENT_OFFLINE_field = env->GetStaticFieldID(Event_class, "EVENT_OFFLINE", "Lcom/zerotier/sdk/Event;")); - EXCEPTIONANDNULLCHECK(Event_EVENT_ONLINE_field = env->GetStaticFieldID(Event_class, "EVENT_ONLINE", "Lcom/zerotier/sdk/Event;")); - EXCEPTIONANDNULLCHECK(Event_EVENT_REMOTE_TRACE_field = env->GetStaticFieldID(Event_class, "EVENT_REMOTE_TRACE", "Lcom/zerotier/sdk/Event;")); - EXCEPTIONANDNULLCHECK(Event_EVENT_TRACE_field = env->GetStaticFieldID(Event_class, "EVENT_TRACE", "Lcom/zerotier/sdk/Event;")); - EXCEPTIONANDNULLCHECK(Event_EVENT_UP_field = env->GetStaticFieldID(Event_class, "EVENT_UP", "Lcom/zerotier/sdk/Event;")); - EXCEPTIONANDNULLCHECK(Event_EVENT_USER_MESSAGE_field = env->GetStaticFieldID(Event_class, "EVENT_USER_MESSAGE", "Lcom/zerotier/sdk/Event;")); EXCEPTIONANDNULLCHECK(PeerRole_PEER_ROLE_LEAF_field = env->GetStaticFieldID(PeerRole_class, "PEER_ROLE_LEAF", "Lcom/zerotier/sdk/PeerRole;")); EXCEPTIONANDNULLCHECK(PeerRole_PEER_ROLE_MOON_field = env->GetStaticFieldID(PeerRole_class, "PEER_ROLE_MOON", "Lcom/zerotier/sdk/PeerRole;")); EXCEPTIONANDNULLCHECK(PeerRole_PEER_ROLE_PLANET_field = env->GetStaticFieldID(PeerRole_class, "PEER_ROLE_PLANET", "Lcom/zerotier/sdk/PeerRole;")); diff --git a/java/jni/ZT_jnicache.h b/java/jni/ZT_jnicache.h index fb9cf6442..d315cd0e7 100644 --- a/java/jni/ZT_jnicache.h +++ b/java/jni/ZT_jnicache.h @@ -71,6 +71,7 @@ extern jmethodID VirtualNetworkRoute_ctor; // Static methods // +extern jmethodID Event_fromInt_method; extern jmethodID InetAddress_getByAddress_method; // @@ -127,14 +128,6 @@ extern jfieldID VirtualNetworkRoute_via_field; // Static fields // -extern jfieldID Event_EVENT_DOWN_field; -extern jfieldID Event_EVENT_FATAL_ERROR_IDENTITY_COLLISION_field; -extern jfieldID Event_EVENT_OFFLINE_field; -extern jfieldID Event_EVENT_ONLINE_field; -extern jfieldID Event_EVENT_REMOTE_TRACE_field; -extern jfieldID Event_EVENT_TRACE_field; -extern jfieldID Event_EVENT_UP_field; -extern jfieldID Event_EVENT_USER_MESSAGE_field; extern jfieldID PeerRole_PEER_ROLE_LEAF_field; extern jfieldID PeerRole_PEER_ROLE_MOON_field; extern jfieldID PeerRole_PEER_ROLE_PLANET_field; diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 0ed59fab9..62250de9f 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -115,41 +115,12 @@ jobject createVirtualNetworkStatus(JNIEnv *env, ZT_VirtualNetworkStatus status) jobject createEvent(JNIEnv *env, ZT_Event event) { - jobject eventObject = NULL; - - jfieldID field; - switch(event) - { - case ZT_EVENT_UP: - field = Event_EVENT_UP_field; - break; - case ZT_EVENT_OFFLINE: - field = Event_EVENT_OFFLINE_field; - break; - case ZT_EVENT_ONLINE: - field = Event_EVENT_ONLINE_field; - break; - case ZT_EVENT_DOWN: - field = Event_EVENT_DOWN_field; - break; - case ZT_EVENT_FATAL_ERROR_IDENTITY_COLLISION: - field = Event_EVENT_FATAL_ERROR_IDENTITY_COLLISION_field; - break; - case ZT_EVENT_TRACE: - field = Event_EVENT_TRACE_field; - break; - case ZT_EVENT_USER_MESSAGE: - field = Event_EVENT_USER_MESSAGE_field; - break; - case ZT_EVENT_REMOTE_TRACE: - field = Event_EVENT_REMOTE_TRACE_field; - break; - default: - break; + jobject eventObject = env->CallStaticObjectMethod(Event_class, Event_fromInt_method, event); + if (env->ExceptionCheck() || eventObject == NULL) { + LOGE("Error creating Event object"); + return NULL; } - eventObject = env->GetStaticObjectField(Event_class, field); - return eventObject; } diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index 780feed02..c70d121ad 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -201,7 +201,7 @@ namespace { } jobject eventObject = createEvent(env, event); - if (eventObject == NULL) { + if (env->ExceptionCheck() || eventObject == NULL) { return; } diff --git a/java/src/com/zerotier/sdk/Event.java b/java/src/com/zerotier/sdk/Event.java index 1f33cea5c..fbc016c66 100644 --- a/java/src/com/zerotier/sdk/Event.java +++ b/java/src/com/zerotier/sdk/Event.java @@ -27,6 +27,11 @@ package com.zerotier.sdk; +/** + * Status codes sent to status update callback when things happen + * + * Defined in ZeroTierOne.h as ZT_Event + */ public enum Event { /** @@ -35,19 +40,19 @@ public enum Event { * This is the first event generated, and is always sent. It may occur * before Node's constructor returns. */ - EVENT_UP, + EVENT_UP(0), /** * Node is offline -- network does not seem to be reachable by any available strategy */ - EVENT_OFFLINE, + EVENT_OFFLINE(1), /** * Node is online -- at least one upstream node appears reachable * * Meta-data: none */ - EVENT_ONLINE, + EVENT_ONLINE(2), /** * Node is shutting down @@ -56,7 +61,7 @@ public enum Event { * It's done for convenience, since cleaning up other state in the event * handler may appear more idiomatic.

*/ - EVENT_DOWN, + EVENT_DOWN(3), /** * Your identity has collided with another node's ZeroTier address @@ -86,7 +91,7 @@ public enum Event { * condition is a good way to make sure it never arises. It's like how * umbrellas prevent rain and smoke detectors prevent fires. They do, right?

*/ - EVENT_FATAL_ERROR_IDENTITY_COLLISION, + EVENT_FATAL_ERROR_IDENTITY_COLLISION(4), /** * Trace (debugging) message @@ -95,7 +100,7 @@ public enum Event { * *

Meta-data: {@link String}, TRACE message

*/ - EVENT_TRACE, + EVENT_TRACE(5), /** * VERB_USER_MESSAGE received @@ -103,7 +108,7 @@ public enum Event { * These are generated when a VERB_USER_MESSAGE packet is received via * ZeroTier VL1. */ - EVENT_USER_MESSAGE, + EVENT_USER_MESSAGE(6), /** * Remote trace received @@ -115,5 +120,35 @@ public enum Event { * these, and controllers only save them if they pertain to networks * with remote tracing enabled. */ - EVENT_REMOTE_TRACE; -} \ No newline at end of file + EVENT_REMOTE_TRACE(7); + + @SuppressWarnings({"FieldCanBeLocal", "unused"}) + private final int id; + + Event(int id) { + this.id = id; + } + + public static Event fromInt(int id) { + switch (id) { + case 0: + return EVENT_UP; + case 1: + return EVENT_OFFLINE; + case 2: + return EVENT_ONLINE; + case 3: + return EVENT_DOWN; + case 4: + return EVENT_FATAL_ERROR_IDENTITY_COLLISION; + case 5: + return EVENT_TRACE; + case 6: + return EVENT_USER_MESSAGE; + case 7: + return EVENT_REMOTE_TRACE; + default: + throw new RuntimeException("Unhandled value: " + id); + } + } +}