diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2010-02-23 11:52:33 +0100 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2010-02-23 11:52:33 +0100 |
commit | 7c0df6ee02eb792c6afea7f047539840addb2f02 (patch) | |
tree | e59f52f853a6838c78528b1dba144749a34cb33a /bindings/java/Socket.cpp | |
parent | ef1b5974891a30b15299464859023a531c2328f8 (diff) |
Java binding beautified, inline documentation added
Diffstat (limited to 'bindings/java/Socket.cpp')
-rwxr-xr-x[-rw-r--r--] | bindings/java/Socket.cpp | 197 |
1 files changed, 149 insertions, 48 deletions
diff --git a/bindings/java/Socket.cpp b/bindings/java/Socket.cpp index eaf1b22..adea3fa 100644..100755 --- a/bindings/java/Socket.cpp +++ b/bindings/java/Socket.cpp @@ -17,7 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <stdlib.h> #include <string.h> #include <assert.h> #include <errno.h> @@ -27,9 +26,79 @@ #include "org_zmq_Socket.h" +/** Handle to Java's Socket::socketHandle. */ static jfieldID socket_handle_fid = NULL; -static jmethodID create_socket_mid = NULL; +/** + * Make sure we have a valid pointer to Java's Socket::socketHandle. + */ +static void ensure_socket (JNIEnv *env, + jobject obj) +{ + if (socket_handle_fid == NULL) { + jclass cls = env->GetObjectClass (obj); + assert (cls); + socket_handle_fid = env->GetFieldID (cls, "socketHandle", "J"); + assert (socket_handle_fid); + env->DeleteLocalRef (cls); + } +} + +/** + * Get the value of Java's Socket::socketHandle. + */ +static void *get_socket (JNIEnv *env, + jobject obj) +{ + ensure_socket (env, obj); + void *s = (void*) env->GetLongField (obj, socket_handle_fid); + return s; +} + +/** + * Set the value of Java's Socket::socketHandle. + */ +static void put_socket (JNIEnv *env, + jobject obj, + void *s) +{ + ensure_socket (env, obj); + env->SetLongField (obj, socket_handle_fid, (jlong) s); +} + +/** + * Get the value of contextHandle for the Java Context associated with + * this Java Socket object. + */ +static void *fetch_context (JNIEnv *env, + jobject context) +{ + static jmethodID get_context_handle_mid = NULL; + + if (get_context_handle_mid == NULL) { + jclass cls = env->GetObjectClass (context); + assert (cls); + + get_context_handle_mid = env->GetMethodID (cls, + "getContextHandle", + "()J"); + env->DeleteLocalRef (cls); + assert (get_context_handle_mid); + } + + void *zmq_ctx = (void*) env->CallLongMethod (context, + get_context_handle_mid); + if (env->ExceptionCheck ()) { + zmq_ctx = NULL; + } + + assert (zmq_ctx); + return zmq_ctx; +} + +/** + * Raise an exception that includes 0MQ's error message. + */ static void raise_exception (JNIEnv *env, int err) { // Get exception class. @@ -41,46 +110,49 @@ static void raise_exception (JNIEnv *env, int err) // Raise the exception. int rc = env->ThrowNew (exception_class, err_msg); - assert (rc == 0); - - // Free the local ref. env->DeleteLocalRef (exception_class); + + assert (rc == 0); } -JNIEXPORT void JNICALL Java_org_zmq_Socket_construct (JNIEnv *env, jobject obj, - jobject context, jint type) +/** + * Called to construct a Java Socket object. + */ +JNIEXPORT void JNICALL Java_org_zmq_Socket_construct (JNIEnv *env, + jobject obj, + jobject context, + jint type) { - if (socket_handle_fid == NULL) { - jclass cls = env->GetObjectClass (obj); - assert (cls); - socket_handle_fid = env->GetFieldID (cls, "socketHandle", "J"); - assert (socket_handle_fid); - env->DeleteLocalRef (cls); - } + void *s = get_socket (env, obj); + assert (! s); - if (create_socket_mid == NULL) { - jclass cls = env->FindClass ("org/zmq/Context"); - assert (cls); - create_socket_mid = env->GetMethodID (cls, "createSocket", "(I)J"); - assert (create_socket_mid); - env->DeleteLocalRef (cls); - } - - void *s = (void*) env->CallLongMethod (context, create_socket_mid, type); - if (env->ExceptionCheck ()) - return; + void *zmq_ctx = fetch_context (env, context); + s = zmq_socket (zmq_ctx, type); + put_socket(env, obj, s); - env->SetLongField (obj, socket_handle_fid, (jlong) s); + if (s == NULL) { + raise_exception (env, errno); + return; + } } -JNIEXPORT void JNICALL Java_org_zmq_Socket_finalize (JNIEnv *env, jobject obj) +/** + * Called to destroy a Java Socket object. + */ +JNIEXPORT void JNICALL Java_org_zmq_Socket_finalize (JNIEnv *env, + jobject obj) { - void *s = (void*) env->GetLongField (obj, socket_handle_fid); + void *s = get_socket (env, obj); assert (s); + int rc = zmq_close (s); + put_socket (env, obj, NULL); assert (rc == 0); } +/** + * Called by Java's Socket::setsockopt(int option, long optval). + */ JNIEXPORT void JNICALL Java_org_zmq_Socket_setsockopt__IJ (JNIEnv *env, jobject obj, jint option, jlong optval) { @@ -93,7 +165,7 @@ JNIEXPORT void JNICALL Java_org_zmq_Socket_setsockopt__IJ (JNIEnv *env, case ZMQ_RECOVERY_IVL: case ZMQ_MCAST_LOOP: { - void *s = (void*) env->GetLongField (obj, socket_handle_fid); + void *s = get_socket (env, obj); assert (s); int64_t value = optval; @@ -108,8 +180,14 @@ JNIEXPORT void JNICALL Java_org_zmq_Socket_setsockopt__IJ (JNIEnv *env, } } +/** + * Called by Java's Socket::setsockopt(int option, String optval). + */ JNIEXPORT void JNICALL Java_org_zmq_Socket_setsockopt__ILjava_lang_String_2 ( - JNIEnv *env, jobject obj, jint option, jstring optval) + JNIEnv *env, + jobject obj, + jint option, + jstring optval) { switch (option) { case ZMQ_IDENTITY: @@ -121,8 +199,8 @@ JNIEXPORT void JNICALL Java_org_zmq_Socket_setsockopt__ILjava_lang_String_2 ( return; } - void *s = (void*) env->GetLongField (obj, socket_handle_fid); - assert (s); + void *s = get_socket (env, obj); + assert (s); const char *value = env->GetStringUTFChars (optval, NULL); assert (value); @@ -138,10 +216,14 @@ JNIEXPORT void JNICALL Java_org_zmq_Socket_setsockopt__ILjava_lang_String_2 ( } } -JNIEXPORT void JNICALL Java_org_zmq_Socket_bind (JNIEnv *env, jobject obj, - jstring addr) +/** + * Called by Java's Socket::bind(String addr). + */ +JNIEXPORT void JNICALL Java_org_zmq_Socket_bind (JNIEnv *env, + jobject obj, + jstring addr) { - void *s = (void*) env->GetLongField (obj, socket_handle_fid); + void *s = get_socket (env, obj); assert (s); if (addr == NULL) { @@ -162,10 +244,14 @@ JNIEXPORT void JNICALL Java_org_zmq_Socket_bind (JNIEnv *env, jobject obj, raise_exception (env, errno); } -JNIEXPORT void JNICALL Java_org_zmq_Socket_connect (JNIEnv *env, jobject obj, - jstring addr) +/** + * Called by Java's Socket::connect(String addr). + */ +JNIEXPORT void JNICALL Java_org_zmq_Socket_connect (JNIEnv *env, + jobject obj, + jstring addr) { - void *s = (void*) env->GetLongField (obj, socket_handle_fid); + void *s = get_socket (env, obj); assert (s); if (addr == NULL) { @@ -186,10 +272,15 @@ JNIEXPORT void JNICALL Java_org_zmq_Socket_connect (JNIEnv *env, jobject obj, raise_exception (env, errno); } -JNIEXPORT jboolean JNICALL Java_org_zmq_Socket_send (JNIEnv *env, jobject obj, - jbyteArray msg, jlong flags) +/** + * Called by Java's Socket::send(byte [] msg, long flags). + */ +JNIEXPORT jboolean JNICALL Java_org_zmq_Socket_send (JNIEnv *env, + jobject obj, + jbyteArray msg, + jlong flags) { - void *s = (void*) env->GetLongField (obj, socket_handle_fid); + void *s = get_socket (env, obj); assert (s); jsize size = env->GetArrayLength (msg); @@ -222,9 +313,13 @@ JNIEXPORT jboolean JNICALL Java_org_zmq_Socket_send (JNIEnv *env, jobject obj, return JNI_TRUE; } -JNIEXPORT void JNICALL Java_org_zmq_Socket_flush (JNIEnv *env, jobject obj) +/** + * Called by Java's Socket::flush(). + */ +JNIEXPORT void JNICALL Java_org_zmq_Socket_flush (JNIEnv *env, + jobject obj) { - void *s = (void*) env->GetLongField (obj, socket_handle_fid); + void *s = get_socket (env, obj); assert (s); int rc = zmq_flush (s); @@ -235,10 +330,14 @@ JNIEXPORT void JNICALL Java_org_zmq_Socket_flush (JNIEnv *env, jobject obj) } } -JNIEXPORT jbyteArray JNICALL Java_org_zmq_Socket_recv (JNIEnv *env, jobject obj, - jlong flags) +/** + * Called by Java's Socket::recv(long flags). + */ +JNIEXPORT jbyteArray JNICALL Java_org_zmq_Socket_recv (JNIEnv *env, + jobject obj, + jlong flags) { - void *s = (void*) env->GetLongField (obj, socket_handle_fid); + void *s = get_socket (env, obj); assert (s); zmq_msg_t message; @@ -258,8 +357,10 @@ JNIEXPORT jbyteArray JNICALL Java_org_zmq_Socket_recv (JNIEnv *env, jobject obj, jbyteArray data = env->NewByteArray (zmq_msg_size (&message)); assert (data); - env->SetByteArrayRegion (data, 0, zmq_msg_size (&message), - (jbyte*) zmq_msg_data (&message)); + env->SetByteArrayRegion (data, + 0, + zmq_msg_size (&message), + (jbyte*) zmq_msg_data (&message)); return data; } |