theLink 10.0
Loading...
Searching...
No Matches
MqHigh_jv.c
Go to the documentation of this file.
1
9/* LABEL-NO */
10
11#include "jni_h/jvmqmsgque_MqContextC.h"
12#include "LibMqMsgque_private_jv.h"
13
14#undef META_CONTEXT_S
15#define META_CONTEXT_S mqctx
16
17// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
18
19#define JavaErrorCheck2 if ((*env)->ExceptionCheck(env) == JNI_TRUE) goto error_jv;
20
21#define typeI8 MK_I8
22#define typeBOL MK_BOL
23#define typeI16 MK_I16
24#define typeI32 MK_I32
25#define typeFLT MK_FLT
26#define typeI64 MK_I64
27#define typeDBL MK_DBL
28#define typeSTR MK_STRN
29#define typeBIN MK_BINN
30#define typeBUF MK_BUF
31#define typeBFL MK_BFL
32#define typeHDL MK_HDL
33
34#define jniI8 jbyte
35#define jniBOL jboolean
36#define jniI16 jshort
37#define jniI32 jint
38#define jniFLT jfloat
39#define jniI64 jlong
40#define jniDBL jdouble
41#define jniHDL jint
42#define jniC ???
43#define jniB ???
44#define jniU ???
45#define jniL ???
46
48 JNIEnv *env, MK_MNG hdl, jobject val, jclass to, jsize pos, MK_STRN caller
49) {
50 enum MkErrorE ret;
51 if (val) {
52 jclass from = (*env)->GetObjectClass(env,val);
53
54 jstring sVal = (*env)->CallStaticObjectMethod(env,MK(Class_String),NS(MID_String_valueOf),val);
55 JavaErrorCheck;
56 jstring sFrom = (*env)->CallObjectMethod(env,from,MQ(MID_Class_getSimpleName));
57 JavaErrorCheck;
58 jstring sTo = (*env)->CallObjectMethod(env,to ,MQ(MID_Class_getSimpleName));
59 JavaErrorCheck;
60
61 MK_STRN cVal = (*env)->GetStringUTFChars(env,sVal ,NULL);
62 MK_STRN cFrom = (*env)->GetStringUTFChars(env,sFrom,NULL);
63 MK_STRN cTo = (*env)->GetStringUTFChars(env,sTo ,NULL);
64
65 ret = MkErrorSetV_4M_NULL(hdl,__func__,-1,
66 "expect '%s' argument but got '%s' of type '%s' at position '%d'",
67 cTo, cVal, cFrom, pos);
68
69 if (cFrom) (*env)->ReleaseStringUTFChars(env,sFrom,cFrom);
70 if (cTo) (*env)->ReleaseStringUTFChars(env,sTo ,cTo );
71 if (cVal) (*env)->ReleaseStringUTFChars(env,sVal ,cVal );
72 } else {
73 jstring sTo = (*env)->CallObjectMethod(env,to ,MQ(MID_Class_getSimpleName));
74
75 MK_STRN cTo = (*env)->GetStringUTFChars(env,sTo ,NULL);
76
77 ret = MkErrorSetV_4M_NULL(hdl,__func__,-1,
78 "expect '%s' argument but got '%s' at position '%d'",
79 cTo, "NULL", pos);
80
81 if (cTo) (*env)->ReleaseStringUTFChars(env,sTo ,cTo );
82 }
83
84 return ret;
85error:
86 (*env)->ExceptionDescribe(env);
87 (*env)->ExceptionClear(env);
88 MkErrorSetC_1_NULL("internal error...");
89 return MK_ERROR;
90}
91
92// -------------------------------------------------------------------
93
94#define BLOCK_START(T) \
95 jobject val = (*env)->GetObjectArrayElement(env, argv, *posP); \
96 JavaErrorCheck2 \
97 if (val == NULL) { \
98 goto null; \
99 } else if (OT_LNG_OBJ_CLASS_IS(val,MQ(Class_##T))) { \
100
101#define BLOCK_END(T) \
102 } else { \
103 MkErrorCheck(ArgumentTypeError(env,hdl,val,MQ(Class_##T),*posP,__func__)); \
104 } \
105end: \
106 (*posP)++; \
107 return MkErrorGetCode_0E(); \
108error: \
109 MkErrorStack_1X(hdl); \
110 goto end; \
111error_jv: \
112 OT_ERROR_LNG_2_META(hdl); \
113 goto end;
114
115// -------------------------------------------------------------------
116
117#define sendX1(T,TTT) \
118static enum MkErrorE send##T(MQ_RT_ARGS JNIEnv *env, MQ_CTX hdl, jobject argv, jsize *posP) { \
119 type##T out; \
120 BLOCK_START(T) \
121 out = (type##T)(*env)->Call##TTT##Method(env,val,MQ(get_##T)); \
122 JavaErrorCheck2 \
123 MkErrorCheck(MqSend##T(hdl,out)); \
124 } else if (OT_LNG_OBJ_CLASS_IS(val,MQ(Class_STR))) { \
125 MK_NUM cLen = (*env)->GetStringUTFLength(env,val); \
126 MK_STRN cVal = (*env)->GetStringUTFChars(env,val ,NULL); \
127 enum MkErrorE ret = MkString2##T##_RT(MK_RT_CALL cVal,cLen,&out); \
128 if (cVal) (*env)->ReleaseStringUTFChars(env,val ,cVal ); \
129 MkErrorCheck(ret); \
130 MkErrorCheck(MqSend##T(hdl,out)); \
131 BLOCK_END(T) \
132null: \
133 MqSend##T##_E(hdl,0); \
134 goto end; \
135}
136
137sendX1(BOL, Boolean)
138sendX1(I8 , Byte)
139sendX1(I16, Short)
140sendX1(I32, Int)
141sendX1(I64, Long)
142sendX1(FLT, Float)
143sendX1(DBL, Double)
144sendX1(HDL, Int)
145
146#define sendX2(T,ClassC) \
147static enum MkErrorE send##T(MQ_RT_ARGS JNIEnv *env, MQ_CTX hdl, jobject argv, jsize *posP) { \
148 type##T out; \
149 BLOCK_START(T) \
150 out = (type##T)pObj2Hdl(env,ClassC,val); \
151 JavaErrorCheck2 \
152 MkErrorCheck(MqSend##T(hdl,out)); \
153 BLOCK_END(T) \
154null: \
155 MqSend##T##_E(hdl,NULL); \
156 goto end; \
157}
158
159sendX2(BUF,"MkBufferC")
160sendX2(BFL,"MkBufferListC")
161
162static enum MkErrorE sendSTR(MQ_RT_ARGS JNIEnv *env, MQ_CTX hdl, jobject argv, jsize *posP) {
163 BLOCK_START(STR)
164 typeSTR out = (*env)->GetStringUTFChars(env,val,NULL);
166 enum MkErrorE ret = MqSendSTR(hdl,out);
167 if (out) (*env)->ReleaseStringUTFChars(env,val,out);
169 MkErrorCheck(ret);
170 BLOCK_END(STR)
171null:
172 MqSendSTR_E(hdl,NULL);
173 goto end;
174}
175
176static enum MkErrorE sendBIN(MQ_RT_ARGS JNIEnv *env, MQ_CTX hdl, jobject argv, jsize *posP) {
177 BLOCK_START(BIN)
178 typeBIN out = (MK_BINN) (*env)->GetByteArrayElements(env, val, NULL);
180 MK_SIZE sze = (MK_SIZE) (*env)->GetArrayLength (env, val);
182 enum MkErrorE ret = MqSendBIN(hdl,MkBinaryCreate(sze,out));
183 (*env)->ReleaseByteArrayElements(env, val, (jbyte*)out, JNI_ABORT);
185 MkErrorCheck(ret);
186 BLOCK_END(BIN)
187null:
188 MqSendBIN_E(hdl,MkBinaryCreate(0,NULL));
189 goto end;
190}
191
192// #############################################################################
193
194/*
195#define READ_ARGS_PROC JNIEnv *env, MK_MNG hdl, jobject *RET, int readNUM
196#define READ_ARGS_CALL env, hdl, &RET, readNUM
197
198#define READ_END \
199if (readNUM==1) { \
200 *RET = obj; \
201} else { \
202 if (readNUM==2) { \
203 jobject tmp = *RET; \
204 *RET = (*env)->NewObject(env,NS(Class_ArrayList),NS(MID_ArrayList_INIT)); \
205 JavaErrorCheck2 \
206 (*env)->CallBooleanMethod(env,*RET,NS(MID_ArrayList_Add),tmp); \
207 JavaErrorCheck2 \
208 } \
209 (*env)->CallBooleanMethod(env,*RET,NS(MID_ArrayList_Add),obj); \
210 JavaErrorCheck2 \
211} \
212error: \
213 return MkErrorGetCode(); \
214error_jv: \
215 NS(MkExceptionC_Catch)(env,hdl,NULL,__func__); \
216 return MkErrorGetCode();
217
218#define readX1(T) \
219static enum MkErrorE read##T(READ_ARGS_PROC) { \
220 type##T out = 0; \
221 MkErrorCheck(MqRead##T(hdl,&out)); \
222 jobject obj = (*env)->NewObject(env,NS(Class_##T),NS(set_##T),(jni##T)out); \
223 JavaErrorCheck2 \
224 READ_END \
225}
226
227readX1(O)
228readX1(Y)
229readX1(S)
230readX1(I)
231readX1(W)
232readX1(F)
233readX1(D)
234
235#define readX2(T,TT) \
236static enum MkErrorE read##T(READ_ARGS_PROC) { \
237 type##T out = 0; \
238 MkErrorCheck(MqRead##T(hdl,&out)); \
239 jobject obj = NS(TT)(env,out); \
240 JavaErrorCheck2 \
241 READ_END \
242}
243
244readX2(U,MkBufferC_ObjNew)
245readX2(L,MkBufferListC_ObjNew)
246
247static enum MkErrorE readC(READ_ARGS_PROC) {
248 typeC out = 0;
249 MkErrorCheck(MqReadSTR(hdl,&out));
250 jobject obj = JC2O(env,out);
251 JavaErrorCheck2
252 READ_END
253}
254
255static enum MkErrorE readB(READ_ARGS_PROC) {
256 MK_BINN out = 0;
257 MK_SIZE sze = 0;
258 MkErrorCheck(MqReadBIN(hdl,&out,&sze));
259 jbyteArray obj = (*env)->NewByteArray(env,sze);
260 JavaErrorCheck2
261 (*env)->SetByteArrayRegion(env,obj,0,sze,(jbyte*)out);
262 JavaErrorCheck2
263 READ_END
264}
265*/
266
267// -------------------------------------------------------------------------
268
269static enum MkErrorE getSTRING( MQ_RT_ARGS JNIEnv *env, MK_MNG hdl, jobject self, jobject argv, jsize *posP,
270 MK_STR str, size_t size ) {
271 jobject val = (*env)->GetObjectArrayElement(env, argv, *posP);
273 if (OT_LNG_OBJ_CLASS_IS(val,MK(Class_String))) {
274 MK_STRN strS = JO2C_START(env, val);
275 strncpy(str,strS,size);
276 JO2C_STOP(env,val,strS);
277 } else {
278 MkErrorCheck(ArgumentTypeError(env,hdl,val,MK(Class_String),*posP,__func__));
279 }
280error:
281 (*posP)++;
282 return MkErrorGetCode_0E();
283error_jv:
284 OT_ERROR_LNG_2_META(hdl);
285 goto error;
286}
287
288static enum MkErrorE getCALL(MQ_RT_ARGS JNIEnv *env, MK_MNG hdl, jobject self, jobject argv, jsize *posP, MK_CBP *cb) {
289 jobject val = (*env)->GetObjectArrayElement(env, argv, *posP);
291 if (OT_LNG_OBJ_CLASS_IS(val,NS(Class_MqServiceIF))) {
292 (*cb) = MK(ProcCreate)(MK_RT_CALL env, val, NULL, NS(MID_callback), true);
294 if ((*cb)==NULL) {
295 MkErrorSetC(hdl,"ERROR: expect an FUNCTION pointer, but got 'NULL'",__func__,-1);
296 goto error;
297 }
298 } else {
299 MkErrorCheck(ArgumentTypeError(env,hdl,val,NS(Class_MqServiceIF),*posP,__func__));
300 }
301error:
302 (*posP)++;
303 return MkErrorGetCode_0E();
304error_jv:
305 OT_ERROR_LNG_2_META(hdl);
306 goto error;
307}
308
309static enum MkErrorE getTIME(MQ_RT_ARGS JNIEnv *env, MK_MNG hdl, jobject argv, jsize *posP, MK_TIME_T *out) {
310 jobject val = (*env)->GetObjectArrayElement(env, argv, *posP);
312 if (OT_LNG_OBJ_CLASS_IS(val,MQ(Class_I64))) {
313 *out = (MK_TIME_T) (*env)->CallIntMethod(env,val,MQ(get_I64));
315 } else {
316 MkErrorCheck(ArgumentTypeError(env,hdl,val,MQ(Class_I64),*posP,__func__));
317 }
318error:
319 (*posP)++;
320 return MkErrorGetCode_0E();
321error_jv:
322 OT_ERROR_LNG_2_META(hdl);
323 goto error;
324}
325
326// #############################################################################
327// MqSend…
328
329JNIEXPORT jobject JNICALL Java_jvmqmsgque_MqContextC_Send (
330 JNIEnv *env,
331 jobject self,
332 jstring jcallSig,
333 jobjectArray argv
334) {
335 MQ_CTX hdl = (MQ_CTX)pObj2Hdl(env,"MqContextC",self);
336 if ((*env)->ExceptionCheck(env) == JNI_TRUE) return NULL;
337 AllRtSetup_X(hdl);
338
339 jsize objc = (*env)->GetArrayLength(env, argv);
340 jsize skip=0;
341 //int readNUM=0;
342 MK_CBP fCall = NULL;
343 MK_STRN cstr = NULL;
344
345 // jcallSig set by argument
346 //jobject jtokSig = NULL;
347 //jobject jsrvSig = NULL;
348
349 jobject retObj = NULL;
350
351#define highSELF "Send"
352
353// -----------------------------------------------------------------------------
354
355#define mqctx hdl
356
357#define highSKIP skip
358#define highSKIP_SHIFT 0
359#define highSIZE objc
360
361// -----------------------------------------------------------------------------
362
363#define highSIZE_AVAILABLE 1
364#define highREAD_RETURN_LIST 1
365#define highREAD_HAS_REFERENCE 0
366
367#define highTOKEN(s) MkErrorCheck(getSTRING(MQ_RT_CALL env,hdl,self,argv,&skip,s,MQ_SEND_TOKEN_SIGNATURE_SIZE))
368#define highTRAN(s) MkErrorCheck(getSTRING(MQ_RT_CALL env,hdl,self,argv,&skip,s,MQ_SEND_TRANSACTION_TOKEN_SIZE))
369#define highCALL(f) MkErrorCheck(getCALL(MQ_RT_CALL env,hdl,self,argv,&skip,&f))
370#define highTIME(t) MkErrorCheck(getTIME(MQ_RT_CALL env,hdl,argv,&skip,&t));
371
372#define highINITcstr cstr = JO2C_START(env,jcallSig); JavaErrorCheck; /* callSig */
373#define highCMD "ctx.%s('%s', ..., '%s', ...)"
374#define highFARGS(f) NS(ServiceCall),f,NS(ServiceFree)
375
376
377#define OT_retObj_SET_None retObj = NULL;
378#define OT_retObj_SET_BUF(obj) retObj = MK(MkBufferC_ObjNew)(MK_RT_CALL env,obj);
379#define OT_retObj_SET_BFL(obj) retObj = MK(MkBufferListC_ObjNew)(MK_RT_CALL env,obj);
380#define OT_MK_CALL_0(obj,cls,meth,ret) \
381 ret = (*env)->CallObjectMethod(env,cls##_NS(cls##_ObjNew)(MK_RT_CALL env,obj),cls##_NS(MID_##cls##_##meth));JavaErrorCheck;
382
383#define highRETURN highRETURN_type_S
384#define highRETok goto end
385
386#define highERRORnative if ((*env)->ExceptionCheck(env) == JNI_TRUE) OT_ERROR_LNG_2_META(mqctx);
387#define highRETerror OT_ERROR_META_2_LNG(hdl)
388
389// -----------------------------------------------------------------------------
390
391#define highSEND(T) MkErrorCheck(send##T(MQ_RT_CALL env,hdl,argv,&skip));break;
392
393#define highSend_I8 highSEND(I8)
394#define highSend_BOL highSEND(BOL)
395#define highSend_I16 highSEND(I16)
396#define highSend_I32 highSEND(I32)
397#define highSend_FLT highSEND(FLT)
398#define highSend_I64 highSEND(I64)
399#define highSend_DBL highSEND(DBL)
400#define highSend_STR highSEND(STR)
401#define highSend_BUF highSEND(BUF)
402#define highSend_BFL highSEND(BFL)
403#define highSend_BIN highSEND(BIN)
404#define highSend_HDL highSEND(HDL)
405
406// -----------------------------------------------------------------------------
407
408#define highREADprepare
409#define highREADinit /* readNUM++; */
410
411/*
412
413#define highREAD(T) MkErrorCheck(read##T(READ_ARGS_CALL)); break;
414
415#define highRead_I323232328 highREAD(Y);
416#define highRead_BINOL highREAD(O);
417#define highRead_I3232323216 highREAD(S);
418#define highRead_I32323232 highREAD(I);
419#define highRead_FLTLTLTLT highREAD(F);
420#define highRead_I64 highREAD(W);
421#define highRead_DBLBLBL highREAD(D);
422#define highRead_STR highREAD(C);
423#define highRead_BINUF highREAD(U);
424#define highRead_BINFL highREAD(L);
425#define highRead_BIN highREAD(B);
426*/
427
428#include "tmpl/high_lng.h"
429
430end:
431 if (callSig != unknown) JO2C_STOP(env,jcallSig,callSig);
432 return retObj;
433}
434
#define AllRtSetup_X(x)
#define typeSTR
Definition MqHigh_jv.c:28
static enum MkErrorE sendBIN(MK_RT mkrt, MQ_RT mqrt, JNIEnv *env, MQ_CTX hdl, jobject argv, jsize *posP)
Definition MqHigh_jv.c:176
static enum MkErrorE ArgumentTypeError(JNIEnv *env, MK_MNG hdl, jobject val, jclass to, jsize pos, MK_STRN caller)
Definition MqHigh_jv.c:47
static enum MkErrorE getSTRING(MK_RT mkrt, MQ_RT mqrt, JNIEnv *env, MK_MNG hdl, jobject self, jobject argv, jsize *posP, MK_STR str, size_t size)
Definition MqHigh_jv.c:269
#define typeBIN
Definition MqHigh_jv.c:29
#define sendX2(T, ClassC)
#define JavaErrorCheck2
Definition MqHigh_jv.c:19
static enum MkErrorE getCALL(MK_RT mkrt, MQ_RT mqrt, JNIEnv *env, MK_MNG hdl, jobject self, jobject argv, jsize *posP, MK_CBP *cb)
Definition MqHigh_jv.c:288
#define BLOCK_END(T)
Definition MqHigh_jv.c:101
#define sendX1(T, TTT)
Definition MqHigh_jv.c:117
#define BLOCK_START(T)
Definition MqHigh_jv.c:94
static enum MkErrorE getTIME(MK_RT mkrt, MQ_RT mqrt, JNIEnv *env, MK_MNG hdl, jobject argv, jsize *posP, MK_TIME_T *out)
Definition MqHigh_jv.c:309
#define MkErrorGetCode_0E()
#define MkErrorSetC(...)
#define MkErrorSetV_4M_NULL(m,...)
#define MkErrorSetC_1_NULL(msg)
static MkBinaryR MkBinaryCreate(MK_SIZE size, MK_BINN data)
MkErrorE
MK_ERROR
const MK_STRB * MK_STRN
MK_PTRB * MK_MNG
MK_PTRB * MK_CBP
MK_STRB * MK_STR
long MK_SIZE
time_t MK_TIME_T
MK_BINB const * MK_BINN
#define MK_RT_CALL
struct MqContextS * MQ_CTX
class-shortcut for struct MqContextS *, all shortcut using the XX_YYY syntax (only for public API) …
#define MqSendBIN(...)
#define MqSendSTR_E(...)
#define MqSendSTR(...)
#define MqSendBIN_E(...)
#define MQ_RT_ARGS
PUBLIC data structure for the jvmqmsgque-specific-data