]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/libjorte/JORTETypeRegisterAdd.c
JORTE: add deserialize function to support endianness setting
[orte.git] / orte / libjorte / JORTETypeRegisterAdd.c
index 73e9c640ad6080bbe9424df5de4d4a4dae3d6c69..f5e6718c2e01c9335ae63e62d4bdf49caa8e258c 100644 (file)
   *
   */
 
-
+#include <jni.h>
+#include <string.h>
 // library header file's path
 #include "orte.h"
 // pregenerated header
 #include "jorte/org_ocera_orte_DomainApp.h"
+#include "jorte/jorte_protos_api.h"
 #include "jorte/4all.h"
 
+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;
+
+  //set byte order only once
+  if(byte_buf) {
+    // get environment
+    (*javavm)->AttachCurrentThread(javavm, (void **)&env, NULL);
+    if(env == 0)
+    {
+      #ifdef TEST_STAGE
+       printf(":!c: env = NULL \n");
+      #endif
+    }
+
+    //prepare ByteOrder
+    cls = (*env)->FindClass(env, "java/nio/ByteOrder");
+    if (cls == 0) {
+      #ifdef TEST_STAGE
+        printf(":!c: cls = NULL \n");
+      #endif
+    }
+    if(cdrCodec->data_endian == BigEndian) {
+      fid = (*env)->GetStaticFieldID(env,
+                                        cls,
+                                        "BIG_ENDIAN",
+                                        "Ljava/nio/ByteOrder;");
+    }
+    else {
+      fid = (*env)->GetStaticFieldID(env,
+                                        cls,
+                                        "LITTLE_ENDIAN",
+                                        "Ljava/nio/ByteOrder;");
+    }
+    if(fid == 0) {
+      #ifdef TEST_STAGE
+           printf(":!c: fid = NULL \n");
+         #endif
+    }
+    obj_bo = (*env)->GetStaticObjectField(env, cls, fid);
+    if(obj_bo == 0) {
+      #ifdef TEST_STAGE
+           printf(":!c: cls = NULL \n");
+         #endif
+    }
+
+    // set byte order to ByteBuffer
+    // get BB class
+    cls = (*env)->GetObjectClass(env, byte_buf);
+    if(cls == 0)
+    {
+      #ifdef TEST_STAGE
+        printf(":!c: cls = NULL \n");
+      #endif
+    }
+    // get methodID - order(ByteOrder)
+    mid = (*env)->GetMethodID(env,
+                             cls,
+                             "order",
+                             "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;");
+    if(mid == 0)
+    {
+      #ifdef TEST_STAGE
+        printf(":!c: mid = NULL \n");
+      #endif
+    }
+
+    // set ByteOrder
+    if((*env)->CallObjectMethod(env,byte_buf,mid,obj_bo) == 0)
+    {
+      #ifdef TEST_STAGE
+        printf(":!c: set byte order failed.. \n");
+      #endif
+    }
+
+    // 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
 Java_org_ocera_orte_DomainApp_jORTETypeRegisterAdd
-(JNIEnv *env, jclass cls, jlong handle, jstring jname, jlong jlength)
+(JNIEnv *env, jclass cls, jlong handle, jstring jname, jlong jlength, jobject obj_bb)
 {
   const char     *name;
   int            b;
@@ -45,11 +141,14 @@ Java_org_ocera_orte_DomainApp_jORTETypeRegisterAdd
   b = ORTETypeRegisterAdd((ORTEDomain *) handle,
                           name,
                           NULL,
-                          NULL,
+                          (ORTETypeDeserialize)deserialize,
                           NULL,
                           (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);