1 martin 1.32 //%LICENSE////////////////////////////////////////////////////////////////
|
2 martin 1.33 //
|
3 martin 1.32 // Licensed to The Open Group (TOG) under one or more contributor license
4 // agreements. Refer to the OpenPegasusNOTICE.txt file distributed with
5 // this work for additional information regarding copyright ownership.
6 // Each contributor licenses this file to you under the OpenPegasus Open
7 // Source License; you may not use this file except in compliance with the
8 // License.
|
9 martin 1.33 //
|
10 martin 1.32 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
|
16 martin 1.33 //
|
17 martin 1.32 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
|
19 martin 1.33 //
|
20 martin 1.32 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
21 martin 1.33 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
22 martin 1.32 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
24 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
27 martin 1.33 //
|
28 martin 1.32 //////////////////////////////////////////////////////////////////////////
|
29 schuur 1.1 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #ifndef _Provider_JMPIImpl_h
33 #define _Provider_JMPIImpl_h
34
|
35 mark.hamzy 1.24 #include <Pegasus/Common/Config.h>
36
|
37 mark.hamzy 1.10 #include <jni.h>
|
38 mark.hamzy 1.24
39 #ifdef PEGASUS_PLATFORM_LINUX_GENERIC_GNU
40 #if defined (__GNUC__) && GCC_VERSION >= 40000
|
41 marek 1.31 // If gcc is compiled with -fvisibility=hidden then JMPI is broken.
|
42 kumpf 1.34 // This is because the JNI h file defines JNIEXPORT as empty since
|
43 marek 1.31 // the default is visible.
|
44 mark.hamzy 1.24 #undef JNIEXPORT
45 #define JNIEXPORT __attribute__ ((visibility("default")))
46 #endif
47 #endif
48
|
49 schuur 1.1 #include <stdio.h>
50 #include <stdlib.h>
51 #include <string.h>
52
53 #include <Pegasus/Common/String.h>
54 #include <Pegasus/Common/System.h>
|
55 mark.hamzy 1.11 #include <Pegasus/Common/HashTable.h>
|
56 mark.hamzy 1.19 #include <Pegasus/Common/CIMType.h>
|
57 mark.hamzy 1.17 #include <Pegasus/Common/Mutex.h>
|
58 mark.hamzy 1.26 #include <Pegasus/ProviderManager2/JMPI/Linkage.h>
|
59 schuur 1.1
60 PEGASUS_NAMESPACE_BEGIN
61
62 #define NULL_CHECK0(e) if ((e) == 0) return 0 //added by Andy
63 #define NULL_CHECK(e) if ((e) == 0) return //added by Andy
64
65 #define Catch(jEnv) \
66 catch(CIMException & e) { \
67 JMPIjvm::cacheIDs(jEnv); \
|
68 marek 1.31 jobject ev=jEnv->NewObject( \
69 JMPIjvm::jv.CIMExceptionClassRef, \
70 JMPIjvm::jv.CIMExceptionNewISt, \
71 (jint)e.getCode(), \
72 jEnv->NewStringUTF(e.getMessage().getCString())); \
|
73 schuur 1.1 jEnv->Throw((jthrowable)ev); \
74 } \
75 catch(Exception & e) { \
76 JMPIjvm::cacheIDs(jEnv);\
|
77 marek 1.31 jobject ev=jEnv->NewObject( \
78 JMPIjvm::jv.CIMExceptionClassRef, \
79 JMPIjvm::jv.CIMExceptionNewISt, \
80 (jint)1, \
81 jEnv->NewStringUTF(e.getMessage().getCString())); \
|
82 schuur 1.1 jEnv->Throw((jthrowable)ev); \
83 } \
84 catch(...) { \
85 JMPIjvm::cacheIDs(jEnv); \
|
86 marek 1.31 jobject ev=jEnv->NewObject( \
87 JMPIjvm::jv.CIMExceptionClassRef, \
88 JMPIjvm::jv.CIMExceptionNewISt, \
89 (jint)1, \
90 jEnv->NewStringUTF("Exception: Unknown")); \
|
91 schuur 1.1 jEnv->Throw((jthrowable)ev); \
92 }
93
|
94 mark.hamzy 1.14 typedef struct {
95 int clsIndex;
96 const char *methodName;
97 const char *signature;
98 } METHOD_STRUCT;
99
|
100 schuur 1.1 typedef struct jvmVector {
|
101 mark.hamzy 1.14 int initRc;
102 JavaVM *jvm;
103 JNIEnv *env;
104 jclass *classRefs;
105 jmethodID *instMethodIDs;
106 jmethodID *staticMethodIDs;
107 const METHOD_STRUCT *instanceMethodNames;
|
108 schuur 1.1 } JvmVector;
109
|
110 mark.hamzy 1.26 class PEGASUS_JMPIPM_LINKAGE JMPIjvm {
|
111 schuur 1.1 public:
|
112 schuur 1.2 static int trace;
|
113 schuur 1.1 static JavaVM *jvm;
114 static JvmVector jv;
|
115 mark.hamzy 1.11
|
116 schuur 1.1 JMPIjvm();
117 ~JMPIjvm();
|
118 schuur 1.2
|
119 schuur 1.1 static JNIEnv* attachThread(JvmVector **jvp);
120 static void detachThread();
121 static jobject getProvider(JNIEnv *env, const char *cn, jclass *cls) ;
|
122 marek 1.31 static jobject getProvider(
123 JNIEnv *env,
124 String jar,
125 String cln,
126 const char *cn,
127 jclass *cls) ;
|
128 schuur 1.1 static void checkException(JNIEnv *env);
129 static jstring NewPlatformString(JNIEnv *env,char *s);
|
130 marek 1.31 static jobjectArray NewPlatformStringArray(
131 JNIEnv *env,
132 char **strv,
133 int strc);
|
134 schuur 1.1 static int cacheIDs(JNIEnv *env);
|
135 schuur 1.3 static int destroyJVM();
|
136 mark.hamzy 1.11
|
137 schuur 1.1 private:
138 static jclass getGlobalClassRef(JNIEnv *env, const char* name);
139 static int initJVM();
|
140 mark.hamzy 1.11
|
141 marek 1.31 typedef HashTable<
142 String,
143 jclass,
144 EqualFunc<String>,
145 HashFunc<String> > ClassTable;
146 typedef HashTable<
147 String,
148 jobject,
149 EqualFunc<String>,
150 HashFunc<String> > ObjectTable;
|
151 mark.hamzy 1.11
152 static ClassTable _classTable;
153 static ObjectTable _objectTable;
|
154 mark.hamzy 1.16
155 static Mutex _initMutex;
|
156 schuur 1.1 };
157
158 class _nameSpace {
159 public:
160 _nameSpace();
161 _nameSpace(String hn);
162 _nameSpace(String hn, String ns);
|
163 mark.hamzy 1.10
|
164 schuur 1.1 int port();
165 String hostName();
166 String nameSpace();
|
167 mark.hamzy 1.28 Boolean isHttps ();
|
168 schuur 1.1 int port_;
169 String protocol_;
170 String hostName_;
171 String nameSpace_;
|
172 mark.hamzy 1.28 Boolean fHttps;
|
173 schuur 1.1 };
174
|
175 mark.hamzy 1.19 class _dataType {
176 public:
177
178 _dataType (int type,
179 int size,
180 Boolean reference,
181 Boolean null,
182 Boolean array,
183 String& refClass,
184 Boolean fromProperty)
185 : _type(type),
186 _size(size),
187 _reference(reference),
188 _array(array),
189 _refClass(refClass),
190 _fromProperty(fromProperty)
191 {
192 }
193
194 _dataType (int type)
195 : _type(type),
196 mark.hamzy 1.19 _size(1),
197 _reference(false),
198 _array(false),
199 _refClass(String::EMPTY),
200 _fromProperty(false)
201 {
202 }
|
203 schuur 1.1
|
204 mark.hamzy 1.19 _dataType (int type,
205 int size)
206 : _type(type),
207 _size(size),
208 _reference(false),
209 _array(true),
210 _refClass(String::EMPTY),
211 _fromProperty(true)
212 {
213 }
214
215 _dataType (int type,
216 const String ref)
217 : _type(type),
218 _size(0),
219 _reference(true),
220 _array(false),
221 _refClass(ref),
222 _fromProperty(true)
223 {
224 }
|
225 schuur 1.1
|
226 mark.hamzy 1.19 static int convertCTypeToJavaType (CIMType cType, bool *pfSuccess)
227 {
228 static int cTypeToJType[]=
229 /* CIMType.h CIMDataType.java
230 CIMTYPE_BOOLEAN, 0 public static final int BOOLEAN = 10;
231 CIMTYPE_UINT8, 1 public static final int UINT8 = 1;
232 CIMTYPE_SINT8, 2 public static final int SINT8 = 2;
233 CIMTYPE_UINT16, 3 public static final int UINT16 = 3;
234 CIMTYPE_SINT16, 4 public static final int SINT16 = 4;
235 CIMTYPE_UINT32, 5 public static final int UINT32 = 5;
236 CIMTYPE_SINT32, 6 public static final int SINT32 = 6;
237 CIMTYPE_UINT64, 7 public static final int UINT64 = 7;
238 CIMTYPE_SINT64, 8 public static final int SINT64 = 8;
239 CIMTYPE_REAL32, 9 public static final int REAL32 = 11;
240 CIMTYPE_REAL64, 10 public static final int REAL64 = 12;
241 CIMTYPE_CHAR16, 11 public static final int CHAR16 = 14;
242 CIMTYPE_STRING, 12 public static final int STRING = 9;
243 CIMTYPE_DATETIME, 13 public static final int DATETIME = 13;
244 CIMTYPE_REFERENCE, 14 public static final int REFERENCE = 0x20+ 1;
245 CIMTYPE_OBJECT 15 public static final int OBJECT = 15;
246 */
247 mark.hamzy 1.19 // p: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
248 {/* j: */ 10, 1, 2, 3, 4, 5, 6, 7, 8,11,12,14, 9,13,0x20+1,15};
249
250 if ((int)cType < (int)CIMTYPE_BOOLEAN || (int)cType > (int)CIMTYPE_OBJECT)
251 {
252 *pfSuccess = false;
253
254 return cTypeToJType[0];
255 }
256 else
257 {
258 *pfSuccess = true;
259
260 return cTypeToJType[cType];
261 }
262 }
263
264 static CIMType convertJavaTypeToCType (int jType, bool *pfSuccess)
265 {
266 static int jTypeToCType[]=
267 /* CIMDataType.java CIMType.h
268 mark.hamzy 1.19 public static final int UINT8 = 1; CIMTYPE_UINT8, 1
269 public static final int SINT8 = 2; CIMTYPE_SINT8, 2
270 public static final int UINT16 = 3; CIMTYPE_UINT16, 3
271 public static final int SINT16 = 4; CIMTYPE_SINT16, 4
272 public static final int UINT32 = 5; CIMTYPE_UINT32, 5
273 public static final int SINT32 = 6; CIMTYPE_SINT32, 6
274 public static final int UINT64 = 7; CIMTYPE_UINT64, 7
275 public static final int SINT64 = 8; CIMTYPE_SINT64, 8
276 public static final int STRING = 9; CIMTYPE_STRING, 12
277 public static final int BOOLEAN = 10; CIMTYPE_BOOLEAN, 0
278 public static final int REAL32 = 11; CIMTYPE_REAL32, 9
279 public static final int REAL64 = 12; CIMTYPE_REAL64, 10
280 public static final int DATETIME = 13; CIMTYPE_DATETIME, 13
281 public static final int CHAR16 = 14; CIMTYPE_CHAR16, 11
282 public static final int REFERENCE = 0x20+ 1; CIMTYPE_REFERENCE, 14
283 public static final int OBJECT = 15; CIMTYPE_OBJECT 15
284 */
285 // j: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
286 {/* p: */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 0, 9, 10, 13, 11, 15};
287
288 if (jType < 1)
289 mark.hamzy 1.19 {
290 *pfSuccess = false;
291
292 return CIMTYPE_BOOLEAN;
293 }
294 else if (jType <= 15)
295 {
296 *pfSuccess = true;
297
298 return (CIMType)jTypeToCType[jType];
299 }
300 else if (jType == 0x20 + 1) // REFERENCE
301 {
302 *pfSuccess = true;
303
304 return CIMTYPE_REFERENCE;
305 }
306 else
307 {
308 *pfSuccess = false;
309
310 mark.hamzy 1.19 return CIMTYPE_BOOLEAN;
311 }
312 }
313
314 static char *convertJavaTypeToChars (int jType, bool *pfSuccess)
315 {
316 static char *jTypeToChars[]= {
317 /* CIMDataType.java */ NULL,
318 /* public static final int UINT8 = 1; */ "uint8",
319 /* public static final int SINT8 = 2; */ "sint8",
320 /* public static final int UINT16 = 3; */ "uint16",
321 /* public static final int SINT16 = 4; */ "sint16",
322 /* public static final int UINT32 = 5; */ "uint32",
323 /* public static final int SINT32 = 6; */ "sint32",
324 /* public static final int UINT64 = 7; */ "uint64",
325 /* public static final int SINT64 = 8; */ "sint64",
326 /* public static final int STRING = 9; */ "string",
327 /* public static final int BOOLEAN = 10; */ "boolean",
328 /* public static final int REAL32 = 11; */ "real32",
329 /* public static final int REAL64 = 12; */ "real64",
330 /* public static final int DATETIME = 13; */ "datetime",
331 mark.hamzy 1.19 /* public static final int CHAR16 = 14; */ "char16",
332 /* public static final int OBJECT = 15; */ "object"
333 };
334
335 if (jType < 1)
336 {
337 *pfSuccess = false;
338
339 return NULL;
340 }
341 else if (jType <= 15)
342 {
343 *pfSuccess = true;
344
345 return jTypeToChars[jType];
346 }
347 else if (jType == 0x20 + 1) // REFERENCE
348 {
349 *pfSuccess = true;
350
351 return "reference";
352 mark.hamzy 1.19 }
353 else
354 {
355 *pfSuccess = false;
356
357 return NULL;
358 }
359 }
360
361 int _type;
362 int _size;
|
363 schuur 1.1 Boolean _reference;
364 Boolean _null;
365 Boolean _array;
|
366 mark.hamzy 1.19 String _refClass;
|
367 schuur 1.1 Boolean _fromProperty;
368 };
369
|
370 mark.hamzy 1.30 #define VectorClassRef classRefs[0]
371 #define BooleanClassRef classRefs[1]
372 #define ByteClassRef classRefs[2]
373 #define ShortClassRef classRefs[3]
374 #define IntegerClassRef classRefs[4]
375 #define LongClassRef classRefs[5]
376 #define FloatClassRef classRefs[6]
377 #define DoubleClassRef classRefs[7]
378 #define UnsignedInt8ClassRef classRefs[8]
379 #define UnsignedInt16ClassRef classRefs[9]
380 #define UnsignedInt32ClassRef classRefs[10]
381 #define UnsignedInt64ClassRef classRefs[11]
382 #define CIMObjectPathClassRef classRefs[12]
383 #define CIMExceptionClassRef classRefs[13]
384 #define BigIntegerClassRef classRefs[14]
385 #define CIMPropertyClassRef classRefs[15]
386 #define CIMOMHandleClassRef classRefs[16]
387 #define CIMClassClassRef classRefs[17]
388 #define CIMInstanceClassRef classRefs[18]
389 #define CIMValueClassRef classRefs[19]
390 #define ObjectClassRef classRefs[20]
391 mark.hamzy 1.30 #define ThrowableClassRef classRefs[21]
392 #define StringClassRef classRefs[22]
393 #define JarClassLoaderClassRef classRefs[23]
394 #define CIMDateTimeClassRef classRefs[24]
395 #define SelectExpClassRef classRefs[25]
396 #define CIMQualifierClassRef classRefs[26]
397 #define CIMQualifierTypeClassRef classRefs[27]
398 #define CIMFlavorClassRef classRefs[28]
399 #define CIMArgumentClassRef classRefs[29]
400 #define CIMInstanceExceptionClassRef classRefs[30]
401 #define CIMObjectClassRef classRefs[31]
402 #define CharacterClassRef classRefs[32]
403 #define OperationContextClassRef classRefs[33]
404 #define ClassClassRef classRefs[34]
|
405 mark.hamzy 1.29 #define ByteArrayOutputStreamClassRef classRefs[35]
406 #define PrintStreamClassRef classRefs[36]
|
407 mark.hamzy 1.13
|
408 mark.hamzy 1.30 #define BigIntegerValueOf staticMethodIDs[0]
409 #define JarClassLoaderLoad staticMethodIDs[1]
|
410 kumpf 1.34
|
411 mark.hamzy 1.30 #define VectorNew instMethodIDs[0]
412 #define VectorAddElement instMethodIDs[15]
413 #define VectorElementAt instMethodIDs[16]
414 #define VectorRemoveElementAt instMethodIDs[30]
415 #define VectorSize instMethodIDs[27]
416 #define BooleanNewZ instMethodIDs[1]
417 #define ByteNewB instMethodIDs[2]
418 #define ShortNewS instMethodIDs[3]
419 #define IntegerNewI instMethodIDs[4]
420 #define LongNewJ instMethodIDs[5]
421 #define FloatNewF instMethodIDs[6]
422 #define DoubleNewD instMethodIDs[7]
423 #define UnsignedInt8NewS instMethodIDs[8]
424 #define UnsignedInt16NewI instMethodIDs[9]
425 #define UnsignedInt32NewJ instMethodIDs[10]
426 #define UnsignedInt64NewBi instMethodIDs[11]
427 #define CIMObjectPathNewJ instMethodIDs[12]
428 #define CIMObjectPathCInst instMethodIDs[21]
429 #define CIMExceptionNewSt instMethodIDs[13]
430 #define CIMExceptionNewISt instMethodIDs[32]
431 #define CIMExceptionNewI instMethodIDs[18]
432 mark.hamzy 1.30 #define CIMExceptionNew instMethodIDs[41]
433 #define CIMExceptionNewStOb instMethodIDs[42]
434 #define CIMExceptionNewStObOb instMethodIDs[43]
435 #define CIMExceptionNewStObObOb instMethodIDs[44]
436 #define CIMExceptionGetCode instMethodIDs[33]
437 #define CIMExceptionGetID instMethodIDs[26]
438 #define CIMPropertyNewJ instMethodIDs[14]
439 #define CIMPropertyCInst instMethodIDs[28]
440 #define CIMOMHandleNewJSt instMethodIDs[17]
441 #define CIMOMHandleGetClass instMethodIDs[29]
442 #define CIMClassNewJ instMethodIDs[19]
443 #define CIMClassCInst instMethodIDs[23]
444 #define CIMInstanceNewJ instMethodIDs[20]
445 #define CIMInstanceCInst instMethodIDs[22]
446 #define CIMValueNewJ instMethodIDs[45]
447 #define CIMValueCInst instMethodIDs[31]
448 #define CIMDateTimeNewJ instMethodIDs[34]
449 #define SelectExpNewJ instMethodIDs[35]
450 #define CIMQualifierNewJ instMethodIDs[36]
451 #define CIMFlavorNewI instMethodIDs[37]
452 #define CIMFlavorGetFlavor instMethodIDs[38]
453 mark.hamzy 1.30 #define CIMArgumentNewJ instMethodIDs[40]
454 #define CIMArgumentCInst instMethodIDs[39]
455 #define ObjectToString instMethodIDs[24]
456 #define ThrowableGetMessage instMethodIDs[25]
457 #define CIMObjectNewJZ instMethodIDs[46]
458 #define CharacterNewC instMethodIDs[47]
459 #define OperationContextNewJ instMethodIDs[48]
460 #define OperationContextUnassociate instMethodIDs[49]
461 #define ClassGetInterfaces instMethodIDs[50]
462 #define ClassGetName instMethodIDs[51]
463 #define UnsignedInt64NewStr instMethodIDs[52]
|
464 mark.hamzy 1.29 #define ByteArrayOutputStreamNew instMethodIDs[53]
465 #define PrintStreamNewOb instMethodIDs[54]
466 #define ThrowablePrintStackTrace instMethodIDs[55]
467 #define ByteArrayOutputStreamToString instMethodIDs[56]
|
468 schuur 1.1
469 //extern "C" JNIEnv* attachThread(JvmVector**);
470 //extern "C" void detachThread();
471 //extern "C" jobject getProvider(JNIEnv*,const char*,jclass*);
472 //extern "C" void checkException(JNIEnv *env);
473
474 typedef JNIEnv* (*JvmAttach)(JvmVector**);
475 typedef void (*JvmDetach)();
476
477 PEGASUS_NAMESPACE_END
478
479 #endif
|