#include <stdlib.h>
-#include "jorte/getNtpTime.h"
+#include <inttypes.h>
+#include <string.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
#include "jorte/4all.h"
+// new data types
+#include "jorte/jorte_typedefs_defines.h"
+#include "jorte/jorte_protos_api.h"
-/*
-typedef struct
-{
- JavaVM *jvm;
- jobject obj;
- jobject rinfo;
- int value; // !! pro testovani
-} JORTECallbackContext_t;
-
-
-typedef struct
-{
- jobject obj_recvStatus;
- jobject str_topic;
- jobject str_type;
- jobject obj_guid;
- jobject obj_ntpT_loc;
- jobject obj_ntpT_rem;
- jobject obj_sn;
-} RecvInfoVar_t;
-*/
-#include "jorte/typedefs_defines_jorte.h"
-
-// ### recvCallBack() #########################################################
+/* ****************************************************************** *
+ * CallBack function *
+ * ****************************************************************** */
void
-recvCallBack(const ORTERecvInfo *info,void *vinstance, void *recvCallBackParam)
+recvCallBack(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam)
{
-// char *instance=(char*)vinstance;
-
- JavaVM *jvm;
- JNIEnv *env = NULL; // local reference - Ok
-
- jclass cls = 0; //! local reference
-
- jobject obj = 0; //! local reference
- //jobject obj_recvInfo = 0; //! local reference
- jobject rinfo = 0; //! local reference
- jobject obj_instance = 0;
-
- jmethodID mid = 0; //! local reference
- jmethodID mid_callback = 0; //! local reference
-
- jfieldID fid = 0; //! local reference
- jstring jstr;
- //RecvInfoVar_t *recvInfoVar = (RecvInfoVar_t*)malloc(sizeof(RecvInfoVar_t));
-
- JORTECallbackContext_t *callback_cont = (JORTECallbackContext_t*)recvCallBackParam;
-
- int i = callback_cont->value++; // !! JEN PRO TESTOVACI UCELY
-
-
-
-
+ // jni varialbles
+ JavaVM *jvm = 0;
+ JNIEnv *env = 0;
+ jobject obj_bo = 0;
-#ifdef TEST_STAGE
- printf("\n\n");
- printf(":c: --------------- spustena recvCallBack.. z Ccka ------------------\n");
-#endif
+ JORTECallbackContext_t *callback_cont;
- if(callback_cont->obj == 0) return;
- obj = callback_cont->obj;
-
- if(callback_cont->jvm == 0) return;
- jvm = callback_cont->jvm;
-
- rinfo = callback_cont->rinfo;
-
-
-
-
-#ifdef TEST_STAGE
- printf(":c: recvCallBack: jvm = %p \n", jvm);
- printf(":c: recvCallBack: obj = %p \n", obj);
-#endif
-
- // get env
- (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
- if(!env)
- {
- printf(":!c: recvCallBack: can't get env..\n");
+ // HACK: if the subscriber has been destroyed, return
+ if ((*(JORTECallbackContext_t **)recvCallBackParam) == 0)
return;
- }
-
-#ifdef TEST_STAGE
- printf(":c: recvCallBack: env = %p \n", env);
-#endif
- // get class
- cls = (*env)->GetObjectClass(env,obj);
- if(cls == 0)
- {
- printf(":!c: cannot find callbackObj class..\n");
+ callback_cont = *((JORTECallbackContext_t **)recvCallBackParam);
+
+ #ifdef TEST_STAGE
+ printf("\n\n:c: --------------- recvCallBack called.. --------------- \n");
+ #endif
+
+ do {
+ // set local variables from struct
+ jvm = callback_cont->jvm;
+ // get env
+ if ((*jvm)->AttachCurrentThread(jvm,
+ #ifdef __ANDROID__
+ &env,
+ #else
+ (void **)&env,
+ #endif
+ NULL) != JNI_OK) {
+ #ifdef TEST_STAGE
+ printf(":!c: recvCallBack: AttachCurrentThread() failed \n");
+ #endif
return;
}
- // create global reference
-
-#ifdef TEST_STAGE
- printf(":c: recvCallBack: volana fce GetMethodID().. \n");
-#endif
- // get method ID
- mid = (*env)->GetMethodID(env,
- cls,
- "callback",
- "(Lorg/ocera/orte/types/RecvInfo;Ljava/lang/Object;)V");
- // "(Lorg/ocera/orte/types/RecvInfo;Ljava/lang/Object;)V");
- // create global reference to callback method
- if(mid == 0)
- {
- printf(":!c: can not find callback() method...\n");
- return;
+ // set byte order only if it differs from that currently set
+ if (info->data_endian != callback_cont->cur_endian) {
+ if (info->data_endian == BigEndian) {
+ obj_bo = callback_cont->obj_BO_BE;
+ callback_cont->cur_endian = BigEndian;
+ } else {
+ obj_bo = callback_cont->obj_BO_LE;
+ callback_cont->cur_endian = LittleEndian;
+ }
+
+ // set byte order to ByteBuffer
+ (*env)->CallObjectMethod(env, callback_cont->obj_buf, callback_cont->mid_order, obj_bo);
}
- mid_callback = mid;
-
-#ifdef TEST_STAGE
- printf(":c: recvCallBack: obj = %p \n", obj);
- printf(":c: recvCallBack: cls = %p \n", cls);
- printf(":c: recvCallBack: mid = %p \n", mid);
- //
-#endif
-
-// -- vytvoreni parametru callback funkce ---------------------------------------------
-// vytvorit objekt RecvInfo - global ref
+ #ifdef TEST_STAGE
+ printf(":c: #0 \n");
+ printf(":c: env = %#" PRIxPTR ", obj_msg = %#" PRIxPTR " \n", (intptr_t)env, (intptr_t)callback_cont->msg);
+ #endif
+ ////////////////////////////////////////////////////
+ memcpy(callback_cont->info_buf, (void *)info, sizeof(ORTERecvInfo));
+ ////////////////////////////////////////////////////
- // get object RecvInfo class
- cls = (*env)->FindClass(env, "org/ocera/orte/types/RecvInfo");
- if(!cls)
- {
- printf(":!c: cls RecvInfo class not found..\n");
- return; // ma se pri selhani RecvInfa davat tvrdy return?
- }
-
- // create RecvInfo object
- if (rinfo == 0)
- {
- // call object constructor
- mid = (*env)->GetMethodID(env, cls, "<init>", "()V");
- if(!mid)
- {
- printf(":!c: constructor RecvInfo() not found..\n");
- return; // ma se pri selhani RecvInfa davat tvrdy return?
- }
- // new object
- rinfo = (*env)->NewObject(env, cls, mid);
- if(!rinfo)
- {
- printf(":!c: obj_recvInfo not created..\n");
- return;
- }
- #ifdef TEST_STAGE
- printf(":c: object RecvInfo created..\n");
- #endif
- // create global reference
- callback_cont->rinfo = (*env)->NewGlobalRef(env, rinfo);
- if (callback_cont->rinfo == 0)
- {
- printf(":!c: cannot create global reference callback_cont->rinfo ..\n");
- return;
- }
+ // control print - only in TEST_STAGE
#ifdef TEST_STAGE
- printf(":c: global reference to object RecvInfo created..\n");
+ printf(":c: rinfo created :] \n");
+ printf(":c:----- ORTERecvInfo members ------ \n");
+ printf(":c: recvStatus: %#x \n", info->status);
+ printf(":c: senderGuid: hid = %#" PRIx32 ", aid = %#" PRIx32 ", oid = %#" PRIx32 " \n",
+ info->senderGUID.hid, info->senderGUID.aid, info->senderGUID.oid);
+ printf(":c: topic: %s \n", info->topic);
+ printf(":c: type: %s \n", info->type);
+ printf(":c: localTimeRecv: sec = %" PRId32 ", fract = %" PRIu32 " \n",
+ info->localTimeReceived.seconds, info->localTimeReceived.fraction);
+ printf(":c: remoteTimePub: sec = %" PRId32 ", fract = %" PRIu32 " \n",
+ info->remoteTimePublished.seconds, info->remoteTimePublished.fraction);
+ printf(":c: seqNr: high = %" PRId32 ", low = %" PRIu32 " \n", info->sn.high, info->sn.low);
+ printf(":c:---------------------------------- \n");
#endif
- }
-
-
-
-//--------------------------------------------------------------------
-// set RecvInfo fields
-
-#ifdef TEST_STAGE
-//*** int i - testovaci
- // get field ID
- fid = (*env)->GetFieldID(env,cls,"i","I");
- if(fid == NULL)
- {
- printf(":!c: cannot get ReccvInfo.i fieldID..\n");
- return; // je toto nutne??
- }
- printf(":c: fid of ReccvInfo.i found..\n");
- // set new value '1234'
- (*env)->SetIntField(env,callback_cont->rinfo,fid,i++);
- printf(":c: kontrola prirazeni %d \n",
- (*env)->GetIntField(env,callback_cont->rinfo,fid));
- printf(":c: new value of RecvInfo.i set..\n");
-#endif
-
-
+ ////////////////////////////////////////////////////
+ // update MessageData instance
+ // call method
+ (*env)->CallVoidMethod(env,
+ callback_cont->msg,
+ callback_cont->mid_read);
-//*** RecvStatus
+ /* *************************** *
+ * call JAVA CallBack method *
+ * *************************** */
#ifdef TEST_STAGE
- printf("\n");
- printf(":c: ---- RecvInfo [odesilane]:\n");
+ printf(":c: volam callback metodu.. halo jsi tam?? \n");
#endif
+ // call object's method
+ (*env)->CallVoidMethod(env,
+ callback_cont->obj, /*obj*/
+ callback_cont->mid_callback,
+ callback_cont->rinfo,
+ callback_cont->msg);
+ } while (0);
+
+ // detach current thread
+ if ((*jvm)->DetachCurrentThread(jvm) != JNI_OK)
+ printf(":c!: DetachCurrentThread failed! \n");
+ //
+ #ifdef TEST_STAGE
+ printf(":c: ------------ thats all from recvCallBack ------------ \n\n");
+ #endif
+}
- // get method ID
- mid = (*env)->GetMethodID(env,
- cls,
- "setRecvStatus",
- "(I)V");
- if(mid == 0)
- {
- printf(":!c: can not find setRecvStatus() method...\n");
- return;
+/* ****************************************************************** *
+ * native method *
+ * ****************************************************************** */
+JNIEXPORT jlong JNICALL
+Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
+ (JNIEnv *env,
+ jobject obj,
+ jlong dhandle, // appDomain handle
+ jint jsmode, // subs mode
+ jint jstype, // subs type
+ 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,
+ jobject obj_callback,
+ jlong j_multicastIP)
+{
+ // jni variables
+ JavaVM *jvm;
+ jfieldID fid;
+ jclass cls;
+ jmethodID mid;
+ jobject obj_info_buffer;
+ // orte variables
+ ORTESubscription *s = 0;
+ ORTEDomain *d;
+ SubscriptionMode smode;
+ SubscriptionType stype;
+ NtpTime deadline;
+ NtpTime minSeparation;
+ // jorte variable
+ JORTECallbackContext_t *callback_cont;
+ JORTECallbackContext_t **callback_cont_ptr;
+
+ // standart variables
+ const char *topic = 0;
+ const char *typename = 0;
+ void *buffer;
+ int flag_ok = 0;
+
+ /* HACK: allocate space for callback context structure and than for a pointer to it */
+
+ // memory alocation
+ // don't forget use free() funct.!!
+ callback_cont = (JORTECallbackContext_t *)malloc(sizeof(JORTECallbackContext_t));
+ callback_cont_ptr = (JORTECallbackContext_t **)malloc(sizeof(JORTECallbackContext_t *));
+ *callback_cont_ptr = callback_cont;
+
+ do {
+
+ // get direct ByteBuffer pointer from Java
+ buffer = (*env)->GetDirectBufferAddress(env, jinstance);
+ // check obj_callback
+ if (obj_callback == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: obj_callback = NULL \n");
+ #endif
+ break;
}
- // call method
- (*env)->CallVoidMethod(env,
- callback_cont->rinfo,
- mid,
- (jint)info->status);
-
-//*** topic
- // Look for the instance field s in cls
- fid = (*env)->GetFieldID(env,
- cls,
- "topic",
- "Ljava/lang/String;");
- if (fid == NULL)
- {
- printf(":!c: can not find 'topic' field ID...\n");
- return; // failed to find the field
+ // get jvm
+ jint b = (*env)->GetJavaVM(env, &jvm);
+ if (b == JNI_OK) {
+ #ifdef TEST_STAGE
+ printf(":c: getJavaVM succesfull.. \n");
+ #endif
+ } else {
+ #ifdef TEST_STAGE
+ printf(":!c: getJavaVM() failed! \n");
+ #endif
+ break;
}
- // Read the instance field s
- jstr = (*env)->GetObjectField(env, obj, fid);
- // Create a new string and overwrite the instance field
- jstr = (*env)->NewStringUTF(env, info->topic);
- if (jstr == NULL)
- {
- return;
- /* out of memory */
+ callback_cont->jvm = jvm;
+ callback_cont->cur_endian = (CDR_Endianness)jbyteOrder;
+ // create global references
+ callback_cont->obj = (*env)->NewGlobalRef(env, obj_callback);
+ //
+ if (callback_cont->obj == 0) {
+ #ifdef TEST_STAGE
+ printf(":c: global reference not created! \n");
+ #endif
+ break;
}
- (*env)->SetObjectField(env, callback_cont->rinfo, fid, jstr);
-
-
-
-//*** type
- // Look for the instance field s in cls
- fid = (*env)->GetFieldID(env,
- cls,
- "type",
- "Ljava/lang/String;");
- if (fid == NULL)
- {
- printf(":!c: can not find 'type' field ID...\n");
- return; // failed to find the field
+ // get ReceiveCallback class
+ cls = (*env)->GetObjectClass(env, callback_cont->obj);
+ if (cls == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: cls = NULL \n");
+ #endif
+ break;
}
- // Read the instance field s
- jstr = (*env)->GetObjectField(env, obj, fid);
- // Create a new string and overwrite the instance field
- jstr = (*env)->NewStringUTF(env, info->type);
- if (jstr == NULL)
- {
- printf(":!c: can not set new value 'type'..\n");
- return;
- /* out of memory*/
+ // get callback method ID
+ callback_cont->mid_callback = (*env)->GetMethodID(env,
+ cls,
+ "callback",
+ "(Lorg/ocera/orte/types/RecvInfo;Lorg/ocera/orte/types/MessageData;)V");
+ if (callback_cont->mid_callback == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: mid_callback = NULL \n");
+ #endif
+ break;
}
- (*env)->SetObjectField(env, callback_cont->rinfo, fid, jstr);
-
-
-
-//*** GUID_RTPS
- mid = (*env)->GetMethodID(env,
- cls,
- "setSenderGuid",
- "(JJJ)V");
- if(mid == 0)
- {
- printf(":!c: can not find setSenderGuid() method...\n");
- return;
+ // 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;
}
- // call method
- (*env)->CallVoidMethod(env,
- callback_cont->rinfo,
- mid,
- (jlong)info->senderGUID.hid,
- (jlong)info->senderGUID.aid,
- (jlong)info->senderGUID.oid);
-
-
-//*** localTimeRecv
- // get method ID
- mid = (*env)->GetMethodID(env,
- cls,
- "setLocalTimeRecv",
- "(IJ)V");
- if(mid == 0)
- {
- printf(":!c: can not find setLocalTimeRecv() method...\n");
- return;
+ // create global references
+ callback_cont->msg = (*env)->NewGlobalRef(env, obj_msg);
+ //
+ if (callback_cont->msg == 0) {
+ #ifdef TEST_STAGE
+ printf(":c: global reference not created! \n");
+ #endif
+ break;
}
- // call method
- (*env)->CallVoidMethod(env,
- callback_cont->rinfo,
- mid,
- (jint) info->localTimeReceived.seconds,
- (jlong)info->localTimeReceived.fraction);
-
-
-
-//*** remoteTimePublished
- // get method ID
- mid = (*env)->GetMethodID(env,
- cls,
- "setRemoteTimePub",
- "(IJ)V");
- if(mid == 0)
- {
- printf(":!c: can not find setRemoteTimePub() method...\n");
- return;
+ // get MessageData class
+ cls = (*env)->GetObjectClass(env, callback_cont->msg);
+ if (cls == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: cls_msg = NULL \n");
+ #endif
+ break;
}
- // call method
- (*env)->CallVoidMethod(env,
- callback_cont->rinfo,
- mid,
- (jint) info->remoteTimePublished.seconds,
- (jlong)info->remoteTimePublished.fraction);
-
-
-//*** Sequence number
- // get method ID
- mid = (*env)->GetMethodID(env,
- cls,
- "setSeqNumber",
- "(II)V");
- if(mid == 0)
- {
- printf(":!c: can not find setSeqNumber() method...\n");
- return;
+ /////////////////////////////////////////////////////
+ // methodID - read()
+ callback_cont->mid_read = (*env)->GetMethodID(env,
+ cls,
+ "read",
+ "()V");
+ if (callback_cont->mid_read == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: mid_read = NULL \n");
+ #endif
+ break;
}
- // call method
- (*env)->CallVoidMethod(env,
- callback_cont->rinfo,
- mid,
- info->sn.high,
- info->sn.low);
-
- #ifdef TEST_STAGE
- printf(":c: recvStatus: %d \n", info->status);
- printf(":c: senderGuid: hid = %d, aid = %d, oid = %d \n",
- info->senderGUID.hid,info->senderGUID.aid,info->senderGUID.oid);
- printf(":c: topic: %s \n",info->topic);
- printf(":c: type: %s \n",info->type);
- printf(":c: localTimeRecv: sec = %d, fract = %d \n",
- info->localTimeReceived.seconds,info->localTimeReceived.fraction);
- printf(":c: remoteTimePub: sec = %d, fract = %d \n",
- info->remoteTimePublished.seconds,info->remoteTimePublished.fraction);
- printf(":c: seqNr: high = %d, low = %d \n",info->sn.high,info->sn.low);
- printf("\n");
+ // init RecvInfo pointer
+ // find cls
+ cls = findClass(env, "org.ocera.orte.types.RecvInfo");
+ if (cls == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: cls = NULL \n");
#endif
-
-
-// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- obj_instance = (jobject)vinstance; //?? pujde to??
-#ifdef TEST_STAGE
- if(!obj_instance) printf(":!c: pretypovani: (jobject)vinstance = NULL..\n");
- else printf(":c: pretypovani: (jobject)vinstance = %p OK ..\n", obj_instance);
-#endif
-
-// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-// -- vytvoreni parametru callback funkce ----------------------------------------end
-
- // call object's method
-#ifdef TEST_STAGE
- printf(":c: volam callback metodu.. halo jsi tam?? \n\n");
-#endif
- (*env)->CallVoidMethod(env,
- callback_cont->obj, /*obj*/
- mid_callback,
- callback_cont->rinfo,
- obj_instance);
-
- if((*jvm)->DetachCurrentThread(jvm)!=0) printf("DetachCurrentThread fault\n");
-
-#ifdef TEST_STAGE
- printf("\n");
- printf("-------------------- opoustim recvCallBack() z Ccka-------------------");
- printf("\n\n\n");
-#endif
-// --funkcni 05-01-13 ------------------------------------------------------------
-
-
-}
-
-// ### END recvCallBack() #####################################################
-
-
-
-
-// ### nativni metoda #########################################################
-
-JNIEXPORT jint JNICALL
-Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
-(JNIEnv *env, jobject obj, jint dhandle, jint jsmode,
- jint jstype, jstring jtopic, jstring jtname, jint jbufflength,
- jobject jdeadline, jobject jminSeparation,
- jobject callbackObj /* recvCallBackparam */, jlong j_multicastIP)
-{
- ORTESubscription *s;
- ORTEDomain *d;
- SubscriptionMode smode;
- SubscriptionType stype;
- const char *topic;
- const char *typename;
- char *instance; // dynamicky naalokovat pole instance2send !!!!!
- NtpTime deadline;
- NtpTime minSeparation;
-
- JavaVM *jvm;
- jfieldID fid;
- jclass cls;
- // callback_cont
- JORTECallbackContext_t *callback_cont = (JORTECallbackContext_t*)malloc(sizeof(JORTECallbackContext_t));
- //RecvInfoVar_t *recvInfoVar = (RecvInfoVar_t*)malloc(sizeof(RecvInfoVar_t));
-
- // bad/zero callbackObj
- if (callbackObj == 0)
- {
- printf(":c!: callbackObj can not be null.. \n");
- return 0;
- }
-
- // get jvm
- jint b = (*env)->GetJavaVM(env,&jvm);
- if (b < 0)
- {
- printf(":!c: getJavaVM() fault..\n");
- return 0;
- }
- if (b == 0)
- {
+ break;
+ }
+ // call object constructor
+ mid = (*env)->GetMethodID(env, cls, "<init>", "()V");
+ if (mid == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: constructor failed! \n");
+ #endif
+ break;
+ }
+ // create new object
+ callback_cont->rinfo = (*env)->NewObject(env, cls, mid);
+ if (callback_cont->rinfo == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: rinfo = NULL \n");
+ #endif
+ break;
+ }
+ // create global reference
+ callback_cont->rinfo = (*env)->NewGlobalRef(env, callback_cont->rinfo);
+ if (callback_cont->rinfo == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: callback_cont->rinfo = NULL \n");
+ #endif
+ break;
+ }
+ // lookup getBuffer() ID
+ mid = (*env)->GetMethodID(env, cls, "getBuffer", "()Ljava/nio/ByteBuffer;");
+ if (mid == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: getBuffer() failed! \n");
+ #endif
+ break;
+ }
+ // get ByteBuffer reference
+ obj_info_buffer = (*env)->CallObjectMethod(env, callback_cont->rinfo, mid);
+ callback_cont->info_buf = (*env)->GetDirectBufferAddress(env, obj_info_buffer);
+ // create global references for ByteOrders
+ cls = (*env)->FindClass(env, "java/nio/ByteOrder");
+ fid = (*env)->GetStaticFieldID(env,
+ cls,
+ "BIG_ENDIAN",
+ "Ljava/nio/ByteOrder;");
+ callback_cont->obj_BO_BE = (*env)->GetStaticObjectField(env, cls, fid);
+ callback_cont->obj_BO_BE = (*env)->NewGlobalRef(env, callback_cont->obj_BO_BE);
+ fid = (*env)->GetStaticFieldID(env,
+ cls,
+ "LITTLE_ENDIAN",
+ "Ljava/nio/ByteOrder;");
+ callback_cont->obj_BO_LE = (*env)->GetStaticObjectField(env, cls, fid);
+ callback_cont->obj_BO_LE = (*env)->NewGlobalRef(env, callback_cont->obj_BO_LE);
+ // get methodID - order(ByteOrder)
+ cls = (*env)->GetObjectClass(env, callback_cont->obj_buf);
+ callback_cont->mid_order = (*env)->GetMethodID(env,
+ cls,
+ "order",
+ "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;");
+ //
+ cls = (*env)->GetObjectClass(env, obj);
+ if (cls == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: cls = NULL \n");
+ #endif
+ break;
+ }
+ // fieldID - callbackContextHandle
+ fid = (*env)->GetFieldID(env,
+ cls,
+ "callbackContextHandle",
+ "J");
+ if (fid == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: fid = NULL \n");
+ #endif
+ break;
+ }
+ (*env)->SetLongField(env,
+ obj,
+ fid,
+ (jlong)callback_cont_ptr);
#ifdef TEST_STAGE
- printf(":c: nativ fce: getJavaVM succesfull.. jvm = %p \n",jvm);
- printf(":c: nativ fce: env = %p \n",env);
+ printf(":c: ORTESubscriptionCreate() calling..\n");
#endif
- }
- callback_cont->jvm = jvm;
-
- // create global reference
- callback_cont->obj = (*env)->NewGlobalRef(env, callbackObj);
- // global reference not created
- if (callback_cont->obj == 0)
- {
- printf(":!c: cannot create global reference obj_subsCallback ..\n");
- return 0;
- }
-
- // init RecvInfo pointer
- callback_cont->rinfo = 0;
- callback_cont->value = 0; // !!! JEN PRO TESTOVACI UCELY
-
-#ifdef TEST_STAGE
- printf(":c: global reference obj_subsCallback created [%p] ..\n", callback_cont->obj);
- printf(":c: local reference callbackObj [%p] ..\n", callbackObj);
- printf(":c: global reference RecvInfo [%p] ..\n", callback_cont->rinfo);
-#endif
-
-
-// nastavi handle na stukturu callback_cont
- cls = (*env)->GetObjectClass(env, obj);
- fid = (*env)->GetFieldID(env, cls, "callbackContextHandle", "I");
- (*env)->SetIntField(env, obj, fid, (int)callback_cont);
-
-// ---------------------------------------------------------------------------------------
-//uz funkcni cast - bez recvCallbacku
-
- printf(":c: chystam se vytvorit subscribera..\n");
- d = (ORTEDomain *) dhandle;
- if (!d)
- {
- printf(":!c: jORTESubscriptionCreate bad domain handle.. \n ");
- return 0;
- } //JavaVM *jvm;
-
- smode = (SubscriptionMode) jsmode;
- stype = (SubscriptionType) jstype;
- topic = (*env)->GetStringUTFChars(env, jtopic, 0);
- typename = (*env)->GetStringUTFChars(env, jtname, 0);
- instance = (char *) malloc((int) jbufflength);
- deadline = getNtpTime(env, jdeadline);//
- minSeparation = getNtpTime(env, jminSeparation);//
- /* ... */
- /* ... */
-
- printf(":c: jORTESubscriptionreate() - nacteny parametry z javy..\n");
-
-/*
-ORTESubscriptionCreate(ORTEDomain *d,
- SubscriptionMode mode,
- SubscriptionType sType,
- const char *topic,
- const char *typeName,
- void *instance,
- NtpTime *deadline,
- NtpTime *minimumSeparation,
- ORTERecvCallBack recvCallBack,
- void *recvCallBackParam,
- IPAddress multicastIPAddress);
-
-*/
- // call original liborte function
- s = ORTESubscriptionCreate(d,
- smode,
- stype,
- topic,
- typename,
- &instance,
- &deadline,
- &minSeparation,
- recvCallBack,
- (void*)callback_cont,
- (uint32_t) j_multicastIP);
-
- printf(":c: provedeno volani ORTESubscriptionCreate()..\n");
+ //
+ d = (ORTEDomain *)dhandle;
+ if (d == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: d = NULL [bad domain handle] \n");
+ #endif
+ break;
+ }
+ //
+ smode = (SubscriptionMode)jsmode;
+ stype = (SubscriptionType)jstype;
+ topic = (*env)->GetStringUTFChars(env, jtopic, 0);
+ typename = (*env)->GetStringUTFChars(env, jtname, 0);
+ deadline = getNtpTime(env, jdeadline); //
+ minSeparation = getNtpTime(env, jminSeparation); //
+ // call ORTE function
+ s = ORTESubscriptionCreate(d,
+ smode,
+ stype,
+ topic,
+ typename,
+ buffer,
+ &deadline,
+ &minSeparation,
+ recvCallBack,
+ (void *)callback_cont_ptr,
+ (uint32_t)j_multicastIP);
+ if (s == 0) {
+ #ifdef TEST_STAGE
+ printf(":!c: s = NULL [subscription not created] \n");
+ #endif
+ break;
+ }
- if (!s) {
- printf(":!c: ORTESubscriptionCreate: bad publication handle.. \n ");
- return 0;
- }
+ // set flag
+ flag_ok = 1;
+ } while (0);
- // free the memory
+ // free memory
(*env)->ReleaseStringUTFChars(env, jtopic, topic);
(*env)->ReleaseStringUTFChars(env, jtname, typename);
+ // returns handle of new created Subscription
+ if (flag_ok == 0)
+ return 0;
+ return ((jlong)s);
- return ((jint) s);
}
-