From: Martin Vajnar Date: Tue, 23 Jul 2013 09:09:39 +0000 (+0200) Subject: JORTE: fix memory leak and add DomainEvents to DomainMgr X-Git-Tag: v0.3.4~96 X-Git-Url: http://rtime.felk.cvut.cz/gitweb/orte.git/commitdiff_plain/7ccffd4a0e13849132c93846cf90c421e52a0739 JORTE: fix memory leak and add DomainEvents to DomainMgr Memory leaks in jORTEDomainAppCreate() and jORTEDomainMgrCreate() (domain events callback structure) are fixed. Domain events callbacks are placed in a separate file. Their prototypes are placed in "jorte/ /jorte_protos_api.h". This way they could be used by DomainApp and DomainMgr. Native functions in both DomainApp.java and DomainMgr.java are now non- static. This allows native domain destructor to free the memory allocated to domain events callback structure. It is now also possible to pass null for DomainEvents or DomainProp to DomainApp and DomainMgr constructors. The header file onLoad.h is removed and the findClass() prototype is placed into "jorte/jorte_protos_api.h". --- diff --git a/orte/include/jorte/4all.h b/orte/include/jorte/4all.h index fc952b4..e636053 100644 --- a/orte/include/jorte/4all.h +++ b/orte/include/jorte/4all.h @@ -14,7 +14,6 @@ typedef struct //#define TEST_STAGE -#include "onLoad.h" #ifdef __ANDROID__ #include diff --git a/orte/include/jorte/jorte_protos_api.h b/orte/include/jorte/jorte_protos_api.h index 3b65f5f..bcd07d3 100644 --- a/orte/include/jorte/jorte_protos_api.h +++ b/orte/include/jorte/jorte_protos_api.h @@ -23,3 +23,39 @@ createSubInfo(JNIEnv *env, const ORTESubInfo *sinfo); extern NtpTime getNtpTime(JNIEnv *env, jobject obj); + +extern Boolean +onSubDelete(const struct ORTEAppInfo *appInfo,const struct ORTESubInfo *subInfo,void *param); + +extern Boolean +onSubRemoteChanged(const struct ORTEAppInfo *appInfo,const struct ORTESubInfo *subInfo,void *param); + +extern Boolean +onSubRemoteNew(const struct ORTEAppInfo *appInfo,const struct ORTESubInfo *subInfo,void *param); + +extern Boolean +onPubDelete(const struct ORTEAppInfo *appInfo,const struct ORTEPubInfo *pubInfo,void *param); + +extern Boolean +onPubRemoteChanged(const struct ORTEAppInfo *appInfo,const struct ORTEPubInfo *pubInfo,void *param); + +extern Boolean +onPubRemoteNew(const struct ORTEAppInfo *appInfo,const struct ORTEPubInfo *pubInfo,void *param); + +extern Boolean +onAppDelete(const struct ORTEAppInfo *appInfo,void *param); + +extern Boolean +onAppRemoteNew(const struct ORTEAppInfo *appInfo,void *param); + +extern Boolean +onMgrDelete(const struct ORTEAppInfo *appInfo,void *param); + +extern Boolean +onMgrNew(const struct ORTEAppInfo *appInfo,void *param); + +extern Boolean +onRegFail(void *param); + +extern jclass +findClass(JNIEnv *env, const char* name); diff --git a/orte/include/jorte/onLoad.h b/orte/include/jorte/onLoad.h deleted file mode 100644 index 77524db..0000000 --- a/orte/include/jorte/onLoad.h +++ /dev/null @@ -1,14 +0,0 @@ -#include - -#ifndef IncludedOnLoad -#define IncludedOnLoad -#ifdef __cplusplus -extern "C" { -#endif - -jclass findClass(JNIEnv *env, const char* name); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/orte/include/jorte/org_ocera_orte_DomainApp.h b/orte/include/jorte/org_ocera_orte_DomainApp.h index 8e8c124..9fbe1d4 100644 --- a/orte/include/jorte/org_ocera_orte_DomainApp.h +++ b/orte/include/jorte/org_ocera_orte_DomainApp.h @@ -13,7 +13,7 @@ extern "C" { * Signature: (IZ)J */ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainDefaultAppCreate - (JNIEnv *, jclass, jint, jboolean); + (JNIEnv *, jobject, jint, jboolean); /* * Class: org_ocera_orte_DomainApp @@ -21,7 +21,7 @@ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainDefaultAppCreat * Signature: (IJJLorg/ocera/orte/types/DomainEvents;Z)J */ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainAppCreate - (JNIEnv *, jclass, jint, jlong, jlong, jobject, jboolean); + (JNIEnv *, jobject, jint, jlong, jlong, jobject, jboolean); /* * Class: org_ocera_orte_DomainApp @@ -29,7 +29,7 @@ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainAppCreate * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainAppDestroy - (JNIEnv *, jclass, jlong); + (JNIEnv *, jobject, jlong); /* * Class: org_ocera_orte_DomainApp @@ -37,7 +37,7 @@ JNIEXPORT jboolean JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainAppDestroy * Signature: (JLjava/lang/String;J)I */ JNIEXPORT jint JNICALL Java_org_ocera_orte_DomainApp_jORTETypeRegisterAdd - (JNIEnv *, jclass, jlong, jstring, jlong); + (JNIEnv *, jobject, jlong, jstring, jlong); /* * Class: org_ocera_orte_DomainApp @@ -45,7 +45,7 @@ JNIEXPORT jint JNICALL Java_org_ocera_orte_DomainApp_jORTETypeRegisterAdd * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_org_ocera_orte_DomainApp_jORTETypeRegisterDestroyAll - (JNIEnv *, jclass, jlong); + (JNIEnv *, jobject, jlong); #ifdef __cplusplus } diff --git a/orte/include/jorte/org_ocera_orte_DomainMgr.h b/orte/include/jorte/org_ocera_orte_DomainMgr.h index 38ec5be..bc9e0c1 100644 --- a/orte/include/jorte/org_ocera_orte_DomainMgr.h +++ b/orte/include/jorte/org_ocera_orte_DomainMgr.h @@ -13,7 +13,7 @@ extern "C" { * Signature: (IZ)J */ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainDefaultMgrCreate - (JNIEnv *, jclass, jint, jboolean); + (JNIEnv *, jobject, jint, jboolean); /* * Class: org_ocera_orte_DomainMgr @@ -21,7 +21,7 @@ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainDefaultMgrCreat * Signature: (IJJZ)J */ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainMgrCreate - (JNIEnv *, jclass, jint, jlong, jlong, jboolean); + (JNIEnv *, jobject, jint, jlong, jlong, jobject obj_de, jboolean); /* * Class: org_ocera_orte_DomainMgr @@ -29,7 +29,7 @@ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainMgrCreate * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainMgrDestroy - (JNIEnv *, jclass, jlong); + (JNIEnv *, jobject, jlong); #ifdef __cplusplus } diff --git a/orte/java/src/org/ocera/orte/Domain.java b/orte/java/src/org/ocera/orte/Domain.java index 19d6569..8ed7b5f 100644 --- a/orte/java/src/org/ocera/orte/Domain.java +++ b/orte/java/src/org/ocera/orte/Domain.java @@ -25,7 +25,7 @@ package org.ocera.orte; import org.ocera.orte.types.*; -public class Domain { +public abstract class Domain { /** load native library 'libjorte.so' */ static { @@ -33,9 +33,10 @@ public class Domain { } /* domain fields */ - protected long handle; - public DomainProp props; - public DomainEvents events; + protected long handle; + protected long domainEventsContextHandle = 0; + protected DomainProp props; + protected DomainEvents events; /* constructor */ @@ -48,8 +49,8 @@ public class Domain { /** - * Get handle of the Application Domain. - * @return Handle of the Application Domain. + * Get handle of the Domain. + * @return Handle of the Domain. */ public long getHandle() { @@ -57,11 +58,8 @@ public class Domain { } /** - * Get handle of the Application Domain. - * @return Handle of the Application Domain. + * Destroy domain. + * @return Handle of the Domain. */ - public boolean destroy() - { - return false; - } + public abstract boolean destroy(); } diff --git a/orte/java/src/org/ocera/orte/DomainApp.java b/orte/java/src/org/ocera/orte/DomainApp.java index 09efabf..eccd2af 100644 --- a/orte/java/src/org/ocera/orte/DomainApp.java +++ b/orte/java/src/org/ocera/orte/DomainApp.java @@ -48,21 +48,14 @@ public class DomainApp extends Domain /** TODO dodelat objekty 'props', 'events' */ public DomainApp(int domain, DomainProp ps, DomainEvents ev, boolean suspend) { - super(); // set Default Domain Properties - if(ps == null) { - this.props = DomainProp.defaultPropsCreate(); - } - else { - this.props = ps; - } - // init Domain Events - if(ev == null) { - this.events.init(); - } - else { - this.events = ev; - } - this.handle = jORTEDomainAppCreate(domain,ps.handle,ev.getHandle(),ev,suspend); + super(); + this.props = ps; + this.events = ev; + this.handle = jORTEDomainAppCreate(domain, + ps==null ? 0 : this.props.getHandle(), + ev==null ? 0 : this.events.getHandle(), + this.events, + suspend); /* TODO osetrit neuspesne vytvoreni domeny */ if(this.handle == 0) System.out.println(":j!: zero domain handle! .."); else System.out.println(":j: application domain created.."); @@ -71,15 +64,12 @@ public class DomainApp extends Domain /** * Destroy the Application Domain. */ + @Override public boolean destroy() { - if(!destroyAllRegTypes()) System.out.println(":j!: destroyAllRegTypes fault!"); - if(!jORTEDomainAppDestroy(this.handle) || !this.props.destroy()) { - System.out.println(":j!: ORTEDomainADestroy fault!"); - return false; - } - return true; - + if(destroyAllRegTypes() && jORTEDomainAppDestroy(this.handle) && (this.props == null || this.props.destroy())) return true; + System.out.println(":j!: ORTEDomainAppDestroy() fault.."); + return false; } @@ -178,7 +168,7 @@ public class DomainApp extends Domain * @param domain given domain * @return addres value (from C environment) of the created domain */ - private static native long jORTEDomainDefaultAppCreate(int domain,boolean suspend); + private native long jORTEDomainDefaultAppCreate(int domain,boolean suspend); /** @@ -194,7 +184,7 @@ public class DomainApp extends Domain * @return addres value (from C environment) of the created domain */ - private static native + private native long jORTEDomainAppCreate(int domain, long propHandle, long eventsHandle, @@ -210,7 +200,7 @@ public class DomainApp extends Domain * @param jp_domhandle handler to domain * @return boolean value, False when some error occures, otherwise True */ - private static native + private native boolean jORTEDomainAppDestroy(long dhandle); @@ -224,7 +214,7 @@ public class DomainApp extends Domain * @param * @return */ - private static native + private native int jORTETypeRegisterAdd(long dhandle, String typeName, long maxlenght); @@ -237,7 +227,7 @@ public class DomainApp extends Domain * @param dhandle handler to domain * @return boolean value, False when some error occures, otherwise True */ - private static native + private native boolean jORTETypeRegisterDestroyAll(long dhandle); -} \ No newline at end of file +} diff --git a/orte/java/src/org/ocera/orte/DomainMgr.java b/orte/java/src/org/ocera/orte/DomainMgr.java index c9070e8..13f01fa 100644 --- a/orte/java/src/org/ocera/orte/DomainMgr.java +++ b/orte/java/src/org/ocera/orte/DomainMgr.java @@ -55,33 +55,25 @@ public class DomainMgr extends Domain DomainEvents events, boolean suspend) { - super(); // set Default Domain Properties - if(props == null) { - this.props = DomainProp.defaultPropsCreate(); - } - else { - this.props = props; - } - - handle = jORTEDomainMgrCreate(domain, - props.handle, - events==null ? 0 : events.getHandle(), - suspend); + super(); + this.props = props; + this.events = events; + this.handle = jORTEDomainMgrCreate(domain, + props==null ? 0 : this.props.getHandle(), + events==null ? 0 : this.events.getHandle(), + this.events, + suspend); } - - /* - public void create() - {} - */ /** * destroy - destroy manager object * @return boolean: False if bad publication handle, True if succesful */ + @Override public boolean destroy() { - if(jORTEDomainMgrDestroy(this.handle) && this.props.destroy()) return true; + if(jORTEDomainMgrDestroy(this.handle) && (this.props == null || this.props.destroy())) return true; System.out.println(":j!: ORTEDomainMgrDestroy() fault.."); return false; } @@ -97,7 +89,7 @@ public class DomainMgr extends Domain * @param handle of the domain * @return handle of the Manager **/ - private static native + private native long jORTEDomainDefaultMgrCreate(int dhandle,boolean suspend); @@ -108,10 +100,11 @@ public class DomainMgr extends Domain * @param handle of the domain events * @return handle of the Manager **/ - private static native + private native long jORTEDomainMgrCreate(int dhandle, long propsHandle, long eventsHandle, + DomainEvents ev, boolean suspend); /** @@ -119,7 +112,7 @@ public class DomainMgr extends Domain * @param hadle of the domain * @return if some error occures return False, otherwise True **/ - private static native + private native boolean jORTEDomainMgrDestroy(long dhandle); } diff --git a/orte/java/src/org/ocera/orte/Manager.java b/orte/java/src/org/ocera/orte/Manager.java index 5fc77d0..ad99bbd 100644 --- a/orte/java/src/org/ocera/orte/Manager.java +++ b/orte/java/src/org/ocera/orte/Manager.java @@ -1,10 +1,18 @@ package org.ocera.orte; -import org.ocera.orte.types.*;; +import org.ocera.orte.types.*; public class Manager { private DomainMgr dmgr; + private ManagerEvents events = new ManagerEvents(); + + public Manager() { + dmgr = new DomainMgr(ORTEConstant.ORTE_DEFAULT_DOMAIN, + null, + events, + false); + } public Manager(String[] mgrs) { DomainProp dprops = DomainProp.defaultPropsCreate(); @@ -12,7 +20,7 @@ public class Manager { dmgr = new DomainMgr(ORTEConstant.ORTE_DEFAULT_DOMAIN, dprops, - null, + events, false); } diff --git a/orte/java/src/org/ocera/orte/examples/hello/MyManager.java b/orte/java/src/org/ocera/orte/examples/hello/MyManager.java new file mode 100644 index 0000000..10ffecd --- /dev/null +++ b/orte/java/src/org/ocera/orte/examples/hello/MyManager.java @@ -0,0 +1,23 @@ +import org.ocera.orte.*; +import org.ocera.orte.types.*; + +public class MyManager { + + static { + System.loadLibrary("jorte"); + } + + public static void main(String[] args) { + Manager manager = new Manager(); + + while(true) { + try { + Thread.sleep(1000); + } + catch(Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/orte/java/src/org/ocera/orte/types/DomainProp.java b/orte/java/src/org/ocera/orte/types/DomainProp.java index ff46cbe..6db5340 100644 --- a/orte/java/src/org/ocera/orte/types/DomainProp.java +++ b/orte/java/src/org/ocera/orte/types/DomainProp.java @@ -33,8 +33,12 @@ public class DomainProp { /* handler to C struct with default domain properties */ - public long handle = 0; + private long handle = 0; private String mgrs = null; + + public long getHandle() { + return this.handle; + } /** * setProps - sets DomainProp diff --git a/orte/java/src/org/ocera/orte/types/ManagerEvents.java b/orte/java/src/org/ocera/orte/types/ManagerEvents.java new file mode 100644 index 0000000..c5135ca --- /dev/null +++ b/orte/java/src/org/ocera/orte/types/ManagerEvents.java @@ -0,0 +1,57 @@ +package org.ocera.orte.types; + +public class ManagerEvents extends DomainEvents { + + public ManagerEvents() + { + super(); + } + + public void onRegFail() {} + + public void onMgrNew(AppInfo appInfo) + { + System.out.println(":j: *************************************************"); + System.out.println(":j: * call method 'MyEvents.onMgrNew()'.. *"); + System.out.println(":j: *************************************************"); + appInfo.printWithLegend(); + } + + public void onMgrDelete(AppInfo appInfo) + { + System.out.println(":j: *************************************************"); + System.out.println(":j: * call method 'MyEvents.onMgrDelete()'.. *"); + System.out.println(":j: *************************************************"); + appInfo.printWithLegend(); + } + + public void onAppRemoteNew(AppInfo appInfo) + { + System.out.println(":j: *************************************************"); + System.out.println(":j: * call method 'MyEvents.onAppRemoteNew()'.. *"); + System.out.println(":j: *************************************************"); + appInfo.printWithLegend(); + } + + public void onAppDelete(AppInfo appInfo) + { + System.out.println(":j: *************************************************"); + System.out.println(":j: * call method 'MyEvents.onAppDelete()'.. *"); + System.out.println(":j: *************************************************"); + appInfo.printWithLegend(); + } + + public void onPubRemoteNew(AppInfo appInfo, PubInfo pubInfo) {} + + public void onPubRemoteChanged(AppInfo appInfo, PubInfo pubInfo) {} + + public void onPubDelete(AppInfo appInfo, PubInfo pubInfo) {} + + public void onSubRemoteNew(AppInfo appInfo, SubInfo subInfo) {} + + public void onSubRemoteChanged(AppInfo appInfo, SubInfo subInfo) {} + + public void onSubDelete(AppInfo appInfo, SubInfo subInfo) {} + +} + diff --git a/orte/libjorte/JORTEDomainAppCreate.c b/orte/libjorte/JORTEDomainAppCreate.c index 54e8ae6..93be29d 100644 --- a/orte/libjorte/JORTEDomainAppCreate.c +++ b/orte/libjorte/JORTEDomainAppCreate.c @@ -37,1095 +37,13 @@ #include "jorte/jorte_protos_api.h" #include -// ///////////////////////////////////////////////////////////////////// -// public void onRegFail() -// ///////////////////////////////////////////////////////////////////// -Boolean -onRegFail(void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onRegFail()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onRegFail", - "()V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -// Event - public void onMgrNew() -// ///////////////////////////////////////////////////////////////////// -Boolean -onMgrNew(const struct ORTEAppInfo *appInfo, void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onMgrNew()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onMgrNew", - "(Lorg/ocera/orte/types/AppInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -// Event - public void onMgrDelete() -// ///////////////////////////////////////////////////////////////////// -Boolean -onMgrDelete(const struct ORTEAppInfo *appInfo, void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onMgrDelete()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onMgrDelete", - "(Lorg/ocera/orte/types/AppInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - - -// ///////////////////////////////////////////////////////////////////// -// Event - onAppRemoteNew -// ///////////////////////////////////////////////////////////////////// -Boolean -onAppRemoteNew(const struct ORTEAppInfo *appInfo, void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onAppRemoteNew()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onAppRemoteNew", - "(Lorg/ocera/orte/types/AppInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -// public void onAppDelete() { } -// ///////////////////////////////////////////////////////////////////// -Boolean -onAppDelete(const struct ORTEAppInfo *appInfo, void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onAppDelete()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onAppDelete", - "(Lorg/ocera/orte/types/AppInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -// public void onPubRemoteNew() -// ///////////////////////////////////////////////////////////////////// -Boolean -onPubRemoteNew(const struct ORTEAppInfo *appInfo, - const struct ORTEPubInfo *pubInfo, - void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jobject obj_pinfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onPubRemoteNew()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } - // create PubInfo instance - obj_pinfo = createPubInfo(env, pubInfo); - if(obj_pinfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_pinfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onPubRemoteNew", - "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/PubInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo, - obj_pinfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -//public void onPubRemoteChanged() -// ///////////////////////////////////////////////////////////////////// -Boolean -onPubRemoteChanged(const struct ORTEAppInfo *appInfo, - const struct ORTEPubInfo *pubInfo, - void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jobject obj_pinfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onPubRemoteChanged()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } - // create PubInfo instance - obj_pinfo = createPubInfo(env, pubInfo); - if(obj_pinfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_pinfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onPubRemoteChanged", - "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/PubInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo, - obj_pinfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - - - -// ///////////////////////////////////////////////////////////////////// -// public void onPubDelete() -// ///////////////////////////////////////////////////////////////////// -Boolean -onPubDelete(const struct ORTEAppInfo *appInfo, - const struct ORTEPubInfo *pubInfo, - void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jobject obj_pinfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onPubDelete()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } - // create PubInfo instance - obj_pinfo = createPubInfo(env, pubInfo); - if(obj_pinfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_pinfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onPubDelete", - "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/PubInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo, - obj_pinfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -// Event - onSubRemoteNew -// ///////////////////////////////////////////////////////////////////// -Boolean -onSubRemoteNew(const struct ORTEAppInfo *appInfo, - const struct ORTESubInfo *subInfo, - void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jobject obj_ainfo; - jobject obj_sinfo; - jclass cls; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onSubRemoteNew()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } - // create SubInfo instance - obj_sinfo = createSubInfo(env, subInfo); - if(obj_sinfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_sinfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onSubRemoteNew", - "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/SubInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo, - obj_sinfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -// public void onSubRemoteChanged() { } -// ///////////////////////////////////////////////////////////////////// -Boolean -onSubRemoteChanged(const struct ORTEAppInfo *appInfo, - const struct ORTESubInfo *subInfo, - void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jobject obj_sinfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onSubRemoteChanged()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } - // create SubInfo instance - obj_sinfo = createSubInfo(env, subInfo); - if(obj_sinfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_sinfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onSubRemoteChanged", - "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/SubInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo, - obj_sinfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - - -// ///////////////////////////////////////////////////////////////////// -// public void onSubDelete() { } -// ///////////////////////////////////////////////////////////////////// -Boolean -onSubDelete(const struct ORTEAppInfo *appInfo, - const struct ORTESubInfo *subInfo, - void *param) -{ -// ///////////////////////////////// SPOLECNA CAST // - JavaVM *jvm = NULL; - JNIEnv *env = NULL; // local reference - jclass cls; - jobject obj_ainfo; - jobject obj_sinfo; - jmethodID mid; - // - JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; - int flag_ok = 0; - - #ifdef TEST_STAGE - printf(":c: event func. 'onSubDelete()' called.. \n"); - #endif - - do - { -// ///////////////////////////////// SPOLECNA CAST // - if(domain_events_cont->jvm == 0) - { - #ifdef TEST_STAGE - printf(":!c: jvm = NULL! \n"); - #endif - break; - } - jvm = domain_events_cont->jvm; - // get env - (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); - if(env == 0) - { - #ifdef TEST_STAGE - printf(":!c: env = NULL! \n"); - #endif - break; - } - // find class - cls = findClass(env, "org.ocera.orte.types.DomainEvents"); - if(cls == 0) - { - #ifdef TEST_STAGE - printf(":!c: cls = NULL! \n"); - #endif - break; - } - // create AppInfo instance - obj_ainfo = createAppInfo(env, appInfo); - if(obj_ainfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_ainfo = NULL! \n"); - #endif - break; - } - // create SubInfo instance - obj_sinfo = createSubInfo(env, subInfo); - if(obj_sinfo == 0) - { - #ifdef TEST_STAGE - printf(":!c: obj_sinfo = NULL! \n"); - #endif - break; - } -// ///////////////////////////////// SPOLECNA CAST // - // get method ID - mid = (*env)->GetMethodID(env, - cls, - "onSubDelete", - "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/SubInfo;)V"); - if(mid == 0) - { - #ifdef TEST_STAGE - printf(":!c: mid = NULL! \n"); - #endif - break; - } - // call method - (*env)->CallVoidMethod(env, - domain_events_cont->obj_de, - mid, - obj_ainfo, - obj_sinfo); - flag_ok = 1; - } while(0); - // while broken - if(flag_ok) - { - if((*jvm)->DetachCurrentThread(jvm) != 0) - { - printf(":c!: DetachCurrentThread fault! \n"); - return ORTE_FALSE; - } - } - - return ORTE_TRUE; -} - // ///////////////////////////////////////////////////////////////////// // create default application domain // ///////////////////////////////////////////////////////////////////// JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainDefaultAppCreate -(JNIEnv *env, jclass class, jint jdomain, jboolean jsusp) +(JNIEnv *env, jobject obj, jint jdomain, jboolean jsusp) { jlong d; @@ -1152,7 +70,7 @@ Java_org_ocera_orte_DomainApp_jORTEDomainDefaultAppCreate // ////////////////////////////////////////////////////////////////////// JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainAppCreate -(JNIEnv *env, jclass cls, +(JNIEnv *env, jobject obj, jint jdomain, jlong propHandle, jlong eventsHandle, @@ -1161,6 +79,8 @@ Java_org_ocera_orte_DomainApp_jORTEDomainAppCreate { // jni varibles JavaVM *jvm; + jclass cls; + jfieldID fid; jlong d; // ORTEDomainAppEvents *dom_events; @@ -1169,58 +89,84 @@ Java_org_ocera_orte_DomainApp_jORTEDomainAppCreate #ifdef TEST_STAGE printf(":c: ORTEDomainAppCreate() called.. \n"); #endif - // memory alocation - // don't forget free memory - free()!! - domain_events_cont = (JORTEDomainEventsContext_t *) malloc(sizeof(JORTEDomainEventsContext_t)); - // get jvm - jint b = (*env)->GetJavaVM(env,&jvm); - if (b < 0) - { - printf(":!c: getJavaVM() failed! \n"); - return 0; + //assign domain events only if not null + if(obj_de != NULL) { + // memory alocation + domain_events_cont = (JORTEDomainEventsContext_t *) malloc(sizeof(JORTEDomainEventsContext_t)); + // get jvm + jint b = (*env)->GetJavaVM(env,&jvm); + if (b < 0) + { + printf(":!c: getJavaVM() failed! \n"); + return 0; + } + // create global references + domain_events_cont->jvm = jvm; + // domain events + domain_events_cont->obj_de = (*env)->NewGlobalRef(env, obj_de); + // get new events + dom_events = (ORTEDomainAppEvents *) eventsHandle; + //////////////////////////////////////////////// + // set new events & their prarameters + // onRegFail + dom_events->onRegFail = (ORTEOnRegFail) onRegFail; + dom_events->onRegFailParam = (void *) domain_events_cont; + // onMgrNew + dom_events->onMgrNew = (ORTEOnMgrNew) onMgrNew; + dom_events->onMgrNewParam = (void *) domain_events_cont; + // onMgrDelete + dom_events->onMgrDelete = (ORTEOnMgrDelete) onMgrDelete; + dom_events->onMgrDeleteParam = (void *) domain_events_cont; + // onAppRemoteNew + dom_events->onAppRemoteNew = (ORTEOnAppRemoteNew) onAppRemoteNew; + dom_events->onAppRemoteNewParam = (void *) domain_events_cont; + // onAppDelete + dom_events->onAppDelete = (ORTEOnAppDelete) onAppDelete; + dom_events->onAppDeleteParam = (void *) domain_events_cont; + // onPubRemoteNew + dom_events->onPubRemoteNew = (ORTEOnPubRemote) onPubRemoteNew; + dom_events->onPubRemoteNewParam = (void *) domain_events_cont; + // onPubRemoteChanged + dom_events->onPubRemoteChanged = (ORTEOnPubRemote) onPubRemoteChanged; + dom_events->onPubRemoteChangedParam = (void *) domain_events_cont; + // onPubDelete + dom_events->onPubDelete = (ORTEOnPubDelete) onPubDelete; + dom_events->onPubDeleteParam = (void *) domain_events_cont; + // onSubRemoteNew + dom_events->onSubRemoteNew = (ORTEOnSubRemote) onSubRemoteNew; + dom_events->onSubRemoteNewParam = (void *) domain_events_cont; + // onSubRemoteChanged + dom_events->onSubRemoteChanged = (ORTEOnSubRemote) onSubRemoteChanged; + dom_events->onSubRemoteChangedParam = (void *) domain_events_cont; + // onSubDelete + dom_events->onSubDelete = (ORTEOnSubDelete) onSubDelete; + dom_events->onSubDeleteParam = (void *) domain_events_cont; + //////////////////////////////////////////////// + cls = (*env)->GetObjectClass(env, obj); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL \n"); + #endif + return 0; + } + // fieldID - domainEventsContextHandle + fid = (*env)->GetFieldID(env, + cls, + "domainEventsContextHandle", + "J"); + if(fid == 0) + { + #ifdef TEST_STAGE + printf(":!c: fid = NULL \n"); + #endif + return 0; + } + (*env)->SetLongField(env, + obj, + fid, + (jlong) domain_events_cont); } - // create global references - domain_events_cont->jvm = jvm; - // domain events - domain_events_cont->obj_de = (*env)->NewGlobalRef(env, obj_de); - // get new events - dom_events = (ORTEDomainAppEvents *) eventsHandle; - //////////////////////////////////////////////// - // set new events & their prarameters - // onRegFail - dom_events->onRegFail = (ORTEOnRegFail) onRegFail; - dom_events->onRegFailParam = (void *) domain_events_cont; - // onMgrNew - dom_events->onMgrNew = (ORTEOnMgrNew) onMgrNew; - dom_events->onMgrNewParam = (void *) domain_events_cont; - // onMgrDelete - dom_events->onMgrDelete = (ORTEOnMgrDelete) onMgrDelete; - dom_events->onMgrDeleteParam = (void *) domain_events_cont; - // onAppRemoteNew - dom_events->onAppRemoteNew = (ORTEOnAppRemoteNew) onAppRemoteNew; - dom_events->onAppRemoteNewParam = (void *) domain_events_cont; - // onAppDelete - dom_events->onAppDelete = (ORTEOnAppDelete) onAppDelete; - dom_events->onAppDeleteParam = (void *) domain_events_cont; - // onPubRemoteNew - dom_events->onPubRemoteNew = (ORTEOnPubRemote) onPubRemoteNew; - dom_events->onPubRemoteNewParam = (void *) domain_events_cont; - // onPubRemoteChanged - dom_events->onPubRemoteChanged = (ORTEOnPubRemote) onPubRemoteChanged; - dom_events->onPubRemoteChangedParam = (void *) domain_events_cont; - // onPubDelete - dom_events->onPubDelete = (ORTEOnPubDelete) onPubDelete; - dom_events->onPubDeleteParam = (void *) domain_events_cont; - // onSubRemoteNew - dom_events->onSubRemoteNew = (ORTEOnSubRemote) onSubRemoteNew; - dom_events->onSubRemoteNewParam = (void *) domain_events_cont; - // onSubRemoteChanged - dom_events->onSubRemoteChanged = (ORTEOnSubRemote) onSubRemoteChanged; - dom_events->onSubRemoteChangedParam = (void *) domain_events_cont; - // onSubDelete - dom_events->onSubDelete = (ORTEOnSubDelete) onSubDelete; - dom_events->onSubDeleteParam = (void *) domain_events_cont; - //////////////////////////////////////////////// // call ORTE function d = (jlong) ORTEDomainAppCreate((int)jdomain, (ORTEDomainProp *) propHandle, diff --git a/orte/libjorte/JORTEDomainAppDestroy.c b/orte/libjorte/JORTEDomainAppDestroy.c index 570baef..460682b 100644 --- a/orte/libjorte/JORTEDomainAppDestroy.c +++ b/orte/libjorte/JORTEDomainAppDestroy.c @@ -26,30 +26,84 @@ * */ +#include // origin orte headers #include "orte.h" // pregenerated header #include "jorte/org_ocera_orte_DomainApp.h" #include "jorte/4all.h" +#include "jorte/jorte_typedefs_defines.h" JNIEXPORT jboolean JNICALL Java_org_ocera_orte_DomainApp_jORTEDomainAppDestroy -(JNIEnv *env, jclass cls, jlong dhandle) +(JNIEnv *env, jobject obj, jlong dhandle) { - // check domain handle - if (dhandle == 0) + jlong h; + jclass cls; + jfieldID fid; + int flag_ok = 0; + + do { + // check domain handle + if (dhandle == 0) + { + printf(":!c: ORTEDomainAppDestroy failed! [bad handle] \n"); + break; + } + // call ORTE function + if (!ORTEDomainAppDestroy((ORTEDomain *) dhandle)) + { + #ifdef TEST_STAGE + printf(":c: ORTEDomainAppDestroy failed.. \n"); + #endif + break; + } + + // free domainEvents object + // find cls + cls = (*env)->GetObjectClass(env, obj); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // fieldID + fid = (*env)->GetFieldID(env, + cls, + "domainEventsContextHandle", + "J"); + if(fid == 0) + { + #ifdef TEST_STAGE + printf(":!c: fid = NULL! \n"); + #endif + break; + } + // get value + h = (*env)->GetLongField(env, obj, fid); + if(h) + { + JORTEDomainEventsContext_t *ctx = (JORTEDomainEventsContext_t*)h; + if(ctx->obj_de) + { + #ifdef TEST_STAGE + printf(":c: deleting ctx->obj_de \n"); + #endif + (*env)->DeleteGlobalRef(env, ctx->obj_de); + } + // + free((void*)h); + } + flag_ok = 1; + } while(0); + + if(flag_ok == 0) { - printf(":!c: ORTEDomainAppDestroy failed! [bad handle] \n"); + printf(":!c: ORTEDomainAppDestroy failed! \n"); return 0; } - // call ORTE function - if (ORTEDomainAppDestroy((ORTEDomain *) dhandle)) - { - #ifdef TEST_STAGE - printf(":c: ORTEDomainAppDestroy successfull.. \n"); - #endif - return 1; - } - printf(":!c: ORTEDomainAppDestroy failed! \n"); - return 0; + + return 1; } diff --git a/orte/libjorte/JORTEDomainEvents.c b/orte/libjorte/JORTEDomainEvents.c new file mode 100644 index 0000000..1a75046 --- /dev/null +++ b/orte/libjorte/JORTEDomainEvents.c @@ -0,0 +1,1089 @@ +#include +#include +#include +#include "orte.h" +#include "jorte/4all.h" +#include "jorte/jorte_typedefs_defines.h" +#include "jorte/jorte_protos_api.h" + +// ///////////////////////////////////////////////////////////////////// +// public void onRegFail() +// ///////////////////////////////////////////////////////////////////// +Boolean +onRegFail(void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onRegFail()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onRegFail", + "()V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +// Event - public void onMgrNew() +// ///////////////////////////////////////////////////////////////////// +Boolean +onMgrNew(const struct ORTEAppInfo *appInfo, void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onMgrNew()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onMgrNew", + "(Lorg/ocera/orte/types/AppInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +// Event - public void onMgrDelete() +// ///////////////////////////////////////////////////////////////////// +Boolean +onMgrDelete(const struct ORTEAppInfo *appInfo, void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onMgrDelete()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onMgrDelete", + "(Lorg/ocera/orte/types/AppInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + + +// ///////////////////////////////////////////////////////////////////// +// Event - onAppRemoteNew +// ///////////////////////////////////////////////////////////////////// +Boolean +onAppRemoteNew(const struct ORTEAppInfo *appInfo, void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onAppRemoteNew()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onAppRemoteNew", + "(Lorg/ocera/orte/types/AppInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +// public void onAppDelete() { } +// ///////////////////////////////////////////////////////////////////// +Boolean +onAppDelete(const struct ORTEAppInfo *appInfo, void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onAppDelete()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onAppDelete", + "(Lorg/ocera/orte/types/AppInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +// public void onPubRemoteNew() +// ///////////////////////////////////////////////////////////////////// +Boolean +onPubRemoteNew(const struct ORTEAppInfo *appInfo, + const struct ORTEPubInfo *pubInfo, + void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jobject obj_pinfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onPubRemoteNew()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } + // create PubInfo instance + obj_pinfo = createPubInfo(env, pubInfo); + if(obj_pinfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_pinfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onPubRemoteNew", + "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/PubInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo, + obj_pinfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +//public void onPubRemoteChanged() +// ///////////////////////////////////////////////////////////////////// +Boolean +onPubRemoteChanged(const struct ORTEAppInfo *appInfo, + const struct ORTEPubInfo *pubInfo, + void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jobject obj_pinfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onPubRemoteChanged()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } + // create PubInfo instance + obj_pinfo = createPubInfo(env, pubInfo); + if(obj_pinfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_pinfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onPubRemoteChanged", + "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/PubInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo, + obj_pinfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + + + +// ///////////////////////////////////////////////////////////////////// +// public void onPubDelete() +// ///////////////////////////////////////////////////////////////////// +Boolean +onPubDelete(const struct ORTEAppInfo *appInfo, + const struct ORTEPubInfo *pubInfo, + void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jobject obj_pinfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onPubDelete()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } + // create PubInfo instance + obj_pinfo = createPubInfo(env, pubInfo); + if(obj_pinfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_pinfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onPubDelete", + "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/PubInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo, + obj_pinfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +// Event - onSubRemoteNew +// ///////////////////////////////////////////////////////////////////// +Boolean +onSubRemoteNew(const struct ORTEAppInfo *appInfo, + const struct ORTESubInfo *subInfo, + void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jobject obj_ainfo; + jobject obj_sinfo; + jclass cls; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onSubRemoteNew()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } + // create SubInfo instance + obj_sinfo = createSubInfo(env, subInfo); + if(obj_sinfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_sinfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onSubRemoteNew", + "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/SubInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo, + obj_sinfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +// public void onSubRemoteChanged() { } +// ///////////////////////////////////////////////////////////////////// +Boolean +onSubRemoteChanged(const struct ORTEAppInfo *appInfo, + const struct ORTESubInfo *subInfo, + void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jobject obj_sinfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onSubRemoteChanged()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } + // create SubInfo instance + obj_sinfo = createSubInfo(env, subInfo); + if(obj_sinfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_sinfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onSubRemoteChanged", + "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/SubInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo, + obj_sinfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} + + +// ///////////////////////////////////////////////////////////////////// +// public void onSubDelete() { } +// ///////////////////////////////////////////////////////////////////// +Boolean +onSubDelete(const struct ORTEAppInfo *appInfo, + const struct ORTESubInfo *subInfo, + void *param) +{ +// ///////////////////////////////// SPOLECNA CAST // + JavaVM *jvm = NULL; + JNIEnv *env = NULL; // local reference + jclass cls; + jobject obj_ainfo; + jobject obj_sinfo; + jmethodID mid; + // + JORTEDomainEventsContext_t *domain_events_cont = (JORTEDomainEventsContext_t*) param; + int flag_ok = 0; + + #ifdef TEST_STAGE + printf(":c: event func. 'onSubDelete()' called.. \n"); + #endif + + do + { +// ///////////////////////////////// SPOLECNA CAST // + if(domain_events_cont->jvm == 0) + { + #ifdef TEST_STAGE + printf(":!c: jvm = NULL! \n"); + #endif + break; + } + jvm = domain_events_cont->jvm; + // get env + (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL); + if(env == 0) + { + #ifdef TEST_STAGE + printf(":!c: env = NULL! \n"); + #endif + break; + } + // find class + cls = findClass(env, "org.ocera.orte.types.DomainEvents"); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // create AppInfo instance + obj_ainfo = createAppInfo(env, appInfo); + if(obj_ainfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_ainfo = NULL! \n"); + #endif + break; + } + // create SubInfo instance + obj_sinfo = createSubInfo(env, subInfo); + if(obj_sinfo == 0) + { + #ifdef TEST_STAGE + printf(":!c: obj_sinfo = NULL! \n"); + #endif + break; + } +// ///////////////////////////////// SPOLECNA CAST // + // get method ID + mid = (*env)->GetMethodID(env, + cls, + "onSubDelete", + "(Lorg/ocera/orte/types/AppInfo;Lorg/ocera/orte/types/SubInfo;)V"); + if(mid == 0) + { + #ifdef TEST_STAGE + printf(":!c: mid = NULL! \n"); + #endif + break; + } + // call method + (*env)->CallVoidMethod(env, + domain_events_cont->obj_de, + mid, + obj_ainfo, + obj_sinfo); + flag_ok = 1; + } while(0); + // while broken + if(flag_ok) + { + if((*jvm)->DetachCurrentThread(jvm) != 0) + { + printf(":c!: DetachCurrentThread fault! \n"); + return ORTE_FALSE; + } + } + + return ORTE_TRUE; +} \ No newline at end of file diff --git a/orte/libjorte/JORTEDomainMgrCreate.c b/orte/libjorte/JORTEDomainMgrCreate.c index 7c4358a..5fb4c96 100644 --- a/orte/libjorte/JORTEDomainMgrCreate.c +++ b/orte/libjorte/JORTEDomainMgrCreate.c @@ -25,19 +25,21 @@ * */ - +#include // origin orte headers #include "orte.h" // pregenerated header #include "jorte/org_ocera_orte_DomainMgr.h" #include "jorte/4all.h" +#include "jorte/jorte_typedefs_defines.h" +#include "jorte/jorte_protos_api.h" /* ****************************** * * create default manager domain * * ****************************** */ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainDefaultMgrCreate -(JNIEnv *env, jclass cls, jint jdomain, jboolean susp) +(JNIEnv *env, jobject obj, jint jdomain, jboolean susp) { jlong d; @@ -63,11 +65,98 @@ Java_org_ocera_orte_DomainMgr_jORTEDomainDefaultMgrCreate * *************************** */ JNIEXPORT jlong JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainMgrCreate -(JNIEnv *env, jclass cls, jint jdomain, jlong propHandle, - jlong eventsHandle, jboolean susp) +(JNIEnv *env, jobject obj, + jint jdomain, + jlong propHandle, + jlong eventsHandle, + jobject obj_de, + jboolean susp) { + JavaVM *jvm; + jclass cls; + jfieldID fid; jlong d; - + // + ORTEDomainAppEvents *dom_events; + JORTEDomainEventsContext_t *domain_events_cont; + //assign domain events only if not null + if(obj_de != NULL) { + // memory alocation + domain_events_cont = (JORTEDomainEventsContext_t *) malloc(sizeof(JORTEDomainEventsContext_t)); + // get jvm + jint b = (*env)->GetJavaVM(env,&jvm); + if (b < 0) + { + printf(":!c: getJavaVM() failed! \n"); + return 0; + } + // create global references + domain_events_cont->jvm = jvm; + // domain events + domain_events_cont->obj_de = (*env)->NewGlobalRef(env, obj_de); + // get new events + dom_events = (ORTEDomainAppEvents *) eventsHandle; + //////////////////////////////////////////////// + // set new events & their prarameters + // onRegFail + dom_events->onRegFail = (ORTEOnRegFail) onRegFail; + dom_events->onRegFailParam = (void *) domain_events_cont; + // onMgrNew + dom_events->onMgrNew = (ORTEOnMgrNew) onMgrNew; + dom_events->onMgrNewParam = (void *) domain_events_cont; + // onMgrDelete + dom_events->onMgrDelete = (ORTEOnMgrDelete) onMgrDelete; + dom_events->onMgrDeleteParam = (void *) domain_events_cont; + // onAppRemoteNew + dom_events->onAppRemoteNew = (ORTEOnAppRemoteNew) onAppRemoteNew; + dom_events->onAppRemoteNewParam = (void *) domain_events_cont; + // onAppDelete + dom_events->onAppDelete = (ORTEOnAppDelete) onAppDelete; + dom_events->onAppDeleteParam = (void *) domain_events_cont; + // onPubRemoteNew + dom_events->onPubRemoteNew = (ORTEOnPubRemote) onPubRemoteNew; + dom_events->onPubRemoteNewParam = (void *) domain_events_cont; + // onPubRemoteChanged + dom_events->onPubRemoteChanged = (ORTEOnPubRemote) onPubRemoteChanged; + dom_events->onPubRemoteChangedParam = (void *) domain_events_cont; + // onPubDelete + dom_events->onPubDelete = (ORTEOnPubDelete) onPubDelete; + dom_events->onPubDeleteParam = (void *) domain_events_cont; + // onSubRemoteNew + dom_events->onSubRemoteNew = (ORTEOnSubRemote) onSubRemoteNew; + dom_events->onSubRemoteNewParam = (void *) domain_events_cont; + // onSubRemoteChanged + dom_events->onSubRemoteChanged = (ORTEOnSubRemote) onSubRemoteChanged; + dom_events->onSubRemoteChangedParam = (void *) domain_events_cont; + // onSubDelete + dom_events->onSubDelete = (ORTEOnSubDelete) onSubDelete; + dom_events->onSubDeleteParam = (void *) domain_events_cont; + //////////////////////////////////////////////// + cls = (*env)->GetObjectClass(env, obj); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL \n"); + #endif + return 0; + } + // fieldID - domainEventsContextHandle + fid = (*env)->GetFieldID(env, + cls, + "domainEventsContextHandle", + "J"); + if(fid == 0) + { + #ifdef TEST_STAGE + printf(":!c: fid = NULL \n"); + #endif + return 0; + } + (*env)->SetLongField(env, + obj, + fid, + (jlong) domain_events_cont); + } // call ORTE function d = (jlong) ORTEDomainMgrCreate((int)jdomain, (ORTEDomainProp *) propHandle, diff --git a/orte/libjorte/JORTEDomainMgrDestroy.c b/orte/libjorte/JORTEDomainMgrDestroy.c index 0ba6207..e80ff49 100644 --- a/orte/libjorte/JORTEDomainMgrDestroy.c +++ b/orte/libjorte/JORTEDomainMgrDestroy.c @@ -26,30 +26,84 @@ * */ - +#include // origin orte headers #include "orte.h" // pregenerated header #include "jorte/org_ocera_orte_DomainMgr.h" #include "jorte/4all.h" +#include "jorte/jorte_typedefs_defines.h" JNIEXPORT jboolean JNICALL Java_org_ocera_orte_DomainMgr_jORTEDomainMgrDestroy -(JNIEnv *env, jclass cls, jlong dhandle) +(JNIEnv *env, jobject obj, jlong dhandle) { - int8_t b; + jlong h; + jclass cls; + jfieldID fid; + int flag_ok = 0; + + do { + // check domain handle + if (dhandle == 0) + { + printf(":!c: ORTEDomainAppDestroy failed! [bad handle] \n"); + break; + } + // call ORTE function + if(!ORTEDomainMgrDestroy((ORTEDomain *) dhandle)) + { + #ifdef TEST_STAGE + printf(":c: mgrDomain destroy failed.. \n"); + #endif + break; + } + // free domainEvents object + // find cls + cls = (*env)->GetObjectClass(env, obj); + if(cls == 0) + { + #ifdef TEST_STAGE + printf(":!c: cls = NULL! \n"); + #endif + break; + } + // fieldID + fid = (*env)->GetFieldID(env, + cls, + "domainEventsContextHandle", + "J"); + if(fid == 0) + { + #ifdef TEST_STAGE + printf(":!c: fid = NULL! \n"); + #endif + break; + } + // get value + h = (*env)->GetLongField(env, obj, fid); + if(h) + { + JORTEDomainEventsContext_t *ctx = (JORTEDomainEventsContext_t*)h; + if(ctx->obj_de) + { + #ifdef TEST_STAGE + printf(":c: deleting ctx->obj_de \n"); + #endif + (*env)->DeleteGlobalRef(env, ctx->obj_de); + } + // + free((void*)h); + } + flag_ok = 1; + } while(0); - // call ORTE function - b = ORTEDomainMgrDestroy((ORTEDomain *) dhandle); - if(b == ORTE_TRUE) + if(flag_ok == 0) { - #ifdef TEST_STAGE - printf(":c: mgrDomain destroy successfully.. \n"); - #endif - return 1; + printf(":!c: ORTEDomainMgrDestroy failed! \n"); + return 0; } - else - printf(":!c: mgrDomain destroy failed! [bad domain handle] \n"); - return 0; + + return 1; } diff --git a/orte/libjorte/JORTEPublicationGetStatus.c b/orte/libjorte/JORTEPublicationGetStatus.c index 87892ff..a8bf3cc 100644 --- a/orte/libjorte/JORTEPublicationGetStatus.c +++ b/orte/libjorte/JORTEPublicationGetStatus.c @@ -33,6 +33,7 @@ #include "jorte/4all.h" // pregenerated header #include "jorte/org_ocera_orte_Publication.h" +#include "jorte/jorte_protos_api.h" JNIEXPORT jobject JNICALL diff --git a/orte/libjorte/JORTESubscriptionDestroy.c b/orte/libjorte/JORTESubscriptionDestroy.c index 1cd9c12..dd8e606 100644 --- a/orte/libjorte/JORTESubscriptionDestroy.c +++ b/orte/libjorte/JORTESubscriptionDestroy.c @@ -52,6 +52,20 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionDestroy do { + if(subs_handle) + { + // call ORTE function + b = ORTESubscriptionDestroy((ORTESubscription *) subs_handle); + if (b == ORTE_BAD_HANDLE) + { + printf(":!c: subscription destroy failed! [bad sub handle] \n"); + break; + } + #ifdef TEST_STAGE + printf(":c: subscription destroy succesfuly.. \n"); + #endif + } + // free callBack object // find cls cls = (*env)->GetObjectClass(env, obj); @@ -74,19 +88,6 @@ Java_org_ocera_orte_Subscription_jORTESubscriptionDestroy #endif break; } - if(subs_handle) - { - // call ORTE function - b = ORTESubscriptionDestroy((ORTESubscription *) subs_handle); - if (b == ORTE_BAD_HANDLE) - { - printf(":!c: subscription destroy failed! [bad sub handle] \n"); - break; - } - #ifdef TEST_STAGE - printf(":c: subscription destroy succesfuly.. \n"); - #endif - } // get value h = (*env)->GetLongField(env, obj, fid); if(h) diff --git a/orte/libjorte/JORTESubscriptionGetStatus.c b/orte/libjorte/JORTESubscriptionGetStatus.c index 5485820..6ba6b05 100644 --- a/orte/libjorte/JORTESubscriptionGetStatus.c +++ b/orte/libjorte/JORTESubscriptionGetStatus.c @@ -33,6 +33,7 @@ #include "jorte/4all.h" // pregenerated header #include "jorte/org_ocera_orte_Subscription.h" +#include "jorte/jorte_protos_api.h" JNIEXPORT jobject JNICALL diff --git a/orte/libjorte/Makefile.omk b/orte/libjorte/Makefile.omk index b6517ff..7f1de70 100644 --- a/orte/libjorte/Makefile.omk +++ b/orte/libjorte/Makefile.omk @@ -29,6 +29,7 @@ JNtpTimeToStringMs.c \ JNtpTimeToStringUs.c \ JORTEDomainAppCreate.c \ JORTEDomainAppDestroy.c \ +JORTEDomainEvents.c \ JORTEDomainInitEvents.c \ JORTEDomainMgrCreate.c \ JORTEDomainMgrDestroy.c \