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