1
2 /****************************************************************************
3 * Copyright by The HDF Group. *
4 * Copyright by the Board of Trustees of the University of Illinois. *
5 * All rights reserved. *
6 * *
7 * This file is part of HDF Java Products. The full HDF Java copyright *
8 * notice, including terms governing use, modification, and redistribution, *
9 * is contained in the file, COPYING. COPYING can be found at the root of *
10 * the source code distribution tree. You can also access it online at *
11 * http://support.hdfgroup.org/products/licenses.html. If you do not have *
12 * access to the file, you may request a copy from help@hdfgroup.org. *
13 ****************************************************************************/
14 /*
15 * This code is the C-interface called by Java programs to access the
16 * HDF 4 library.
17 *
18 * Each routine wraps a single HDF entry point, generally with the
19 * analogous arguments and return codes.
20 *
21 */
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 #include "hdf.h"
27 #include "hfile.h"
28 #include "jni.h"
29 #include "h4jni.h"
30
31 /*
32 * Class: hdf_hdflib_HDFLibrary
33 * Method: Hopen
34 * Signature: (Ljava/lang/String;II)J
35 */
36 JNIEXPORT jlong JNICALL
Java_hdf_hdflib_HDFLibrary_Hopen(JNIEnv * env,jclass clss,jstring hdfFile,jint access,jint ndds)37 Java_hdf_hdflib_HDFLibrary_Hopen
38 (JNIEnv *env, jclass clss, jstring hdfFile, jint access, jint ndds)
39 {
40 const char *file;
41 int32 retVal;
42 jclass jc;
43
44 PIN_JAVA_STRING(hdfFile, file);
45 if (file != NULL) {
46 /* open HDF file specified by hdf_HDF_file */
47 retVal = Hopen(file, (intn)access, (int16)ndds);
48
49 UNPIN_JAVA_STRING(hdfFile, file);
50
51 if (retVal == FAIL)
52 CALL_ERROR_CHECK();
53 }
54 return (jlong)retVal;
55 }
56
57 /*
58 * Class: hdf_hdflib_HDFLibrary
59 * Method: Hclose
60 * Signature: (J)Z
61 */
62 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_Hclose(JNIEnv * env,jclass clss,jlong fid)63 Java_hdf_hdflib_HDFLibrary_Hclose
64 (JNIEnv *env, jclass clss, jlong fid)
65 {
66 intn status = 0;
67
68 if (fid < 0) {
69 /* maybe not an exception -- the file is already closed? */
70 return JNI_FALSE;
71 }
72 /* close the HDF file */
73 status = Hclose((int32)fid);
74 if (status == FAIL) {
75 CALL_ERROR_CHECK();
76 return JNI_FALSE;
77 }
78
79 return JNI_TRUE;
80 }
81
82 /*
83 * Class: hdf_hdflib_HDFLibrary
84 * Method: HDdont_atexit
85 * Signature: ()I
86 */
87 JNIEXPORT jint JNICALL
Java_hdf_hdflib_HDFLibrary_HDdont_1atexit(JNIEnv * env,jclass clss)88 Java_hdf_hdflib_HDFLibrary_HDdont_1atexit
89 (JNIEnv *env, jclass clss)
90 {
91 intn ret_value = SUCCEED;
92 ret_value = HDdont_atexit();
93 return (jint)ret_value;
94 }
95
96 /*
97 * Class: hdf_hdflib_HDFLibrary
98 * Method: Hishdf
99 * Signature: (Ljava/lang/String;)Z
100 */
101 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_Hishdf(JNIEnv * env,jclass clss,jstring hdfFile)102 Java_hdf_hdflib_HDFLibrary_Hishdf
103 (JNIEnv *env, jclass clss, jstring hdfFile)
104 {
105
106 const char *hfile;
107 intn retVal;
108
109 PIN_JAVA_STRING(hdfFile, hfile);
110 if (hfile != NULL) {
111 /* open HDF file specified by hdf_HDF_file */
112 retVal = Hishdf(hfile);
113
114 UNPIN_JAVA_STRING(hdfFile, hfile);
115
116 if (retVal == FALSE) {
117 CALL_ERROR_CHECK();
118 return JNI_FALSE;
119 }
120 }
121
122 return JNI_TRUE;
123 }
124
125 /*
126 * Class: hdf_hdflib_HDFLibrary
127 * Method: Hnumber
128 * Signature: (JI)I
129 */
130 JNIEXPORT jint JNICALL
Java_hdf_hdflib_HDFLibrary_Hnumber(JNIEnv * env,jclass clss,jlong fid,jint tagtype)131 Java_hdf_hdflib_HDFLibrary_Hnumber
132 (JNIEnv *env, jclass clss, jlong fid, jint tagtype)
133 {
134 int32 retVal;
135
136 retVal = Hnumber((int32)fid, (uint16)tagtype);
137
138 if (retVal == FAIL)
139 CALL_ERROR_CHECK();
140
141 return (jint)retVal;
142 }
143
144 /*
145 * Class: hdf_hdflib_HDFLibrary
146 * Method: DFKNTsize
147 * Signature: (J)I
148 */
149 JNIEXPORT jint JNICALL
Java_hdf_hdflib_HDFLibrary_DFKNTsize(JNIEnv * env,jclass clss,jlong numbertype)150 Java_hdf_hdflib_HDFLibrary_DFKNTsize
151 (JNIEnv *env, jclass clss, jlong numbertype)
152 {
153 int retVal;
154
155 retVal = DFKNTsize((int32)numbertype);
156
157 if (retVal == FAIL)
158 CALL_ERROR_CHECK();
159
160 return (jint)retVal;
161 }
162
163 /*
164 * Class: hdf_hdflib_HDFLibrary
165 * Method: Hcache
166 * Signature: (JI)Z
167 */
168 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_Hcache(JNIEnv * env,jclass clss,jlong file_id,jint cache_switch)169 Java_hdf_hdflib_HDFLibrary_Hcache
170 (JNIEnv *env, jclass clss, jlong file_id, jint cache_switch)
171 {
172
173 intn rval;
174 rval = Hcache((int32)file_id, (intn)cache_switch);
175
176 if (rval == FAIL) {
177 CALL_ERROR_CHECK();
178 return JNI_FALSE;
179 }
180
181 return JNI_TRUE;
182 }
183
184 /*
185 * Class: hdf_hdflib_HDFLibrary
186 * Method: Hgetfileversion
187 * Signature: (J[I[Ljava/lang/String;)Z
188 */
189 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_Hgetfileversion(JNIEnv * env,jclass clss,jlong file_id,jintArray vers,jobjectArray fvstring)190 Java_hdf_hdflib_HDFLibrary_Hgetfileversion
191 (JNIEnv *env, jclass clss, jlong file_id, jintArray vers, jobjectArray fvstring)
192 {
193 intn rval;
194 char s[LIBVSTR_LEN+1];
195 jint *theArgs;
196 jboolean isCopy;
197
198 theArgs = ENVPTR->GetIntArrayElements(ENVPAR vers, &isCopy);
199
200 rval = Hgetfileversion((int32) file_id, (uint32 *)&(theArgs[0]),
201 (uint32 *)&(theArgs[1]), (uint32 *)&(theArgs[2]), s);
202 s[LIBVSTR_LEN] = '\0';
203
204 if (rval == FAIL) {
205 ENVPTR->ReleaseIntArrayElements(ENVPAR vers, theArgs, JNI_ABORT);
206 CALL_ERROR_CHECK();
207 return JNI_FALSE;
208 }
209 else {
210 jstring rstring;
211 jclass sjc;
212 jobject o;
213 jboolean bb;
214
215 ENVPTR->ReleaseIntArrayElements(ENVPAR vers, theArgs, 0);
216
217 /* convert it to java string */
218 rstring = ENVPTR->NewStringUTF(ENVPAR s);
219
220 sjc = ENVPTR->FindClass(ENVPAR "java/lang/String");
221 if (sjc == NULL) {
222 return JNI_FALSE;
223 }
224 o = ENVPTR->GetObjectArrayElement(ENVPAR fvstring, 0);
225 if (o == NULL) {
226 return JNI_FALSE;
227 }
228 bb = ENVPTR->IsInstanceOf(ENVPAR o, sjc);
229 if (bb == JNI_TRUE)
230 ENVPTR->SetObjectArrayElement(ENVPAR fvstring, 0, (jobject)rstring);
231 ENVPTR->DeleteLocalRef(ENVPAR o);
232 return bb;
233 }
234 return JNI_TRUE;
235 }
236
237 /*
238 * Class: hdf_hdflib_HDFLibrary
239 * Method: Hgetlibversion
240 * Signature: ([I[Ljava/lang/String;)Z
241 */
242 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_Hgetlibversion(JNIEnv * env,jclass clss,jintArray vers,jobjectArray lvstring)243 Java_hdf_hdflib_HDFLibrary_Hgetlibversion
244 (JNIEnv *env, jclass clss, jintArray vers, jobjectArray lvstring)
245 {
246 intn rval;
247 char s[LIBVSTR_LEN+1] ;
248 jint *theArgs;
249 jboolean isCopy;
250
251 s[LIBVSTR_LEN] = '\0';
252 if (lvstring == NULL) {
253 h4nullArgument(env, "Hgetlibversion: string is NULL");
254 } /* end if */
255 else if (vers == NULL) {
256 h4nullArgument(env, "Hgetlibversion: vers is NULL");
257 } /* end if */
258 else if (ENVPTR->GetArrayLength(ENVPAR vers) < 3) {
259 h4badArgument(env, "Hgetlibversion: vers input array < order 3");
260 } /* end else if */
261 else {
262 theArgs = ENVPTR->GetIntArrayElements(ENVPAR vers, &isCopy);
263 if (theArgs == NULL) {
264 h4JNIFatalError(env, "Hgetlibversion: vers not pinned");
265 } /* end if */
266 else {
267 rval = Hgetlibversion((uint32 *)&(theArgs[0]),
268 (uint32 *)&(theArgs[1]), (uint32 *)&(theArgs[2]), s);
269
270 if (rval == FAIL) {
271 ENVPTR->ReleaseIntArrayElements(ENVPAR vers, theArgs, JNI_ABORT);
272 CALL_ERROR_CHECK();
273 return JNI_FALSE;
274 }
275 else {
276 jstring rstring;
277 jclass sjc;
278 jobject o;
279 jboolean bb;
280
281 ENVPTR->ReleaseIntArrayElements(ENVPAR vers, theArgs, 0);
282
283 /* convert it to java string */
284 rstring = ENVPTR->NewStringUTF(ENVPAR s);
285
286 sjc = ENVPTR->FindClass(ENVPAR "java/lang/String");
287 if (sjc == NULL) {
288 return JNI_FALSE;
289 }
290 o = ENVPTR->GetObjectArrayElement(ENVPAR lvstring, 0);
291 if (o == NULL) {
292 return JNI_FALSE;
293 }
294 bb = ENVPTR->IsInstanceOf(ENVPAR o, sjc);
295 if (bb == JNI_TRUE)
296 ENVPTR->SetObjectArrayElement(ENVPAR lvstring, 0, (jobject)rstring);
297 ENVPTR->DeleteLocalRef(ENVPAR o);
298 return bb;
299 }
300 } /* end else */
301 } /* end else */
302 return JNI_TRUE;
303 }
304
305
306 /*
307 * Class: hdf_hdflib_HDFLibrary
308 * Method: Hsetaccesstype
309 * Signature: (JI)Z
310 */
311 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_Hsetaccesstype(JNIEnv * env,jclass clss,jlong h_id,jint access_type)312 Java_hdf_hdflib_HDFLibrary_Hsetaccesstype
313 (JNIEnv *env, jclass clss, jlong h_id, jint access_type)
314 {
315 intn rval;
316
317 rval = Hsetaccesstype((int32)h_id, (uintn)access_type);
318 if (rval == FAIL) {
319 CALL_ERROR_CHECK();
320 return JNI_FALSE;
321 }
322
323 return JNI_TRUE;
324 }
325
326 /*
327 * Class: hdf_hdflib_HDFLibrary
328 * Method: Hsync
329 * Signature: (J)Z
330 */
331 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_Hsync(JNIEnv * env,jclass clss,jlong file_id)332 Java_hdf_hdflib_HDFLibrary_Hsync
333 (JNIEnv *env, jclass clss, jlong file_id)
334 {
335 intn rval;
336
337 rval = Hsync((int32)file_id);
338 if (rval == FAIL) {
339 CALL_ERROR_CHECK();
340 return JNI_FALSE;
341 }
342
343 return JNI_TRUE;
344 }
345
346 /*
347 * Class: hdf_hdflib_HDFLibrary
348 * Method: HDFclose
349 * Signature: (J)Z
350 */
351 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_HDFclose(JNIEnv * env,jclass clss,jlong file_id)352 Java_hdf_hdflib_HDFLibrary_HDFclose
353 (JNIEnv *env, jclass clss, jlong file_id)
354 {
355 intn rval;
356
357 rval = Hclose((int32)file_id);
358
359 if (rval == FAIL) {
360 CALL_ERROR_CHECK();
361 return JNI_FALSE;
362 }
363
364 return JNI_TRUE;
365 }
366
367
368 /*
369 * Class: hdf_hdflib_HDFLibrary
370 * Method: HDFopen
371 * Signature: (Ljava/lang/String;IS)I
372 */
373 JNIEXPORT jint JNICALL
Java_hdf_hdflib_HDFLibrary_HDFopen(JNIEnv * env,jclass clss,jstring filename,jint access,jshort n_dds)374 Java_hdf_hdflib_HDFLibrary_HDFopen
375 (JNIEnv *env, jclass clss, jstring filename, jint access, jshort n_dds)
376 {
377 int32 rval;
378 const char *str;
379
380 PIN_JAVA_STRING(filename, str);
381 if (str != NULL) {
382 rval = HDFopen((char *)str, (intn)access, (int16)n_dds);
383
384 UNPIN_JAVA_STRING(filename, str);
385 if (rval == FAIL)
386 CALL_ERROR_CHECK();
387 }
388 return rval;
389 }
390
391
392 #ifdef not_yet_implemented
393 /*
394 * Class: hdf_hdflib_HDFLibrary
395 * Method: HDFflusdd
396 * Signature: (J)Z
397 */
398 JNIEXPORT jboolean JNICALL
Java_hdf_hdflib_HDFLibrary_HDFflusdd(JNIEnv * env,jclass clss,jlong file_id)399 Java_hdf_hdflib_HDFLibrary_HDFflusdd
400 (JNIEnv *env, jclass clss, jlong file_id)
401 {
402 intn rval;
403
404 rval = Hflushdd((int32)file_id);
405
406 if (rval == FAIL) {
407 CALL_ERROR_CHECK();
408 return JNI_FALSE;
409 }
410
411 return JNI_TRUE;
412 }
413 #endif
414
415 /*
416 * Class: hdf_hdflib_HDFLibrary
417 * Method: HDgetNTdesc
418 * Signature: (I)Ljava/lang/String;
419 */
420 JNIEXPORT jstring JNICALL
Java_hdf_hdflib_HDFLibrary_HDgetNTdesc(JNIEnv * env,jclass clss,jint nt)421 Java_hdf_hdflib_HDFLibrary_HDgetNTdesc
422 (JNIEnv *env, jclass clss, jint nt)
423 {
424 char *rval;
425 jstring rstring;
426
427 rval = HDgetNTdesc((int32)nt);
428
429 if (rval != NULL) {
430 rstring = ENVPTR->NewStringUTF(ENVPAR rval);
431 HDfree(rval);
432 }
433 else
434 rstring = NULL;
435
436 return rstring;
437 }
438
439 #ifdef __cplusplus
440 }
441 #endif
442