]> rtime.felk.cvut.cz Git - orte.git/blob - orte/libjorte/JORTESubscriptionDestroy.c
5d5569ed6f738204ee116979a847ddc67011d1ab
[orte.git] / orte / libjorte / JORTESubscriptionDestroy.c
1 /* JORTESubscriptionDestroy.c */
2
3 /**
4   * This code provides conversion between JAVA a C environments.
5   * The C functions are calling here and results are send to JAVA
6   * native functions. It uses the header pregenerated by JAVA
7   * (by command 'javah -jni class_with_native_function')
8   *
9   * @author Lukas Pokorny (lukas_pokorny@centrum.cz)
10   * @author CTU FEE Prague - Department of Control Engineering (dce.felk.cvut.cz)
11   * @author Project ORTE - OCERA Real Time Ethernet (www.ocera.org)
12   * @author dedication to Kj
13   * @version 0.1
14   *
15   *
16   * This program is free software; you can redistribute it and/or modify
17   * it under the terms of the GNU General Public License as published by
18   * the Free Software Foundation; either version 2 of the License, or
19   * (at your option) any later version.
20   *
21   * This program is distributed in the hope that it will be useful,
22   * but WITHOUT ANY WARRANTY; without even the implied warranty of
23   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24   * GNU General Public License for more details.
25   *
26   */
27
28
29 #include <stdlib.h>
30 // library header file's path
31 #include "orte.h"
32 // enable TEST_STAGE run level
33 #include "jorte/4all.h"
34 // pregenerated header
35 #include "jorte/org_ocera_orte_Subscription.h"
36 //
37 #include "jorte/jorte_typedefs_defines.h"
38
39 JNIEXPORT jboolean JNICALL
40 Java_org_ocera_orte_Subscription_jORTESubscriptionDestroy
41 (JNIEnv *env, jobject obj, jlong subs_handle)
42 {
43   int8_t        b;
44   jlong         h;
45   jclass        cls;
46   jfieldID      fid;
47   int           flag_ok = 0;
48
49   #ifdef TEST_STAGE
50     printf(":c: ORTESubscriptionDestroy() called.. \n");
51   #endif
52
53   do
54   {
55     if(subs_handle)
56     {
57       // call ORTE function
58       b = ORTESubscriptionDestroy((ORTESubscription *) subs_handle);
59       if (b == ORTE_BAD_HANDLE)
60       {
61         printf(":!c: subscription destroy failed! [bad sub handle] \n");
62         break;
63       }
64       #ifdef TEST_STAGE
65         printf(":c: subscription destroy succesfuly.. \n");
66       #endif
67     }
68
69     // free callBack object
70     // find cls
71     cls = (*env)->GetObjectClass(env, obj);
72     if(cls == 0)
73     {
74      #ifdef TEST_STAGE
75        printf(":!c: cls = NULL! \n");
76      #endif
77      break;
78     }
79     // fieldID
80     fid = (*env)->GetFieldID(env,
81                              cls,
82                              "callbackContextHandle",
83                              "J");
84     if(fid == 0)
85     {
86      #ifdef TEST_STAGE
87        printf(":!c: fid = NULL! \n");
88      #endif
89      break;
90     }
91     // get value
92     h = (*env)->GetLongField(env, obj, fid);
93     if(h)
94     {
95       //JavaVM *jvm;
96       //jint ret;
97       JORTECallbackContext_t *ctx = *((JORTECallbackContext_t**)h);
98       *((JORTECallbackContext_t**)h) = 0;
99       if(ctx->obj)
100       {
101         #ifdef TEST_STAGE
102           printf(":c: deleting ctx->obj \n");
103         #endif
104         (*env)->DeleteGlobalRef(env, ctx->obj);
105       }
106       if(ctx->rinfo)
107       {
108         #ifdef TEST_STAGE
109           printf(":c: deleting ctx->rinfo\n");
110         #endif
111         (*env)->DeleteGlobalRef(env, ctx->rinfo);
112       }
113       if(ctx->msg)
114       {
115         #ifdef TEST_STAGE
116           printf(":c: deleting ctx->msg\n");
117         #endif
118         (*env)->DeleteGlobalRef(env, ctx->msg);
119       }
120       if(ctx->obj_buf)
121       {
122         #ifdef TEST_STAGE
123           printf(":c: deleting ctx->obj_buf\n");
124         #endif
125         (*env)->DeleteGlobalRef(env, ctx->obj_buf);
126       }
127       //
128       free(ctx);
129     }
130     // set flag
131     flag_ok = 1;
132   } while(0);
133
134   #ifdef TEST_STAGE
135      printf(":c: flag_ok = %d \n",flag_ok);
136   #endif
137
138   if(flag_ok == 0)
139   {
140     return 0;
141   }
142
143   return 1;
144
145 }