From 8a64c855d6b39383104939877d3248571d949c71 Mon Sep 17 00:00:00 2001 From: Martin Vajnar Date: Fri, 26 Jul 2013 10:44:46 +0200 Subject: [PATCH] JORTE: improve ByteOrder handling Store the ByteOrder of MessageData's ByteBuffer in receive callback structure in C (in case someone reuses already created MessageData instance with new subscriber). Force native byte order setting in publisher. --- orte/include/jorte/org_ocera_orte_Subscription.h | 2 +- orte/java/src/org/ocera/orte/Publication.java | 2 ++ orte/java/src/org/ocera/orte/Subscription.java | 3 +++ orte/libjorte/JORTESubscriptionCreate.c | 3 ++- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/orte/include/jorte/org_ocera_orte_Subscription.h b/orte/include/jorte/org_ocera_orte_Subscription.h index 11abfa3..9b7598c 100644 --- a/orte/include/jorte/org_ocera_orte_Subscription.h +++ b/orte/include/jorte/org_ocera_orte_Subscription.h @@ -13,7 +13,7 @@ extern "C" { * Signature: (JIILjava/lang/String;Ljava/lang/String;ILorg/ocera/orte/types/MessageData;Lorg/ocera/orte/types/NtpTime;Lorg/ocera/orte/types/NtpTime;Lorg/ocera/orte/SubscriptionCallback;J)J */ JNIEXPORT jlong JNICALL Java_org_ocera_orte_Subscription_jORTESubscriptionCreate - (JNIEnv *, jobject, jlong, jint, jint, jstring, jstring, jobject, jobject, jobject, jobject, jobject, jlong); + (JNIEnv *, jobject, jlong, jint, jint, jstring, jstring, jobject, jint, jobject, jobject, jobject, jobject, jlong); /* * Class: org_ocera_orte_Subscription diff --git a/orte/java/src/org/ocera/orte/Publication.java b/orte/java/src/org/ocera/orte/Publication.java index 4eab469..c39a5dc 100644 --- a/orte/java/src/org/ocera/orte/Publication.java +++ b/orte/java/src/org/ocera/orte/Publication.java @@ -24,6 +24,7 @@ package org.ocera.orte; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import org.ocera.orte.types.*; @@ -63,6 +64,7 @@ public class Publication { PublProp publProp, MessageData instance) { + instance.getBuffer().order(ByteOrder.nativeOrder()); this.handle = jORTEPublicationCreate(d.handle, publProp.getTopic(), publProp.getTypeName(), diff --git a/orte/java/src/org/ocera/orte/Subscription.java b/orte/java/src/org/ocera/orte/Subscription.java index 68af0f4..485f9e3 100644 --- a/orte/java/src/org/ocera/orte/Subscription.java +++ b/orte/java/src/org/ocera/orte/Subscription.java @@ -24,6 +24,7 @@ package org.ocera.orte; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import org.ocera.orte.types.*; @@ -58,6 +59,7 @@ public class Subscription { subsProp.getTopic(), subsProp.getTypeName(), message.getBuffer(), + message.getBuffer().order().equals(ByteOrder.BIG_ENDIAN) ? 0 : 1, message, subsProp.getDeadline(), subsProp.getMinSeparation(), @@ -193,6 +195,7 @@ public class Subscription { String topic, String typeName, ByteBuffer buffer, + int byte_order, MessageData message, NtpTime deadline, NtpTime minSeparation, diff --git a/orte/libjorte/JORTESubscriptionCreate.c b/orte/libjorte/JORTESubscriptionCreate.c index e8ee56d..599f9c8 100644 --- a/orte/libjorte/JORTESubscriptionCreate.c +++ b/orte/libjorte/JORTESubscriptionCreate.c @@ -328,6 +328,7 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate jstring jtopic, // subs topic jstring jtname, // subs typeName jobject jinstance, // direct ByteBuffer + jint jbyteOrder,// byte order of ByteBuffer jobject obj_msg, // messageData instance jobject jdeadline, jobject jminSeparation, @@ -385,7 +386,7 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate #endif } callback_cont->jvm = jvm; - callback_cont->cur_endian = FLAG_ENDIANNESS; + callback_cont->cur_endian = (CDR_Endianness) jbyteOrder; // create global references callback_cont->obj = (*env)->NewGlobalRef(env, obj_callback); // -- 2.39.2