]> rtime.felk.cvut.cz Git - orte.git/commitdiff
ORTE,JORTE: set byte order of ByteBuffer from receive callback
authorMartin Vajnar <martin.vajnar@gmail.com>
Fri, 26 Jul 2013 08:00:15 +0000 (10:00 +0200)
committerMartin Vajnar <martin.vajnar@gmail.com>
Fri, 26 Jul 2013 08:00:15 +0000 (10:00 +0200)
Pass data_endian in ORTERecvInfo structure and use it to set the byte order
of Java's ByteBuffer.

orte/include/jorte/jorte_typedefs_defines.h
orte/include/orte/typedefs_api.h
orte/libjorte/JORTESubscriptionCreate.c
orte/libjorte/JORTESubscriptionDestroy.c
orte/liborte/RTPSCSTReaderProc.c

index e6f50fa56c9180f3aacc789c8141365d4fbed8f2..cb0f50d3ffbd031e46eede36b6bc7ccbe4077e34 100644 (file)
@@ -27,6 +27,8 @@ typedef struct
  jobject        obj;
  jobject        rinfo;
  jobject        msg;
+ jobject        obj_buf;  // byte buffer object
+ CDR_Endianness cur_endian;
 } JORTECallbackContext_t;
 
 
index 7d45bb9ebd8cfeabc4a34c3592bfd94631a4334b..c18c7934ecbce0683d15c124f13ea220bb3211ac 100644 (file)
@@ -349,6 +349,7 @@ typedef struct ORTESubsStatus {
  * @localTimeReceived: local timestamp when data were received
  * @remoteTimePublished: remote timestam when data were published
  * @sn: sequencial number of data 
+ * @data_endian: endianness of received data
  */
 typedef struct ORTERecvInfo {
   ORTERecvStatus        status;
@@ -358,6 +359,7 @@ typedef struct ORTERecvInfo {
   NtpTime               localTimeReceived;
   NtpTime               remoteTimePublished;
   SequenceNumber        sn;
+  CDR_Endianness        data_endian;
 } ORTERecvInfo;
 
 /**
index c7475aa26678d9a862e55fa187349c47207a8b29..e8ee56db2d1093975cc8f64bf691a2259c67c949 100644 (file)
@@ -30,7 +30,7 @@
 #include <inttypes.h>
 
 // library header file's path
-#include "orte.h"
+#include "orte_all.h"
 // pregenerated header
 #include "jorte/org_ocera_orte_Subscription.h"
 // enable TEST_STAGE run level
@@ -53,6 +53,8 @@ recvCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam)
   jclass           cls_msg = 0;
   jobject          rinfo = 0;
   jobject          obj_msg;
+  jobject          obj_bo = 0;
+  jfieldID         fid = 0;
   jmethodID        mid = 0;
   jmethodID        mid_callback = 0;
   //
@@ -83,6 +85,71 @@ recvCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam)
       break;
     }
     //
+    // set byte order only if it differs from that currently set
+    if(info->data_endian != callback_cont->cur_endian) {
+      //prepare ByteOrder
+      cls = (*env)->FindClass(env, "java/nio/ByteOrder");
+      if (cls == 0) {
+        #ifdef TEST_STAGE
+          printf(":!c: cls = NULL \n");
+        #endif
+      }
+      if(info->data_endian == BigEndian) {
+        fid = (*env)->GetStaticFieldID(env,
+                                       cls,
+                                       "BIG_ENDIAN",
+                                       "Ljava/nio/ByteOrder;");
+        callback_cont->cur_endian = BigEndian;
+      }
+      else {
+        fid = (*env)->GetStaticFieldID(env,
+                                       cls,
+                                       "LITTLE_ENDIAN",
+                                       "Ljava/nio/ByteOrder;");
+        callback_cont->cur_endian = LittleEndian;
+      }
+      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, callback_cont->obj_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,callback_cont->obj_buf,mid,obj_bo) == 0)
+      {
+        #ifdef TEST_STAGE
+          printf(":!c: set byte order failed.. \n");
+        #endif
+      }
+    }
+    //
     if(callback_cont->obj == 0)
     {
       #ifdef TEST_STAGE
@@ -318,6 +385,7 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
       #endif
     }
     callback_cont->jvm = jvm;
+    callback_cont->cur_endian = FLAG_ENDIANNESS;
     // create global references
     callback_cont->obj = (*env)->NewGlobalRef(env, obj_callback);
     //
@@ -329,6 +397,16 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
       break;
     }
     // create global references
+    callback_cont->obj_buf = (*env)->NewGlobalRef(env, jinstance);
+    //
+    if (callback_cont->obj_buf == 0)
+    {
+      #ifdef TEST_STAGE
+        printf(":c: global reference not created! \n");
+      #endif
+      break;
+    }
+    // create global references
     callback_cont->msg = (*env)->NewGlobalRef(env, obj_msg);
     //
     if (callback_cont->msg == 0)
index dd8e6062f11567dd54df87ad9348abbb496c5ad6..c53653f391e24905d098730eba559ce49a946a72 100644 (file)
@@ -116,6 +116,13 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionDestroy
         #endif
         (*env)->DeleteGlobalRef(env, ctx->msg);
       }
+      if(ctx->obj_buf)
+      {
+        #ifdef TEST_STAGE
+          printf(":c: deleting ctx->obj_buf\n");
+        #endif
+        (*env)->DeleteGlobalRef(env, ctx->obj_buf);
+      }
       //
       free((void*)h);
     }
index 0abd3ba03069c471283e3af04384fafb83905b89..1adbfd14f28a03757481a9592bf119b2ec19eeb4 100644 (file)
@@ -236,6 +236,7 @@ CSTReaderNewData(CSTRemoteWriter *cstRemoteWriter,
     info.localTimeReceived=csChange->localTimeReceived;
     info.remoteTimePublished=csChange->remoteTimePublished;
     info.sn=csChange->sn;
+    info.data_endian=csChange->cdrCodec.data_endian;
     objectEntryOID->recvCallBack(&info,
                             objectEntryOID->instance,
                             objectEntryOID->callBackParam);