]> rtime.felk.cvut.cz Git - orte.git/commitdiff
Revert "JORTE: switch from deserialize function to endianness callback"
authorMartin Vajnar <martin.vajnar@gmail.com>
Fri, 26 Jul 2013 07:53:38 +0000 (09:53 +0200)
committerMartin Vajnar <martin.vajnar@gmail.com>
Fri, 26 Jul 2013 07:53:38 +0000 (09:53 +0200)
This reverts commit fe36c69fd0d022fafc9acf3a51ca1ba780978f35.

orte/include/jorte/jorte_typedefs_defines.h
orte/libjorte/JORTETypeRegisterAdd.c
orte/libjorte/onLoad.c

index 37230ca63f48347a4a7d2aa4bff00d4038f68e4e..e6f50fa56c9180f3aacc789c8141365d4fbed8f2 100644 (file)
@@ -37,14 +37,6 @@ typedef struct
 } JORTEDomainEventsContext_t;
 
 
-typedef struct
-{
- JavaVM        *jvm;
- jobject        obj_buf;  // byte buffer object
- CDR_Endianness cur_endian;
-} JORTESetEndiannessContext_t;
-
-
 typedef enum {
         ON_REG_FAIL       = 1,
         ON_MGR_NEW        = 2,
index d3d2dca7c024b3b68bc9dd1b83cf84d3e372db3f..f5e6718c2e01c9335ae63e62d4bdf49caa8e258c 100644 (file)
   *
   */
 
-#include <stdlib.h>
 #include <jni.h>
+#include <string.h>
 // library header file's path
-#include "orte_all.h"
+#include "orte.h"
 // pregenerated header
 #include "jorte/org_ocera_orte_DomainApp.h"
-
-#include "jorte/jorte_typedefs_defines.h"
+#include "jorte/jorte_protos_api.h"
 #include "jorte/4all.h"
 
-void set_order(CDR_Codec *cdrCodec, void *param) {
+extern JavaVM *javavm;
+static jobject byte_buf;
+
+void deserialize(CDR_Codec *cdrCodec, void *instance) {
   JNIEnv        *env = 0;
   jclass         cls = 0;
   jfieldID       fid = 0;
   jmethodID      mid = 0;
   jobject        obj_bo = 0;
-  
-  JORTESetEndiannessContext_t *ctx = (JORTESetEndiannessContext_t*) param;
 
   //set byte order only once
-  if(cdrCodec->data_endian != ctx->cur_endian) {
+  if(byte_buf) {
     // get environment
-    (*ctx->jvm)->AttachCurrentThread(ctx->jvm, (void **)&env, NULL);
+    (*javavm)->AttachCurrentThread(javavm, (void **)&env, NULL);
     if(env == 0)
     {
       #ifdef TEST_STAGE
@@ -67,14 +67,12 @@ void set_order(CDR_Codec *cdrCodec, void *param) {
                                         cls,
                                         "BIG_ENDIAN",
                                         "Ljava/nio/ByteOrder;");
-      ctx->cur_endian = BigEndian;
     }
     else {
       fid = (*env)->GetStaticFieldID(env,
                                         cls,
                                         "LITTLE_ENDIAN",
                                         "Ljava/nio/ByteOrder;");
-      ctx->cur_endian = LittleEndian;
     }
     if(fid == 0) {
       #ifdef TEST_STAGE
@@ -90,7 +88,7 @@ void set_order(CDR_Codec *cdrCodec, void *param) {
 
     // set byte order to ByteBuffer
     // get BB class
-    cls = (*env)->GetObjectClass(env, ctx->obj_buf);
+    cls = (*env)->GetObjectClass(env, byte_buf);
     if(cls == 0)
     {
       #ifdef TEST_STAGE
@@ -110,15 +108,24 @@ void set_order(CDR_Codec *cdrCodec, void *param) {
     }
 
     // set ByteOrder
-    if((*env)->CallObjectMethod(env,ctx->obj_buf,mid,obj_bo) == 0)
+    if((*env)->CallObjectMethod(env,byte_buf,mid,obj_bo) == 0)
     {
       #ifdef TEST_STAGE
         printf(":!c: set byte order failed.. \n");
       #endif
     }
 
-    (*ctx->jvm)->DetachCurrentThread(ctx->jvm);
+    // delete global reference
+    (*env)->DeleteGlobalRef(env, byte_buf);
+    byte_buf = 0;
+
+    (*javavm)->DetachCurrentThread(javavm);
   }
+
+  //copy over the message instance
+  memcpy(instance,
+         cdrCodec->buffer,
+         cdrCodec->buf_len);
 }
 
 JNIEXPORT jint JNICALL
@@ -128,46 +135,20 @@ Java_org_ocera_orte_DomainApp_jORTETypeRegisterAdd
   const char     *name;
   int            b;
 
-  JORTESetEndiannessContext_t *ctx = 0;
-  
-  jobject        byte_buf = 0;
-  JavaVM         *jvm = 0;
-
-  // TODO free() !
-  ctx = (JORTESetEndiannessContext_t*) malloc(sizeof(JORTESetEndiannessContext_t));
-  if(ctx == 0) {
-    #ifdef TEST_STAGE
-      printf(":c!: ctx = NULL\n");
-    #endif
-  }
-  // create global reference for ByteBuffer
-  // TODO delete global reference
-  byte_buf = (*env)->NewGlobalRef(env, obj_bb);
-  ctx->obj_buf = byte_buf;
-  // get jvm
-  b = (*env)->GetJavaVM(env,&jvm);
-  if (b < 0)
-  {
-    printf(":!c: getJavaVM() failed! \n");
-    return 0;
-  }
-  ctx->jvm = jvm;
-  ctx->cur_endian = FLAG_ENDIANNESS;
-
   // get type name from JAVA env
   name = (*env)->GetStringUTFChars(env,jname,0);
   // call ORTE function
   b = ORTETypeRegisterAdd((ORTEDomain *) handle,
                           name,
                           NULL,
+                          (ORTETypeDeserialize)deserialize,
                           NULL,
-                          NULL,
-                          (unsigned int) jlength,
-                          (ORTETypeProcessEndianness) set_order,
-                          (void*) ctx);
+                          (unsigned int) jlength);
   // free memmory space
   (*env)->ReleaseStringUTFChars(env,jname,name);
 
+  byte_buf = (*env)->NewGlobalRef(env, obj_bb);
+
   #ifdef TEST_STAGE
   printf(":c: jORTETypeRegisterAdd vraci %d [%d = ORTE_OK, %d = ORTE_BAD_HANDLE] \n",
          b,ORTE_OK,ORTE_BAD_HANDLE);
index f7b8e484e129802156fe0474b482b4f73485d4c5..21d56b7120ca82e9e9f79aca90e286cfa31f850b 100644 (file)
@@ -5,6 +5,8 @@ static jmethodID findClassM;
 static jmethodID findLoadedClassM;
 static jobject classLoader;
 
+JavaVM *javavm;
+
 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
   JNIEnv *env;
   jclass testCl;
@@ -13,6 +15,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
   jmethodID getClassLoader;
 
   (*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_6);
+  javavm = vm;
 
   testCl = (*env)->FindClass(env, "org/ocera/orte/JOrte");
   clClass = (*env)->FindClass(env, "java/lang/Class");