]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/libjorte/JORTESubscriptionCreate.c
Merge branch 'master' of https://github.com/Vajnar/orte
[orte.git] / orte / libjorte / JORTESubscriptionCreate.c
index 0a9c87767bded0a16080c9f48b05e71fdfa5d07f..e0838cf748657ab3b7aba6603d0e7e7c6029f206 100644 (file)
@@ -28,6 +28,7 @@
 
 #include <stdlib.h>
 #include <inttypes.h>
+#include <string.h>
 
 // library header file's path
 #include "orte_all.h"
@@ -49,21 +50,15 @@ recvCallBack(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam)
   // jni varialbles
   JavaVM          *jvm = 0;
   JNIEnv          *env = 0;
-  jclass           cls = 0; // local reference!
-  jclass           cls_msg = 0;
-  jobject          rinfo = 0;
-  jobject          obj_msg;
   jobject          obj_bo = 0;
-  jfieldID         fid = 0;
-  jmethodID        mid = 0;
-  jmethodID        mid_callback = 0;
 
-  //
-  // if the subscriber has been destroyed, return
+  JORTECallbackContext_t   *callback_cont;
+
+  // HACK: if the subscriber has been destroyed, return
   if ((*(JORTECallbackContext_t **)recvCallBackParam) == 0)
     return;
 
-  JORTECallbackContext_t   *callback_cont = *((JORTECallbackContext_t **)recvCallBackParam);
+  callback_cont = *((JORTECallbackContext_t **)recvCallBackParam);
 
   #ifdef TEST_STAGE
   printf("\n\n:c: --------------- recvCallBack called.. --------------- \n");
@@ -71,150 +66,44 @@ recvCallBack(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam)
 
   do {
     // set local variables from struct
-    if (callback_cont->jvm == 0) {
-      #ifdef TEST_STAGE
-      printf(":!c: jvm = NULL \n");
-      #endif
-      break;
-    }
     jvm = callback_cont->jvm;
     // get env
-    (*jvm)->AttachCurrentThread(jvm,
+    if ((*jvm)->AttachCurrentThread(jvm,
                                #ifdef __ANDROID__
-                               &env,
+                                   &env,
                                #else
-                               (void **)&env,
+                                   (void **)&env,
                                #endif
-                               NULL);
-    if (env == 0) {
+                                   NULL) != JNI_OK) {
       #ifdef TEST_STAGE
-      printf(":!c: env = NULL \n");
+      printf(":!c: recvCallBack: AttachCurrentThread() failed \n");
       #endif
-      break;
+      return;
     }
-    //
+
     // 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;");
+       obj_bo = callback_cont->obj_BO_BE;
        callback_cont->cur_endian = BigEndian;
       } else {
-       fid = (*env)->GetStaticFieldID(env,
-                                      cls,
-                                      "LITTLE_ENDIAN",
-                                      "Ljava/nio/ByteOrder;");
+       obj_bo = callback_cont->obj_BO_LE;
        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
-      }
+      (*env)->CallObjectMethod(env, callback_cont->obj_buf, callback_cont->mid_order, obj_bo);
     }
-    //
-    if (callback_cont->obj == 0) {
-      #ifdef TEST_STAGE
-      printf(":!c: obj = NULL \n");
-      #endif
-      break;
-    }
-    // set local vars
-    rinfo = callback_cont->rinfo;
-    obj_msg = callback_cont->msg;
-
 
       #ifdef TEST_STAGE
     printf(":c: #0 \n");
-    printf(":c: env = %#" PRIxPTR ", obj_msg = %#" PRIxPTR " \n", (intptr_t)env, (intptr_t)obj_msg);
+    printf(":c: env = %#" PRIxPTR ", obj_msg = %#" PRIxPTR " \n", (intptr_t)env, (intptr_t)callback_cont->msg);
       #endif
 
-
-    //
-    if (rinfo == 0) {
-      // find cls
-      cls = findClass(env, "org.ocera.orte.types.RecvInfo");
-      if (cls == 0) {
-       #ifdef TEST_STAGE
-       printf(":!c: cls = NULL \n");
-       #endif
-       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
-      rinfo = (*env)->NewObject(env, cls, mid);
-      if (rinfo == 0) {
-       #ifdef TEST_STAGE
-       printf(":!c: rinfo = NULL \n");
-       #endif
-       break;
-      }
-      // create global reference
-      callback_cont->rinfo = (*env)->NewGlobalRef(env, rinfo);
-      if (callback_cont->rinfo == 0) {
-       #ifdef TEST_STAGE
-       printf(":!c: callback_cont->rinfo = NULL \n");
-       #endif
-       break;
-      }
-    }
     ////////////////////////////////////////////////////
-    // set RecvInfo instance
-    if (setRecvInfo(env, info, callback_cont->rinfo) == 0) {
-      #ifdef TEST_STAGE
-      printf(":!c: setRecvInfo() failed! \n");
-      #endif
-      break;
-    }
+    memcpy(callback_cont->info_buf, (void *)info, sizeof(ORTERecvInfo));
     ////////////////////////////////////////////////////
+
     // control print - only in TEST_STAGE
     #ifdef TEST_STAGE
     printf(":c: rinfo created :] \n");
@@ -233,79 +122,32 @@ recvCallBack(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam)
     #endif
     ////////////////////////////////////////////////////
     // update MessageData instance
-    // get cls
-    cls_msg = (*env)->GetObjectClass(env, obj_msg);
-    if (cls_msg == 0) {
-      #ifdef TEST_STAGE
-      printf(":!c: cls_msg = NULL \n");
-      #endif
-      break;
-    }
-    /////////////////////////////////////////////////////
-    // methodID - read()
-    mid = (*env)->GetMethodID(env,
-                             cls_msg,
-                             "read",
-                             "()V");
-    if (mid == 0) {
-      #ifdef TEST_STAGE
-      printf(":!c: mid = NULL \n");
-      #endif
-      break;
-    }
     // call method
     (*env)->CallVoidMethod(env,
-                          obj_msg,
-                          mid);
+                          callback_cont->msg,
+                          callback_cont->mid_read);
 
     /* *************************** *
      *  call JAVA CallBack method  *
      * *************************** */
-      #ifdef TEST_STAGE
-    printf(":c: call JAVA CallBack method \n");
-      #endif
-
-
-    // get class
-    cls = (*env)->GetObjectClass(env, callback_cont->obj);
-    if (cls == 0) {
-      #ifdef TEST_STAGE
-      printf(":!c: cls = NULL \n");
-      #endif
-      break;
-    }
-    // get method ID
-    mid = (*env)->GetMethodID(env,
-                             cls,
-                             "callback",
-                             "(Lorg/ocera/orte/types/RecvInfo;Lorg/ocera/orte/types/MessageData;)V");
-    if (mid == 0) {
-      #ifdef TEST_STAGE
-      printf(":!c: cls = NULL \n");
-      #endif
-      break;
-    }
-    mid_callback = mid;
-    //
     #ifdef TEST_STAGE
     printf(":c: volam callback metodu.. halo jsi tam?? \n");
     #endif
     // call object's method
     (*env)->CallVoidMethod(env,
                           callback_cont->obj, /*obj*/
-                          mid_callback,
+                          callback_cont->mid_callback,
                           callback_cont->rinfo,
-                          obj_msg);
+                          callback_cont->msg);
   } while (0);
 
   // detach current thread
-  if ((*jvm)->DetachCurrentThread(jvm) != 0)
+  if ((*jvm)->DetachCurrentThread(jvm) != JNI_OK)
     printf(":c!: DetachCurrentThread failed! \n");
   //
   #ifdef TEST_STAGE
   printf(":c: ------------ thats all from recvCallBack ------------ \n\n");
   #endif
-
 }
 
 /* ****************************************************************** *
@@ -332,6 +174,8 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
   JavaVM                 *jvm;
   jfieldID                fid;
   jclass                  cls;
+  jmethodID           mid;
+  jobject                obj_info_buffer;
   // orte variables
   ORTESubscription       *s = 0;
   ORTEDomain             *d;
@@ -349,6 +193,8 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
   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));
@@ -368,16 +214,15 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
     }
     // get jvm
     jint b = (*env)->GetJavaVM(env, &jvm);
-    if (b <  0) {
+    if (b == JNI_OK) {
       #ifdef TEST_STAGE
-      printf(":!c: getJavaVM() failed! \n");
+      printf(":c: getJavaVM succesfull.. \n");
       #endif
-      break;
-    }
-    if (b == 0) {
+    } else {
       #ifdef TEST_STAGE
-      printf(":c: getJavaVM succesfull.. \n");
+      printf(":!c: getJavaVM() failed! \n");
       #endif
+      break;
     }
     callback_cont->jvm = jvm;
     callback_cont->cur_endian = (CDR_Endianness)jbyteOrder;
@@ -390,6 +235,25 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
       #endif
       break;
     }
+    // get ReceiveCallback class
+    cls = (*env)->GetObjectClass(env, callback_cont->obj);
+    if (cls == 0) {
+      #ifdef TEST_STAGE
+      printf(":!c: cls = NULL \n");
+      #endif
+      break;
+    }
+    // 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;
+    }
     // create global references
     callback_cont->obj_buf = (*env)->NewGlobalRef(env, jinstance);
     //
@@ -408,8 +272,90 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionCreate
       #endif
       break;
     }
+    // get MessageData class
+    cls = (*env)->GetObjectClass(env, callback_cont->msg);
+    if (cls == 0) {
+      #ifdef TEST_STAGE
+      printf(":!c: cls_msg = NULL \n");
+      #endif
+      break;
+    }
+    /////////////////////////////////////////////////////
+    // 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;
+    }
     // init RecvInfo pointer
-    callback_cont->rinfo = 0;
+    // find cls
+    cls = findClass(env, "org.ocera.orte.types.RecvInfo");
+    if (cls == 0) {
+       #ifdef TEST_STAGE
+      printf(":!c: cls = NULL \n");
+       #endif
+      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) {