00001 #ifdef __cplusplus
00002 extern "C" {
00003 #endif
00004
00005
00006 #include <assert.h>
00007 #include "jni.h"
00008 #include "h5Object.h"
00009 #include "h5File.h"
00010 #include "h5Dataset.h"
00011 #include "rcConnect.h"
00012 #include "miscUtil.h"
00013
00014 #define NODEBUG
00015 #define NODEBUG_CONN
00016 #define FILE_FIELD_SEPARATOR "::"
00017
00018 #ifdef _WIN32
00019 #pragma comment(lib,"ws2_32")
00020 #endif
00021
00022 #ifdef __cplusplus
00023 #define ENV_PTR (env)
00024 #define ENV_PAR
00025 #else
00026 #define ENV_PTR (*env)
00027 #define ENV_PAR env,
00028 #endif
00029
00030 #ifdef __cplusplus
00031 extern "C" {
00032 #endif
00033
00034 extern int h5ObjRequest(rcComm_t *conn, void *obj, int objID);
00035
00036 #ifdef __cplusplus
00037 }
00038 #endif
00039
00040
00041 #define THROW_JNI_ERROR(_ex, _msg) { \
00042 ENV_PTR->ThrowNew(ENV_PAR ENV_PTR->FindClass(ENV_PAR _ex), _msg); \
00043 ret_val = -1; \
00044 goto done; \
00045 }
00046
00047 #define GOTO_JNI_ERROR() { \
00048 ret_val = -1; \
00049 goto done; \
00050 }
00051
00052
00053 static int file_count = 0;
00054
00055 rcComm_t *server_connection = NULL;
00056 rcComm_t *make_connection(JNIEnv *env);
00057 void close_connection(rcComm_t *conn_t);
00058 rodsEnv rodsServerEnv;
00059
00060 jint h5file_request(JNIEnv *env, jobject jobj);
00061 jint h5dataset_request(JNIEnv *env, jobject jobj);
00062 jint h5group_request(JNIEnv *env, jobject jobj);
00063 jint j2c_h5file(JNIEnv *env, jobject jobj, H5File *cobj);
00064 jint j2c_h5dataset(JNIEnv *env, jobject jdataset, H5Dataset *cobj);
00065 jint j2c_h5group(JNIEnv *env, jobject jobj, H5Group *cobj);
00066 jint c2j_h5file(JNIEnv *env, jobject jobj, H5File *cobj);
00067 jint c2j_h5dataset_read(JNIEnv *env, jobject jdataset, H5Dataset *cobj);
00068 jint c2j_h5dataset_read_attribute(JNIEnv *env, jobject jdataset, H5Dataset *cobj);
00069 jint c2j_h5group(JNIEnv *env, jobject jfile, jobject jgroup, H5Group *cgroup, const char *filename);
00070 jobject c2j_data_value (JNIEnv *env, void *value, unsigned int npoints, int tclass, int tsize);
00071 jint c2j_h5group_read_attribute(JNIEnv *env, jobject jobj, H5Group *cobj);
00072
00073 int load_field_method_IDs(JNIEnv *env);
00074 void set_field_method_IDs_scalar();
00075 void set_field_method_IDs_compound();
00076
00077
00078 void print_file(H5File *file);
00079 void print_group(rcComm_t *conn, H5Group *pg);
00080 void print_dataset(H5Dataset *d);
00081 void print_dataset_value(H5Dataset *d);
00082 void print_datatype(H5Datatype *type);
00083 void print_dataspace(H5Dataspace *space);
00084 void print_attribute(H5Attribute *a);
00085
00086 jint getFileList(JNIEnv *env, jobject flist, jmethodID addElement, rcComm_t *conn, collHandle_t *coll);
00087
00088
00089
00090
00091
00092
00093 jclass cls_file=NULL;
00094 jfieldID field_file_opID=NULL;
00095 jfieldID field_file_fid=NULL;
00096 jfieldID field_file_rootGroup=NULL;
00097 jfieldID field_file_fullFileName=NULL;
00098
00099 jfieldID field_hobject_fullName=NULL;
00100 jfieldID field_hobject_filename=NULL;
00101 jmethodID method_hobject_getFID=NULL;
00102
00103 jclass cls_group=NULL;
00104 jfieldID field_group_opID=NULL;
00105 jmethodID method_group_ctr=NULL;
00106 jmethodID method_group_addToMemberList=NULL;
00107 jmethodID method_group_addAttribute=NULL;
00108
00109 jclass cls_dataset=NULL;
00110 jfieldID field_dataset_opID=NULL;
00111 jfieldID field_dataset_rank=NULL;
00112 jfieldID field_dataset_dims=NULL;
00113 jfieldID field_dataset_selectedDims=NULL;
00114 jfieldID field_dataset_startDims=NULL;
00115 jfieldID field_dataset_selectedIndex=NULL;
00116 jfieldID field_dataset_selectedStride=NULL;
00117 jfieldID field_dataset_datatype=NULL;
00118 jmethodID method_dataset_ctr=NULL;
00119 jmethodID method_dataset_init=NULL;
00120 jmethodID method_dataset_setData=NULL;
00121 jmethodID method_dataset_addAttribute=NULL;
00122
00123 jclass cls_dataset_scalar=NULL;
00124 jfieldID field_dataset_scalar_opID=NULL;
00125 jfieldID field_dataset_scalar_isImage=NULL;
00126 jfieldID field_dataset_scalar_isImageDisplay=NULL;
00127 jfieldID field_dataset_scalar_isTrueColor=NULL;
00128 jfieldID field_dataset_scalar_interlace=NULL;
00129 jmethodID method_dataset_scalar_ctr=NULL;
00130 jmethodID method_dataset_scalar_init=NULL;
00131 jmethodID method_dataset_scalar_addAttribute=NULL;
00132
00133
00134 jmethodID method_dataset_scalar_setPalette=NULL;
00135
00136 jclass cls_dataset_compound=NULL;
00137 jfieldID field_dataset_compound_opID=NULL;
00138 jmethodID method_dataset_compound_ctr=NULL;
00139 jmethodID method_dataset_compound_init=NULL;
00140 jmethodID method_dataset_compound_addAttribute=NULL;
00141
00142
00143 jfieldID field_dataset_compound_memberNames=NULL;
00144 jfieldID field_dataset_compound_memberTypes=NULL;
00145 jmethodID method_dataset_compound_setMemberCount=NULL;
00146
00147 jclass cls_datatype=NULL;
00148 jfieldID field_datatype_class=NULL;
00149 jfieldID field_datatype_size=NULL;
00150 jfieldID field_datatype_order=NULL;
00151 jfieldID field_datatype_sign=NULL;
00152 jmethodID method_datatype_ctr = NULL;
00153
00154 int load_field_method_IDs(JNIEnv *env)
00155 {
00156 int ret_val = -1;
00157 jclass cls;
00158
00159
00160
00161
00162 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/object/FileFormat");
00163 if (!cls)
00164 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/object/FileFormat");
00165
00166
00167 field_file_fid = ENV_PTR->GetFieldID(ENV_PAR cls, "fid", "I");
00168 if (!field_file_fid)
00169 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/FileFormat.fid");
00170
00171
00172
00173
00174 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/srb/H5SrbFile");
00175 if (!cls)
00176 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/srb/H5SrbFile");
00177
00178 cls_file = cls;
00179
00180 field_file_opID = ENV_PTR->GetFieldID(ENV_PAR cls, "opID", "I");
00181 if (!field_file_opID)
00182 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbFile.opID");
00183
00184 field_file_fullFileName = ENV_PTR->GetFieldID(ENV_PAR cls, "fullFileName", "Ljava/lang/String;");
00185 if (!field_file_fullFileName)
00186 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbFile.fullFileName");
00187
00188 field_file_rootGroup = ENV_PTR->GetFieldID(ENV_PAR cls, "rootGroup", "Lncsa/hdf/srb/H5SrbGroup;");
00189 if (!field_file_rootGroup)
00190 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbFile.rootGroup");
00191
00192
00193
00194
00195 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/object/HObject");
00196 if (!cls)
00197 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/object/HObject");
00198
00199 field_hobject_fullName = ENV_PTR->GetFieldID(ENV_PAR cls, "fullName", "Ljava/lang/String;");
00200 if (!field_hobject_fullName)
00201 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/HObject.fullName");
00202
00203 field_hobject_filename = ENV_PTR->GetFieldID(ENV_PAR cls, "filename", "Ljava/lang/String;");
00204 if (!field_hobject_filename)
00205 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/HObject.filename");
00206
00207 method_hobject_getFID = ENV_PTR->GetMethodID(ENV_PAR cls, "getFID", "()I");
00208 if (!method_hobject_getFID)
00209 THROW_JNI_ERROR ("java/lang/NoSuchMethodException","ncsa/hdf/oject/HObject.getFID");
00210
00211
00212
00213
00214 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/srb/H5SrbGroup");
00215 if (!cls)
00216 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/srb/H5SrbGroup");
00217
00218 cls_group = cls;
00219
00220 field_group_opID = ENV_PTR->GetFieldID(ENV_PAR cls, "opID", "I");
00221 if (!field_group_opID)
00222 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbGroup.opID");
00223
00224 method_group_ctr = ENV_PTR->GetMethodID(ENV_PAR cls, "<init>",
00225 "(Lncsa/hdf/object/FileFormat;Ljava/lang/String;Ljava/lang/String;Lncsa/hdf/object/Group;[J)V");
00226 if (!method_group_ctr)
00227 THROW_JNI_ERROR ("java/lang/NoSuchMethodException","ncsa/hdf/srb/H5SrbGroup.<init>");
00228
00229 method_group_addToMemberList = ENV_PTR->GetMethodID(ENV_PAR cls, "addToMemberList", "(Lncsa/hdf/object/HObject;)V");
00230 if (!method_group_addToMemberList)
00231 THROW_JNI_ERROR ("java/lang/NoSuchMethodException","ncsa/hdf/srb/H5SrbGroup.addToMemberList()");
00232
00233 method_group_addAttribute = ENV_PTR->GetMethodID(ENV_PAR cls, "addAttribute",
00234 "(Ljava/lang/String;Ljava/lang/Object;[JIIII)V");
00235 if (!method_group_addAttribute)
00236 THROW_JNI_ERROR ("java/lang/NoSuchMethodException","ncsa/hdf/srb/H5SrbGroup.addAttribute()");
00237
00238
00239
00240
00241 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/object/Dataset");
00242 if (!cls)
00243 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/object/Dataset");
00244
00245 field_dataset_rank = ENV_PTR->GetFieldID(ENV_PAR cls, "rank", "I");
00246 if (!field_dataset_rank)
00247 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Dataset.rank");
00248
00249 field_dataset_dims = ENV_PTR->GetFieldID(ENV_PAR cls, "dims", "[J");
00250 if (!field_dataset_dims)
00251 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Dataset.dims");
00252
00253 field_dataset_selectedDims = ENV_PTR->GetFieldID(ENV_PAR cls, "selectedDims", "[J");
00254 if (!field_dataset_selectedDims)
00255 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Dataset.selectedDims");
00256
00257 field_dataset_startDims = ENV_PTR->GetFieldID(ENV_PAR cls, "startDims", "[J");
00258 if (!field_dataset_startDims)
00259 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Dataset.startDims");
00260
00261 field_dataset_selectedIndex = ENV_PTR->GetFieldID(ENV_PAR cls, "selectedIndex", "[I");
00262 if (!field_dataset_selectedIndex)
00263 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Dataset.selectedIndex");
00264
00265 field_dataset_selectedStride = ENV_PTR->GetFieldID(ENV_PAR cls, "selectedStride", "[J");
00266 if (!field_dataset_selectedStride)
00267 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Dataset.selectedStride");
00268
00269 field_dataset_datatype = ENV_PTR->GetFieldID(ENV_PAR cls, "datatype", "Lncsa/hdf/object/Datatype;");
00270 if (!field_dataset_datatype)
00271 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Dataset.datatype");
00272
00273 method_dataset_setData = ENV_PTR->GetMethodID(ENV_PAR cls, "setData", "(Ljava/lang/Object;)V");
00274 if (!method_dataset_setData)
00275 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/object/Dataset.setData");
00276
00277
00278
00279
00280 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/srb/H5SrbScalarDS");
00281 if (!cls)
00282 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/srb/H5SrbScalarDS");
00283
00284 cls_dataset_scalar = cls;
00285
00286 field_dataset_scalar_opID = ENV_PTR->GetFieldID(ENV_PAR cls, "opID", "I");
00287 if (!field_dataset_scalar_opID)
00288 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbScalarDS.opID");
00289
00290 field_dataset_scalar_isImage = ENV_PTR->GetFieldID(ENV_PAR cls, "isImage", "Z");
00291 if (!field_dataset_scalar_isImage)
00292 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbScalarDS.isImage");
00293
00294 field_dataset_scalar_isImageDisplay = ENV_PTR->GetFieldID(ENV_PAR cls, "isImageDisplay", "Z");
00295 if (!field_dataset_scalar_isImageDisplay)
00296 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbScalarDS.isImageDisplay");
00297
00298 field_dataset_scalar_isTrueColor = ENV_PTR->GetFieldID(ENV_PAR cls, "isTrueColor", "Z");
00299 if (!field_dataset_scalar_isTrueColor)
00300 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbScalarDS.isTrueColor");
00301
00302 field_dataset_scalar_interlace = ENV_PTR->GetFieldID(ENV_PAR cls, "interlace", "I");
00303 if (!field_dataset_scalar_interlace)
00304 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbScalarDS.interlace");
00305
00306 method_dataset_scalar_ctr = ENV_PTR->GetMethodID(ENV_PAR cls, "<init>",
00307 "(Lncsa/hdf/object/FileFormat;Ljava/lang/String;Ljava/lang/String;[J)V");
00308 if (!method_dataset_scalar_ctr)
00309 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbScalarDS.<init>");
00310
00311 method_dataset_scalar_init = ENV_PTR->GetMethodID(ENV_PAR cls, "init", "()V");
00312 if (! method_dataset_scalar_init)
00313 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbCompoundDS.init");
00314
00315 method_dataset_scalar_addAttribute = ENV_PTR->GetMethodID(ENV_PAR cls, "addAttribute",
00316 "(Ljava/lang/String;Ljava/lang/Object;[JIIII)V");
00317 if (!method_dataset_scalar_addAttribute)
00318 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbScalarDS.addAttribute()");
00319
00320 method_dataset_scalar_setPalette = ENV_PTR->GetMethodID(ENV_PAR cls, "setPalette", "([B)V");
00321 if (!method_dataset_scalar_setPalette)
00322 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbScalarDS.setPalette()");
00323
00324
00325
00326
00327 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/object/CompoundDS");
00328 if (!cls)
00329 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/object/CompoundDS");
00330
00331 field_dataset_compound_memberNames = ENV_PTR->GetFieldID(ENV_PAR cls, "memberNames", "[Ljava/lang/String;");
00332 if (!field_dataset_compound_memberNames)
00333 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/CompoundDS.memberNames");
00334
00335 field_dataset_compound_memberTypes = ENV_PTR->GetFieldID(ENV_PAR cls, "memberTypes", "[Lncsa/hdf/object/Datatype;");
00336 if (!field_dataset_compound_memberTypes)
00337 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/CompoundDS.memberTypes");
00338
00339
00340
00341
00342 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/srb/H5SrbCompoundDS");
00343 if (!cls)
00344 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/srb/H5SrbCompoundDS");
00345
00346 cls_dataset_compound = cls;
00347
00348 field_dataset_compound_opID = ENV_PTR->GetFieldID(ENV_PAR cls, "opID", "I");
00349 if (!field_dataset_compound_opID)
00350 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/srb/H5SrbCompoundDS.opID");
00351
00352 method_dataset_compound_ctr = ENV_PTR->GetMethodID(ENV_PAR cls, "<init>",
00353 "(Lncsa/hdf/object/FileFormat;Ljava/lang/String;Ljava/lang/String;[J)V");
00354 if (! method_dataset_compound_ctr)
00355 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbCompoundDS.<init>");
00356
00357 method_dataset_compound_init = ENV_PTR->GetMethodID(ENV_PAR cls, "init", "()V");
00358 if (! method_dataset_compound_init)
00359 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbCompoundDS.init");
00360
00361 method_dataset_compound_addAttribute = ENV_PTR->GetMethodID(ENV_PAR cls, "addAttribute",
00362 "(Ljava/lang/String;Ljava/lang/Object;[JIIII)V");
00363 if (!method_dataset_compound_addAttribute)
00364 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbCompoundDS.addAttribute");
00365
00366 method_dataset_compound_setMemberCount = ENV_PTR->GetMethodID(ENV_PAR cls_dataset_compound,"setMemberCount", "(I)V");
00367 if (!method_dataset_compound_setMemberCount)
00368 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbCompoundDS.setMemberCount");
00369
00370
00371
00372
00373 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/object/Datatype");
00374 if (!cls)
00375 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/object/Datatype");
00376
00377 field_datatype_class = ENV_PTR->GetFieldID(ENV_PAR cls, "datatypeClass", "I");
00378 if (!field_datatype_class)
00379 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Datatype.datatypeClass");
00380
00381 field_datatype_size = ENV_PTR->GetFieldID(ENV_PAR cls, "datatypeSize", "I");
00382 if (!field_datatype_size)
00383 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Datatype.datatypeSize");
00384
00385 field_datatype_order = ENV_PTR->GetFieldID(ENV_PAR cls, "datatypeOrder", "I");
00386 if (!field_datatype_order)
00387 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Datatype.datatypeOrder");
00388
00389 field_datatype_sign = ENV_PTR->GetFieldID(ENV_PAR cls, "datatypeSign", "I");
00390 if (!field_datatype_sign)
00391 THROW_JNI_ERROR ("java/lang/NoSuchFieldException", "ncsa/hdf/object/Datatype.datatypeSign");
00392
00393
00394
00395
00396 cls = ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/srb/H5SrbDatatype");
00397 if (!cls)
00398 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "ncsa/hdf/srb/H5SrbDatatype");
00399
00400 cls_datatype = cls;
00401
00402 method_datatype_ctr = ENV_PTR->GetMethodID(ENV_PAR cls, "<init>", "(IIII)V");
00403 if (!method_datatype_ctr)
00404 THROW_JNI_ERROR ("java/lang/NoSuchMethodException", "ncsa/hdf/srb/H5SrbDatatype.<init>");
00405
00406 ret_val = 0;
00407
00408 done:
00409
00410 return ret_val;
00411 }
00412
00413 void set_field_method_IDs_scalar()
00414 {
00415 cls_dataset = cls_dataset_scalar;
00416 field_dataset_opID = field_dataset_scalar_opID;
00417 method_dataset_ctr = method_dataset_scalar_ctr;
00418 method_dataset_init = method_dataset_scalar_init;
00419 method_dataset_addAttribute = method_dataset_scalar_addAttribute;
00420 }
00421
00422 void set_field_method_IDs_compound()
00423 {
00424 cls_dataset = cls_dataset_compound;
00425 field_dataset_opID = field_dataset_compound_opID;
00426 method_dataset_ctr = method_dataset_compound_ctr;
00427 method_dataset_init = method_dataset_compound_init;
00428 method_dataset_addAttribute = method_dataset_compound_addAttribute;
00429 }
00430
00431
00432
00433
00434 rcComm_t *make_connection(JNIEnv *env) {
00435 rcComm_t *conn_t;
00436 rErrMsg_t errMsg;
00437 int ret_val;
00438
00439 ret_val = getRodsEnv(&rodsServerEnv);
00440 if (ret_val<0) {
00441 ENV_PTR->ThrowNew(ENV_PAR ENV_PTR->FindClass(ENV_PAR "java/lang/RuntimeException"), "getRodsEnv() failed");
00442 return NULL;
00443 }
00444
00445 conn_t = rcConnect (rodsServerEnv.rodsHost, rodsServerEnv.rodsPort,
00446 rodsServerEnv.rodsUserName, rodsServerEnv.rodsZone, 1, &errMsg);
00447
00448 if ( (NULL == conn_t) ) {
00449 ENV_PTR->ThrowNew(ENV_PAR ENV_PTR->FindClass(ENV_PAR "java/lang/RuntimeException"), errMsg.msg);
00450 return NULL;
00451 }
00452
00453 ret_val = clientLogin(conn_t);
00454
00455 if (ret_val != 0) {
00456 rcDisconnect(conn_t);
00457 ENV_PTR->ThrowNew(ENV_PAR ENV_PTR->FindClass(ENV_PAR "java/lang/RuntimeException"), "Client login failed");
00458 return NULL;
00459 }
00460
00461 return conn_t;
00462 }
00463
00464 void close_connection(rcComm_t *conn_t)
00465 {
00466 if (conn_t != NULL) {
00467 rcDisconnect (conn_t);
00468 conn_t = NULL;
00469 }
00470 }
00471
00472
00473
00474
00475
00476
00477 JNIEXPORT jstring JNICALL Java_ncsa_hdf_srb_H5SRB_getFileFieldSeparator
00478 (JNIEnv *env, jclass cls)
00479 {
00480 return ENV_PTR->NewStringUTF(ENV_PAR FILE_FIELD_SEPARATOR);
00481 }
00482
00483
00484
00485
00486
00487
00488 JNIEXPORT void JNICALL Java_ncsa_hdf_srb_H5SRB_callServerInit
00489 (JNIEnv *env, jclass cls, jstring jpasswd)
00490 {
00491 char *passwd;
00492 jboolean isCopy;
00493
00494 passwd = (char *)ENV_PTR->GetStringUTFChars(ENV_PAR jpasswd,&isCopy);
00495 if (passwd != NULL && strlen(passwd)>0) {
00496 obfSavePw(0, 0, 0, passwd);
00497 }
00498 }
00499
00500
00501
00502
00503
00504
00505
00506 JNIEXPORT void JNICALL Java_ncsa_hdf_srb_H5SRB__1getServerInfo
00507 (JNIEnv *env, jclass cls, jobjectArray jInfo)
00508 {
00509 int n, status;
00510 jstring jstr;
00511 char str[NAME_LEN];
00512
00513 n = ENV_PTR->GetArrayLength(ENV_PAR jInfo);
00514 if (n<14) {
00515 ENV_PTR->ThrowNew(ENV_PAR ENV_PTR->FindClass(ENV_PAR "java/lang/IllegalArgumentException"),
00516 "Array size for server information is less than 14");
00517 }
00518
00519 status = getRodsEnv(&rodsServerEnv);
00520
00521 if (status<0) {
00522 ENV_PTR->ThrowNew(ENV_PAR ENV_PTR->FindClass(ENV_PAR "java/lang/RuntimeException"), "getRodsEnv() failed");
00523 }
00524
00525
00526 if ( (rodsServerEnv.rodsUserName == NULL || strlen(rodsServerEnv.rodsUserName) < 1) ||
00527 (rodsServerEnv.rodsHost == NULL || strlen (rodsServerEnv.rodsHost) <1) ||
00528 (rodsServerEnv.rodsPort < 1) ||
00529 (rodsServerEnv.rodsHome == NULL || strlen(rodsServerEnv.rodsHome) < 1) ) {
00530 ENV_PTR->ThrowNew(ENV_PAR ENV_PTR->FindClass(ENV_PAR "java/lang/RuntimeException"), "getRodsEnv() failed");
00531 }
00532
00533 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsUserName);
00534 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 0, jstr);
00535
00536 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsHost);
00537 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 1, jstr);
00538
00539 str[0] = '\0';
00540 sprintf(str, "%d", rodsServerEnv.rodsPort);
00541 jstr = ENV_PTR->NewStringUTF(ENV_PAR str);
00542 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 2, jstr);
00543
00544 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.xmsgHost);
00545 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 3, jstr);
00546
00547 str[0] = '\0';
00548 sprintf(str, "%d", rodsServerEnv.xmsgPort);
00549 jstr = ENV_PTR->NewStringUTF(ENV_PAR str);
00550 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 4, jstr);
00551
00552 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsHome);
00553 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 5, jstr);
00554
00555 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsCwd);
00556 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 6, jstr);
00557
00558 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsAuthScheme);
00559 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 7, jstr);
00560
00561 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsDefResource);
00562 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 8, jstr);
00563
00564 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsZone);
00565 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 9, jstr);
00566
00567 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsServerDn);
00568 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 10, jstr);
00569
00570 str[0] = '\0';
00571 sprintf(str, "%d", rodsServerEnv.rodsLogLevel);
00572 jstr = ENV_PTR->NewStringUTF(ENV_PAR str);
00573 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 11, jstr);
00574
00575 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsAuthFileName);
00576 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 12, jstr);
00577
00578 jstr = ENV_PTR->NewStringUTF(ENV_PAR rodsServerEnv.rodsDebug);
00579 ENV_PTR->SetObjectArrayElement(ENV_PAR jInfo, 13, jstr);
00580 }
00581
00582
00583
00584
00585
00586
00587 JNIEXPORT jint JNICALL Java_ncsa_hdf_srb_H5SRB_getFileList
00588 (JNIEnv *env, jclass cls, jobject flist)
00589 {
00590 int ret_val = 0;
00591 int flag = 0;
00592 collHandle_t collHandle;
00593 jclass vectClass = NULL;
00594 jmethodID method_vector_addElement = NULL;
00595
00596
00597
00598
00599 vectClass = ENV_PTR->FindClass(ENV_PAR "java/util/Vector");
00600 if (!vectClass)
00601 THROW_JNI_ERROR ("java/lang/ClassNotFoundException", "java/util/Vector");
00602
00603 method_vector_addElement = ENV_PTR->GetMethodID(ENV_PAR vectClass, "addElement", "(Ljava/lang/Object;)V");
00604 if (!method_vector_addElement)
00605 THROW_JNI_ERROR ("java/lang/NoSuchMethodException","java/util/Vector.method_vector_addElement()");
00606
00607
00608 if (server_connection == NULL) {
00609 if ( (server_connection = make_connection(env)) == NULL )
00610 THROW_JNI_ERROR("java/lang/RuntimeException", "Cannot make connection to the server");
00611 }
00612
00613 flag |= LONG_METADATA_FG;
00614 ret_val = rclOpenCollection (server_connection, rodsServerEnv.rodsHome, flag, &collHandle);
00615 if (ret_val <0)
00616 THROW_JNI_ERROR("java/lang/RuntimeException", "rclOpenCollection() failed");
00617
00618 getFileList(env, flist, method_vector_addElement, server_connection, &collHandle);
00619
00620 done:
00621
00622 rclCloseCollection (&collHandle);
00623
00624 return (jint)ret_val;
00625 }
00626
00627
00628
00629
00630
00631
00632 JNIEXPORT jint JNICALL Java_ncsa_hdf_srb_H5SRB_h5ObjRequest
00633 (JNIEnv *env, jclass cls, jobject jobj, jint obj_type)
00634 {
00635 int ret_val=0;
00636
00637 if (server_connection == NULL) {
00638 if ( (server_connection = make_connection(env)) == NULL )
00639 THROW_JNI_ERROR("java/lang/RuntimeException", "Cannot make connection to the server");
00640 }
00641
00642 load_field_method_IDs(env);
00643
00644 switch (obj_type) {
00645 case H5OBJECT_FILE:
00646 ret_val = h5file_request(env, jobj);
00647 break;
00648 case H5OBJECT_DATASET:
00649 ret_val = h5dataset_request(env, jobj);
00650 break;
00651 case H5OBJECT_GROUP:
00652 ret_val = h5group_request(env, jobj);
00653 break;
00654 default:
00655 THROW_JNI_ERROR("java/lang/UnsupportedOperationException", "Unsupported client request");
00656 break;
00657 }
00658
00659 done:
00660 return ret_val;
00661 }
00662
00663 jint getFileList(JNIEnv *env, jobject flist, jmethodID addElement,
00664 rcComm_t *conn, collHandle_t *collHandle)
00665 {
00666 int ret_val = 0;
00667 collEnt_t collEnt;
00668 char fname[MAX_NAME_LEN];
00669
00670 while ((ret_val = rclReadCollection (conn, collHandle, &collEnt)) >= 0) {
00671 fname[0] = '\0';
00672 if (collEnt.objType == DATA_OBJ_T) {
00673 char dsize_unit = ' ';
00674 double dsize = (double)collEnt.dataSize;
00675 if ((collEnt.dataSize>>30) > 0) {
00676 dsize = (double)(collEnt.dataSize/1073741824.0);
00677 dsize_unit = 'G';
00678 } else if ((collEnt.dataSize>>20) > 0) {
00679 dsize = (double)(collEnt.dataSize/1048576.0);
00680 dsize_unit = 'M';
00681 } else if ((collEnt.dataSize>>10) > 0) {
00682 dsize = (double)(collEnt.dataSize/1024.0);
00683 dsize_unit = 'K';
00684 }
00685
00686
00687
00688
00689
00690
00691 if (collEnt.dataSize>0) {
00692 sprintf(fname, "%s/%s %s %.1f%c", collEnt.collName, collEnt.dataName,
00693 FILE_FIELD_SEPARATOR, dsize, dsize_unit);
00694 ENV_PTR->CallVoidMethod(ENV_PAR flist, addElement, ENV_PTR->NewStringUTF(ENV_PAR fname));
00695 }
00696 } else if (collEnt.objType == COLL_OBJ_T) {
00697 collHandle_t subCollhandle;
00698
00699
00700
00701
00702
00703 ret_val = rclOpenCollection (conn, collEnt.collName, collHandle->flags, &subCollhandle);
00704 if (ret_val < 0)
00705 THROW_JNI_ERROR("java/lang/RuntimeException", "rclOpenCollection() failed");
00706
00707
00708 getFileList(env, flist, addElement, conn, &subCollhandle);
00709 rclCloseCollection (&subCollhandle);
00710 }
00711 }
00712
00713 done:
00714
00715 return (jint)ret_val;
00716 }
00717
00718
00719
00720
00721
00722
00723 jint h5file_request(JNIEnv *env, jobject jobj)
00724 {
00725 jint ret_val = 0;
00726 H5File h5file;
00727
00728 assert(server_connection);
00729
00730 H5File_ctor(&h5file);
00731
00732 if ( (ret_val = j2c_h5file (env, jobj, &h5file)) < 0)
00733 goto done;
00734
00735
00736 #ifdef DEBUG
00737 printf("opID = %d\n", h5file.opID);
00738 printf("fileName = %s\n", h5file.filename);
00739 #endif
00740
00741 #ifdef DEBUG_CONN
00742 printf("\nirodsProt = %d\n", server_connection->irodsProt);
00743 printf("host = %s\n", server_connection->host);
00744 printf("sock = %d\n", server_connection->sock);
00745 printf("portNum = %d\n", server_connection->portNum);
00746 printf("loggedIn = %d\n", server_connection->loggedIn);
00747 printf("proxy userName = %s\n", server_connection->proxyUser.userName);
00748 printf("proxy rodsZone = %s\n", server_connection->proxyUser.rodsZone);
00749 printf("client userName = %s\n", server_connection->clientUser.userName);
00750 printf("client rodsZone = %s\n", server_connection->clientUser.rodsZone);
00751 printf("flag = %d\n", server_connection->flag);
00752 printf("status = %d\n", server_connection->status);
00753 printf("\nfilename = %s\n", h5file.filename);
00754 printf("opID = %d\n\n", h5file.opID);
00755 #endif
00756
00757
00758 if (h5ObjRequest(server_connection, &h5file, H5OBJECT_FILE) < 0)
00759 {
00760 H5File_dtor(&h5file);
00761 THROW_JNI_ERROR("java/lang/RuntimeException", "file h5ObjRequest() failed");
00762 }
00763
00764 #ifdef DEBUG
00765 print_group(server_connection, h5file.root);fflush(stdout);
00766 #endif
00767
00768 if ( (ret_val = c2j_h5file (env, jobj, &h5file)) < 0)
00769 goto done;
00770
00771 if (H5FILE_OP_OPEN == h5file.opID || H5FILE_OP_CREATE==h5file.opID)
00772 file_count++;
00773 else if (H5FILE_OP_CLOSE == h5file.opID)
00774 file_count--;
00775
00776 done:
00777
00778 if (file_count <=0 ) {
00779 close_connection(server_connection);
00780 server_connection = NULL;
00781 }
00782
00783 H5File_dtor(&h5file);
00784
00785 return ret_val;
00786 }
00787
00788
00789
00790
00791
00792
00793 jint h5dataset_request(JNIEnv *env, jobject jobj)
00794 {
00795 jint ret_val=0, i=0;
00796 H5Dataset h5dataset;
00797
00798 assert(server_connection);
00799
00800 H5Dataset_ctor(&h5dataset);
00801
00802 if ( ENV_PTR->IsInstanceOf(ENV_PAR jobj, ENV_PTR->FindClass(ENV_PAR "ncsa/hdf/srb/H5SrbScalarDS")) )
00803 set_field_method_IDs_scalar();
00804 else
00805 set_field_method_IDs_compound();
00806
00807 if ( (ret_val = j2c_h5dataset(env, jobj, &h5dataset)) < 0)
00808 goto done;
00809
00810
00811 if (h5ObjRequest(server_connection, &h5dataset, H5OBJECT_DATASET) < 0) {
00812 H5Dataset_dtor(&h5dataset);
00813 THROW_JNI_ERROR("java/lang/RuntimeException", "dataset h5ObjRequest() failed");
00814 }
00815
00816 if (h5dataset.value && h5dataset.space.npoints==0) {
00817 h5dataset.space.npoints = 1;
00818 for (i=0; i<h5dataset.space.rank; i++)
00819 h5dataset.space.npoints *= h5dataset.space.count[i];
00820 }
00821
00822 if ( h5dataset.opID == H5DATASET_OP_READ_ATTRIBUTE)
00823 ret_val = c2j_h5dataset_read_attribute (env, jobj, &h5dataset);
00824 else if (h5dataset.opID == H5DATASET_OP_READ)
00825 ret_val = c2j_h5dataset_read (env, jobj, &h5dataset);
00826
00827 done:
00828
00829 H5Dataset_dtor(&h5dataset);
00830
00831 return ret_val;
00832 }
00833
00834
00835
00836
00837
00838
00839 jint h5group_request(JNIEnv *env, jobject jobj)
00840 {
00841 jint ret_val=0;
00842 H5Group h5group;
00843
00844 assert(server_connection);
00845
00846 H5Group_ctor(&h5group);
00847
00848 if ( (ret_val = j2c_h5group(env, jobj, &h5group)) < 0)
00849 goto done;
00850
00851
00852 if (h5ObjRequest(server_connection, &h5group, H5OBJECT_GROUP) < 0) {
00853 H5Group_dtor(&h5group);
00854 THROW_JNI_ERROR("java/lang/RuntimeException", "group h5ObjRequest() failed");
00855 }
00856
00857 if ( h5group.opID == H5GROUP_OP_READ_ATTRIBUTE)
00858 ret_val = c2j_h5group_read_attribute (env, jobj, &h5group);
00859
00860 done:
00861
00862 H5Group_dtor(&h5group);
00863
00864 return ret_val;
00865 }
00866
00867
00868 jint j2c_h5file(JNIEnv *env, jobject jobj, H5File *cobj)
00869 {
00870 jint ret_val = 0;
00871 jstring jstr;
00872 const char *cstr;
00873 char jni_name[] = "j2c_h5file";
00874
00875 assert(cobj);
00876
00877 cobj->opID = ENV_PTR->GetIntField(ENV_PAR jobj, field_file_opID);
00878 cobj->fid = ENV_PTR->GetIntField(ENV_PAR jobj, field_file_fid);
00879
00880 if (H5FILE_OP_OPEN == cobj->opID) {
00881 jstr = (jstring) (ENV_PTR->GetObjectField(ENV_PAR jobj, field_file_fullFileName));
00882 if (NULL == (cstr = (char *)ENV_PTR->GetStringUTFChars(ENV_PAR jstr, NULL)) )
00883 THROW_JNI_ERROR("java/lang/OutOfMemoryError", jni_name);
00884
00885 cobj->filename = (char *)malloc(strlen(cstr)+1);
00886 strcpy(cobj->filename, cstr);
00887 ENV_PTR->ReleaseStringUTFChars(ENV_PAR jstr, cstr);
00888 }
00889
00890 done:
00891 return ret_val;
00892 }
00893
00894
00895 jint j2c_h5dataset(JNIEnv *env, jobject jobj, H5Dataset *cobj)
00896 {
00897 jint ret_val = 0;
00898 jstring jstr;
00899 const char *cstr;
00900 char jni_name[] = "j2c_h5dataset";
00901 jobject jtype;
00902 jlongArray ja;
00903 jlong *jptr;
00904 int i=0;
00905
00906 assert(cobj);
00907
00908 cobj->opID = ENV_PTR->GetIntField(ENV_PAR jobj, field_dataset_opID);
00909 cobj->fid = ENV_PTR->CallIntMethod(ENV_PAR jobj, method_hobject_getFID);
00910
00911
00912 jstr = (jstring) ENV_PTR->GetObjectField(ENV_PAR jobj, field_hobject_fullName);
00913 if (NULL == (cstr = (char *)ENV_PTR->GetStringUTFChars(ENV_PAR jstr, NULL)) )
00914 THROW_JNI_ERROR("java/lang/OutOfMemoryError", jni_name);
00915 cobj->fullpath = (char *)malloc(strlen(cstr)+1);
00916 strcpy(cobj->fullpath, cstr);
00917 ENV_PTR->ReleaseStringUTFChars(ENV_PAR jstr, cstr);
00918
00919 if (H5DATASET_OP_READ == cobj->opID)
00920 {
00921
00922 jtype = ENV_PTR->GetObjectField(ENV_PAR jobj, field_dataset_datatype);
00923 cobj->type.tclass = (H5Datatype_class_t) ENV_PTR->GetIntField(ENV_PAR jtype, field_datatype_class);
00924 cobj->type.size = (unsigned int) ENV_PTR->GetIntField(ENV_PAR jtype, field_datatype_size);
00925
00926 cobj->type.sign = (H5Datatype_sign_t) ENV_PTR->GetIntField(ENV_PAR jtype, field_datatype_sign);
00927 cobj->type.order =(H5Datatype_order_t)get_machine_endian();
00928
00929
00930 cobj->space.rank = (int)ENV_PTR->GetIntField(ENV_PAR jobj, field_dataset_rank);
00931
00932
00933 ja = (jlongArray) ENV_PTR->GetObjectField(ENV_PAR jobj, field_dataset_dims);
00934 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR ja, 0);
00935 if (jptr != NULL) {
00936 for (i=0; i<cobj->space.rank; i++) {
00937 cobj->space.dims[i] = (unsigned int)jptr[i];
00938 }
00939 ENV_PTR->ReleaseLongArrayElements(ENV_PAR ja, jptr, 0);
00940 }
00941
00942
00943 ja = (jlongArray) ENV_PTR->GetObjectField(ENV_PAR jobj, field_dataset_startDims);
00944 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR ja, 0);
00945 if (jptr != NULL) {
00946 for (i=0; i<cobj->space.rank; i++) {
00947 cobj->space.start[i] = (unsigned int)jptr[i];
00948 }
00949 ENV_PTR->ReleaseLongArrayElements(ENV_PAR ja, jptr, 0);
00950 }
00951
00952
00953
00954 ja = (jlongArray) ENV_PTR->GetObjectField(ENV_PAR jobj, field_dataset_selectedStride);
00955 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR ja, 0);
00956 if (jptr != NULL) {
00957 for (i=0; i<cobj->space.rank; i++) {
00958 cobj->space.stride[i] = (unsigned int)jptr[i];
00959 }
00960 ENV_PTR->ReleaseLongArrayElements(ENV_PAR ja, jptr, 0);
00961 }
00962
00963
00964 ja = (jlongArray) ENV_PTR->GetObjectField(ENV_PAR jobj, field_dataset_selectedDims);
00965 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR ja, 0);
00966 if (jptr != NULL) {
00967 for (i=0; i<cobj->space.rank; i++) {
00968 cobj->space.count[i] = (unsigned int)jptr[i];
00969 }
00970 ENV_PTR->ReleaseLongArrayElements(ENV_PAR ja, jptr, 0);
00971 }
00972 }
00973
00974 done:
00975 return ret_val;
00976 }
00977
00978
00979 jint j2c_h5group(JNIEnv *env, jobject jobj, H5Group *cobj)
00980 {
00981 jint ret_val = 0;
00982 jstring jstr;
00983 const char *cstr;
00984 char jni_name[] = "j2c_h5group";
00985
00986 assert(cobj);
00987
00988 cobj->opID = ENV_PTR->GetIntField(ENV_PAR jobj, field_group_opID);
00989 cobj->fid = ENV_PTR->CallIntMethod(ENV_PAR jobj, method_hobject_getFID);
00990
00991
00992 jstr = (jstring) ENV_PTR->GetObjectField(ENV_PAR jobj, field_hobject_fullName);
00993 if (NULL == (cstr = (char *)ENV_PTR->GetStringUTFChars(ENV_PAR jstr, NULL)) )
00994 THROW_JNI_ERROR("java/lang/OutOfMemoryError", jni_name);
00995 cobj->fullpath = (char *)malloc(strlen(cstr)+1);
00996 strcpy(cobj->fullpath, cstr);
00997 ENV_PTR->ReleaseStringUTFChars(ENV_PAR jstr, cstr);
00998
00999 done:
01000 return ret_val;
01001 }
01002
01003
01004 jint c2j_h5file(JNIEnv *env, jobject jobj, H5File *cobj)
01005 {
01006 jint ret_val = 0;
01007 jobject jroot;
01008 char jni_name[] = "c2j_h5file";
01009
01010 assert(cobj);
01011
01012
01013 if (H5FILE_OP_CLOSE == cobj->opID)
01014 goto done;
01015
01016
01017 ENV_PTR->SetIntField(ENV_PAR jobj, field_file_fid, (jint)cobj->fid);
01018
01019
01020 if (NULL == (jroot = ENV_PTR->GetObjectField(ENV_PAR jobj, field_file_rootGroup)) )
01021 THROW_JNI_ERROR("java/lang/NoSuchFieldException", jni_name);
01022
01023 if ( c2j_h5group(env, jobj, jroot, cobj->root, cobj->filename) < 0)
01024 THROW_JNI_ERROR("java/lang/RuntimeException", jni_name);
01025
01026 done:
01027 return (jint)cobj->fid;
01028 }
01029
01030
01031 jint c2j_h5group(JNIEnv *env, jobject jfile, jobject jgroup, H5Group *cgroup, const char *filename)
01032 {
01033 jint ret_val = 0;
01034 char jni_name[] = "c2j_h5group";
01035 int i=0,j=0;
01036 jstring jpath, jfilename;
01037 jlongArray joid;
01038 jlongArray jdims;
01039 H5Group *cg;
01040 H5Dataset *cd;
01041 jobject jg;
01042 jobject jd, jdtype;
01043 jlong *jptr;
01044
01045 if (NULL==jfile || NULL == jgroup || NULL == cgroup || NULL==filename)
01046 THROW_JNI_ERROR("java/lang/NullPointerException", jni_name);
01047
01048 jfilename = ENV_PTR->NewStringUTF(ENV_PAR filename);
01049
01050 if (cgroup->groups && cgroup->ngroups>0) {
01051 for (i=0; i<cgroup->ngroups; i++) {
01052 cg = &cgroup->groups[i];
01053 if (NULL == cg) continue;
01054
01055
01056 jpath = ENV_PTR->NewStringUTF(ENV_PAR cg->fullpath);
01057
01058
01059 joid = ENV_PTR->NewLongArray(ENV_PAR 1);
01060 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR joid, 0);
01061 jptr[0] = (jlong)cg->objID[0];
01062 ENV_PTR->ReleaseLongArrayElements(ENV_PAR joid, jptr, 0);
01063
01064
01065 jg = ENV_PTR->NewObject(ENV_PAR cls_group, method_group_ctr, jfile, NULL, jpath, jgroup, joid);
01066 ENV_PTR->SetObjectField(ENV_PAR jg, field_hobject_filename, jfilename);
01067
01068
01069 ENV_PTR->CallVoidMethod(ENV_PAR jgroup, method_group_addToMemberList, jg);
01070
01071
01072 c2j_h5group(env, jfile, jg, cg, filename);
01073 }
01074 }
01075
01076 if (cgroup->datasets && cgroup->ndatasets>0) {
01077 for (i=0; i<cgroup->ndatasets; i++) {
01078 cd = &cgroup->datasets[i];
01079 if (NULL == cd) continue;
01080
01081 if (H5DATATYPE_COMPOUND == cd->type.tclass)
01082 set_field_method_IDs_compound();
01083 else
01084 set_field_method_IDs_scalar();
01085
01086
01087 jpath = ENV_PTR->NewStringUTF(ENV_PAR cd->fullpath);
01088
01089
01090 joid = ENV_PTR->NewLongArray(ENV_PAR 1);
01091 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR joid, 0);
01092 jptr[0] = (jlong)cd->objID[0];
01093 ENV_PTR->ReleaseLongArrayElements(ENV_PAR joid, jptr, 0);
01094
01095
01096 jd = ENV_PTR->NewObject(ENV_PAR cls_dataset, method_dataset_ctr, jfile, NULL, jpath, joid);
01097 ENV_PTR->SetObjectField(ENV_PAR jd, field_hobject_filename, jfilename);
01098
01099
01100 if (H5DATATYPE_COMPOUND == cd->type.tclass && cd->type.nmembers>0 && cd->type.mnames) {
01101 jobjectArray jmnames, jmtypes;
01102 jstring jname;
01103 jobject jmtype;
01104
01105
01106 ENV_PTR->CallVoidMethod(ENV_PAR jd, method_dataset_compound_setMemberCount, (jint)cd->type.nmembers);
01107
01108
01109 jmnames = (jobjectArray)ENV_PTR->GetObjectField(ENV_PAR jd, field_dataset_compound_memberNames);
01110 for (j=0; j<cd->type.nmembers; j++) {
01111 jname = ENV_PTR->NewStringUTF(ENV_PAR cd->type.mnames[j]);
01112 ENV_PTR->SetObjectArrayElement(ENV_PAR jmnames, j, jname);
01113 }
01114
01115
01116 jmtypes = (jobjectArray)ENV_PTR->GetObjectField(ENV_PAR jd, field_dataset_compound_memberTypes);
01117 for (j=0; j<cd->type.nmembers; j++) {
01118 int mtype = cd->type.mtypes[i];
01119 int mclass = (0XFFFFFFF & mtype)>>28;
01120 int msign = (0XFFFFFFF & mtype)>>24;
01121 int msize = (0XFFFFFF & mtype);
01122 jmtype = ENV_PTR->NewObject(ENV_PAR cls_datatype, method_datatype_ctr,
01123 mclass, msize, H5DATATYPE_ORDER_LE, msign);
01124 ENV_PTR->SetObjectArrayElement(ENV_PAR jmtypes, j, jmtype);
01125 }
01126 }
01127 else if (cd->attributes &&
01128 strcmp(PALETTE_VALUE, (cd->attributes)[0].name)==0 &&
01129 (cd->attributes)[0].value)
01130 {
01131 unsigned char *value;
01132 jbyte *jbptr;
01133 jbyteArray jbytes;
01134
01135
01136 value = (unsigned char *)(cd->attributes)[0].value;
01137 jbytes = ENV_PTR->NewByteArray(ENV_PAR 768);
01138 jbptr = ENV_PTR->GetByteArrayElements(ENV_PAR jbytes, 0);
01139 for (j=0; j<768; j++)
01140 {
01141 jbptr[j] = (jbyte)value[j];
01142 }
01143 ENV_PTR->ReleaseByteArrayElements(ENV_PAR jbytes, jbptr, 0);
01144 ENV_PTR->CallVoidMethod(ENV_PAR jd, method_dataset_scalar_setPalette, jbytes);
01145 }
01146
01147
01148 jdims = ENV_PTR->NewLongArray(ENV_PAR cd->space.rank);
01149 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR jdims, 0);
01150 for (j=0; j<cd->space.rank; j++) jptr[j] = (jlong)cd->space.dims[j];
01151 ENV_PTR->SetIntField(ENV_PAR jd, field_dataset_rank, (jint)cd->space.rank);
01152 ENV_PTR->SetObjectField(ENV_PAR jd, field_dataset_dims, jdims);
01153 ENV_PTR->ReleaseLongArrayElements(ENV_PAR jdims, jptr, 0);
01154
01155
01156 jdtype = ENV_PTR->NewObject(ENV_PAR cls_datatype, method_datatype_ctr,
01157 cd->type.tclass, cd->type.size, cd->type.order, cd->type.sign);
01158 ENV_PTR->SetObjectField(ENV_PAR jd, field_dataset_datatype, jdtype);
01159
01160
01161 if ((cd->time & H5D_IMAGE_FLAG)>0) {
01162 ENV_PTR->SetBooleanField(ENV_PAR jd, field_dataset_scalar_isImage, JNI_TRUE);
01163 ENV_PTR->SetBooleanField(ENV_PAR jd, field_dataset_scalar_isImageDisplay, JNI_TRUE);
01164 }
01165
01166 if ( (cd->time & H5D_IMAGE_TRUECOLOR_FLAG)>0 && cd->space.rank>2) {
01167 ENV_PTR->SetBooleanField(ENV_PAR jd, field_dataset_scalar_isTrueColor, JNI_TRUE);
01168 ENV_PTR->SetIntField(ENV_PAR jd, field_dataset_scalar_interlace, 0);
01169 }
01170
01171 if ((cd->time & H5D_IMAGE_INTERLACE_PIXEL_FLAG)>0 && cd->space.rank>2) {
01172 ENV_PTR->SetIntField(ENV_PAR jd, field_dataset_scalar_interlace, 0);
01173 ENV_PTR->SetBooleanField(ENV_PAR jd, field_dataset_scalar_isTrueColor, JNI_TRUE);
01174 }
01175 else if ((cd->time & H5D_IMAGE_INTERLACE_PLANE_FLAG)>0 && cd->space.rank>2) {
01176 ENV_PTR->SetIntField(ENV_PAR jd, field_dataset_scalar_interlace, 2);
01177 ENV_PTR->SetBooleanField(ENV_PAR jd, field_dataset_scalar_isTrueColor, JNI_TRUE);
01178 }
01179
01180
01181 ENV_PTR->CallVoidMethod(ENV_PAR jd, method_dataset_init);
01182
01183
01184 ENV_PTR->CallVoidMethod(ENV_PAR jgroup, method_group_addToMemberList, jd);
01185
01186 }
01187 }
01188
01189 done:
01190
01191 return ret_val;
01192 }
01193
01194
01195 jint c2j_h5dataset_read(JNIEnv *env, jobject jobj, H5Dataset *cobj)
01196 {
01197 jint ret_val = 0;
01198 jobject jdata;
01199
01200 assert(cobj);
01201
01202 jdata = c2j_data_value (env, cobj->value, cobj->space.npoints, cobj->type.tclass, cobj->type.size);
01203
01204 if (NULL == jdata)
01205 GOTO_JNI_ERROR();
01206
01207 ENV_PTR->CallVoidMethod(ENV_PAR jobj, method_dataset_setData, jdata);
01208
01209 done:
01210 return ret_val;
01211 }
01212
01213
01214 jint c2j_h5dataset_read_attribute(JNIEnv *env, jobject jobj, H5Dataset *cobj)
01215 {
01216 jint ret_val = 0;
01217 int i=0,j=0;
01218 jlongArray jdims;
01219 jlong *jptr;
01220 H5Attribute attr;
01221 jstring attr_name;
01222 jobject attr_value;
01223
01224 assert(cobj);
01225
01226 if (cobj->nattributes <=0 )
01227 goto done;
01228
01229 if (NULL == cobj->attributes)
01230 GOTO_JNI_ERROR();
01231
01232 for (i=0; i<cobj->nattributes; i++)
01233 {
01234 attr = cobj->attributes[i];
01235
01236 attr_name = ENV_PTR->NewStringUTF(ENV_PAR attr.name);
01237 attr_value = c2j_data_value (env, attr.value, attr.space.npoints, attr.type.tclass, attr.type.size);
01238
01239
01240 jdims = ENV_PTR->NewLongArray(ENV_PAR attr.space.rank);
01241 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR jdims, 0);
01242 for (j=0; j<attr.space.rank; j++) jptr[j] = (jlong)attr.space.dims[j];
01243 ENV_PTR->ReleaseLongArrayElements(ENV_PAR jdims, jptr, 0);
01244
01245
01246 ENV_PTR->CallVoidMethod(ENV_PAR jobj, method_dataset_addAttribute,
01247 attr_name, attr_value, jdims, attr.type.tclass, attr.type.size,
01248 attr.type.order, attr.type.sign);
01249 }
01250
01251
01252 done:
01253 return ret_val;
01254 }
01255
01256 jint c2j_h5group_read_attribute(JNIEnv *env, jobject jobj, H5Group *cobj)
01257 {
01258 jint ret_val = 0;
01259 int i=0,j=0;
01260 jlongArray jdims;
01261 jlong *jptr;
01262 H5Attribute attr;
01263 jstring attr_name;
01264 jobject attr_value;
01265
01266 assert(cobj);
01267
01268 if (cobj->nattributes <=0 )
01269 goto done;
01270
01271 if (NULL == cobj->attributes)
01272 GOTO_JNI_ERROR();
01273
01274 for (i=0; i<cobj->nattributes; i++)
01275 {
01276 attr = cobj->attributes[i];
01277
01278 attr_name = ENV_PTR->NewStringUTF(ENV_PAR attr.name);
01279 attr_value = c2j_data_value (env, attr.value, attr.space.npoints, attr.type.tclass, attr.type.size);
01280
01281
01282 jdims = ENV_PTR->NewLongArray(ENV_PAR attr.space.rank);
01283 jptr = ENV_PTR->GetLongArrayElements(ENV_PAR jdims, 0);
01284 for (j=0; j<attr.space.rank; j++) jptr[j] = (jlong)attr.space.dims[j];
01285 ENV_PTR->ReleaseLongArrayElements(ENV_PAR jdims, jptr, 0);
01286
01287
01288 ENV_PTR->CallVoidMethod(ENV_PAR jobj, method_group_addAttribute,
01289 attr_name, attr_value, jdims, attr.type.tclass, attr.type.size,
01290 attr.type.order, attr.type.sign);
01291 }
01292
01293
01294 done:
01295 return ret_val;
01296 }
01297
01298
01299 jobject c2j_data_value (JNIEnv *env, void *value, unsigned int npoints, int tclass, int tsize)
01300 {
01301 jobject jvalue = NULL;
01302 unsigned int i=0;
01303 jstring jstr;
01304 char **strs;
01305 jobjectArray jobj_a;
01306
01307 if (NULL == value)
01308 return NULL;
01309
01310 switch (tclass) {
01311 case H5DATATYPE_INTEGER:
01312 case H5DATATYPE_REFERENCE:
01313 if (1 == tsize) {
01314 jbyte *ca = (jbyte *)value;
01315 jbyteArray ja = ENV_PTR->NewByteArray(ENV_PAR npoints);
01316 jbyte *jptr = ENV_PTR->GetByteArrayElements(ENV_PAR ja, 0);
01317 for (i=0; i<npoints; i++) jptr[i] = ca[i];
01318 ENV_PTR->ReleaseByteArrayElements(ENV_PAR ja, jptr, 0);
01319 jvalue = ja;
01320 }
01321 else if (2 == tsize) {
01322 jshort *ca = (jshort *)value;
01323 jshortArray ja = ENV_PTR->NewShortArray(ENV_PAR npoints);
01324 jshort *jptr = ENV_PTR->GetShortArrayElements(ENV_PAR ja, 0);
01325 for (i=0; i<npoints; i++) jptr[i] = ca[i];
01326 ENV_PTR->ReleaseShortArrayElements(ENV_PAR ja, jptr, 0);
01327 jvalue = ja;
01328 }
01329 else if (4 == tsize) {
01330 jint *ca = (jint *)value;
01331 jintArray ja = ENV_PTR->NewIntArray(ENV_PAR npoints);
01332 jint *jptr = ENV_PTR->GetIntArrayElements(ENV_PAR ja, 0);
01333 for (i=0; i<npoints; i++)
01334 {
01335 jptr[i] = ca[i];
01336 }
01337 ENV_PTR->ReleaseIntArrayElements(ENV_PAR ja, jptr, 0);
01338 jvalue = ja;
01339 }
01340 else {
01341 jlong *ca = (jlong *)value;
01342 jlongArray ja = ENV_PTR->NewLongArray(ENV_PAR npoints);
01343 jlong *jptr = ENV_PTR->GetLongArrayElements(ENV_PAR ja, 0);
01344 for (i=0; i<npoints; i++) jptr[i] = ca[i];
01345 ENV_PTR->ReleaseLongArrayElements(ENV_PAR ja, jptr, 0);
01346 jvalue = ja;
01347 }
01348 break;
01349 case H5DATATYPE_FLOAT:
01350 if (4 == tsize) {
01351 jfloat *ca = (jfloat *)value;
01352 jfloatArray ja = ENV_PTR->NewFloatArray(ENV_PAR npoints);
01353 jfloat *jptr = ENV_PTR->GetFloatArrayElements(ENV_PAR ja, 0);
01354 for (i=0; i<npoints; i++) jptr[i] = ca[i];
01355 ENV_PTR->ReleaseFloatArrayElements(ENV_PAR ja, jptr, 0);
01356 jvalue = ja;
01357 }
01358 else {
01359 jdouble *ca = (jdouble *)value;
01360 jdoubleArray ja = ENV_PTR->NewDoubleArray(ENV_PAR npoints);
01361 jdouble *jptr = ENV_PTR->GetDoubleArrayElements(ENV_PAR ja, 0);
01362 for (i=0; i<npoints; i++) jptr[i] = ca[i];
01363 ENV_PTR->ReleaseDoubleArrayElements(ENV_PAR ja, jptr, 0);
01364 jvalue = ja;
01365 }
01366 break;
01367 case H5DATATYPE_STRING:
01368 case H5DATATYPE_VLEN:
01369 case H5DATATYPE_COMPOUND:
01370 strs = (char **)value;
01371 jobj_a = ENV_PTR->NewObjectArray(ENV_PAR npoints,
01372 ENV_PTR->FindClass(ENV_PAR "java/lang/String"), ENV_PTR->NewStringUTF(ENV_PAR ""));
01373 for (i=0; i<npoints; i++) {
01374 jstr = ENV_PTR->NewStringUTF(ENV_PAR strs[i]);
01375 ENV_PTR->SetObjectArrayElement(ENV_PAR jobj_a, i, jstr);
01376 };
01377 jvalue = jobj_a;
01378 break;
01379 default:
01380 jvalue = NULL;
01381 break;
01382 }
01383
01384 return jvalue;
01385
01386 }
01387
01388
01389
01390
01391
01392
01393
01394
01395 void print_file(H5File *file)
01396 {
01397 assert(file);
01398
01399 printf("\nFile name = %s\n", file->filename);
01400 printf("opID = %d\n", file->opID);
01401 }
01402
01403 void print_group(rcComm_t *conn, H5Group *pg)
01404 {
01405 int i=0;
01406 H5Group *g=0;
01407 H5Dataset *d=0;
01408
01409 assert(pg);
01410
01411 for (i=0; i<pg->ngroups; i++)
01412 {
01413 g = (H5Group *) &pg->groups[i];
01414 printf("%s\n", g->fullpath);
01415 print_group(conn, g);
01416 }
01417
01418 for (i=0; i<pg->ndatasets; i++)
01419 {
01420 d = (H5Dataset *) &pg->datasets[i];
01421 d->opID = H5DATASET_OP_READ;
01422 printf("%s\n", d->fullpath);
01423
01424 if (h5ObjRequest(conn, d, H5OBJECT_DATASET) < 0) {
01425 fprintf (stderr, "H5DATASET_OP_READ failed\n");
01426 goto done;
01427 }
01428
01429 print_dataset(d);
01430 }
01431
01432 done:
01433 return;
01434 }
01435
01436 void print_datatype(H5Datatype *type)
01437 {
01438 int i = 0;
01439
01440 assert(type);
01441
01442 printf("\ntype class = %d\n", type->tclass);
01443 printf( "type order = %d\n", type->order);
01444 printf( "type sign = %d\n", type->sign);
01445 printf( "type size = %d\n", type->size);
01446
01447 printf( "nmembers = %d\n", type->nmembers);
01448 if (type->nmembers > 0 && type->mnames != NULL)
01449 {
01450 for (i=0; i<type->nmembers; i++)
01451 printf("member[%d] = %s\n", i, type->mnames[i]);
01452 }
01453
01454 }
01455
01456 void print_dataspace(H5Dataspace *space)
01457 {
01458 int i = 0;
01459
01460 assert (space);
01461
01462 printf("\nspace rank = %d\n", space->rank);
01463 printf( "space npoints = %d\n", space->npoints);
01464
01465 if (space->rank > 0 && space->dims != NULL)
01466 {
01467 for (i=0; i<space->rank; i++) {
01468 printf("dims[%d] = %d\n", i, space->dims[i]);
01469 }
01470 }
01471
01472 if (space->rank > 0 && space->start != NULL)
01473 {
01474 for (i=0; i<space->rank; i++) {
01475 printf("start[%d] = %d\n", i, space->start[i]);
01476 }
01477 }
01478
01479
01480 if (space->rank > 0 && space->stride != NULL)
01481 {
01482 for (i=0; i<space->rank; i++) {
01483 printf("stride[%d] = %d\n", i, space->stride[i]);
01484 }
01485 }
01486
01487
01488 if (space->rank > 0 && space->count != NULL)
01489 {
01490 for (i=0; i<space->rank; i++) {
01491 printf("count[%d] = %d\n", i, space->count[i]);
01492 }
01493 }
01494 }
01495
01496 void print_dataset(H5Dataset *d)
01497 {
01498 assert(d);
01499
01500 printf("\nDataset fullpath = %s\n", d->fullpath);
01501 printf("fid = %d\n", d->fid);
01502 print_datatype(&(d->type));
01503 print_dataspace(&(d->space));
01504 print_dataset_value(d);
01505 }
01506
01507
01508 void print_dataset_value(H5Dataset *d)
01509 {
01510 int size=0, i=0;
01511 char* pv;
01512 char **strs;
01513
01514 assert(d);
01515
01516 printf("\nThe total size of the value buffer = %d", d->nvalue);
01517 printf("\nPrinting the first 10 values of %s\n", d->fullpath);
01518 if (d->value)
01519 {
01520 size = 1;
01521 pv = (char*)d->value;
01522 for (i=0; i<d->space.rank; i++) size *= d->space.count[i];
01523 if (size > 10 ) size = 10;
01524 if (d->type.tclass == H5DATATYPE_VLEN
01525 || d->type.tclass == H5DATATYPE_COMPOUND
01526 || d->type.tclass == H5DATATYPE_STRING)
01527 strs = (char **)d->value;
01528
01529 for (i=0; i<size; i++)
01530 {
01531 if (d->type.tclass == H5DATATYPE_INTEGER)
01532 {
01533 if (d->type.sign == H5DATATYPE_SGN_NONE)
01534 {
01535 if (d->type.size == 1)
01536 printf("%u\t", *((unsigned char*)(pv+i)));
01537 else if (d->type.size == 2)
01538 printf("%u\t", *((unsigned short*)(pv+i*2)));
01539 else if (d->type.size == 4)
01540 printf("%u\t", *((unsigned int*)(pv+i*4)));
01541 else if (d->type.size == 8)
01542 printf("%u\t", *((unsigned long*)(pv+i*8)));
01543 }
01544 else
01545 {
01546 if (d->type.size == 1)
01547 printf("%d\t", *((char*)(pv+i)));
01548 else if (d->type.size == 2)
01549 printf("%d\t", *((short*)(pv+i*2)));
01550 else if (d->type.size == 4)
01551 printf("%d\t", *((int*)(pv+i*4)));
01552 else if (d->type.size == 8)
01553 printf("%d\t", *((long*)(pv+i*8)));
01554 }
01555 } else if (d->type.tclass == H5DATATYPE_FLOAT)
01556 {
01557 if (d->type.size == 4)
01558 printf("%f\t", *((float *)(pv+i*4)));
01559 else if (d->type.size == 8)
01560 printf("%f\t", *((double *)(pv+i*8)));
01561 } else if (d->type.tclass == H5DATATYPE_VLEN
01562 || d->type.tclass == H5DATATYPE_COMPOUND)
01563 {
01564 if (strs[i])
01565 printf("%s\t", strs[i]);
01566 } else if (d->type.tclass == H5DATATYPE_STRING)
01567 {
01568 if (strs[i])
01569 printf("%s\t", strs[i]);
01570 }
01571 }
01572 printf("\n\n");
01573 }
01574
01575 return;
01576 }
01577
01578 void print_attribute(H5Attribute *a)
01579 {
01580 int size=0, i=0;
01581 char* pv;
01582 char **strs;
01583
01584 assert(a);
01585
01586 printf("\n\tThe total size of the attribute value buffer = %d\n", a->nvalue);
01587 printf("\n\tPrinting the first 10 values of %s\n", a->name);
01588 if (a->value)
01589 {
01590 size = 1;
01591 pv = (char*)a->value;
01592 for (i=0; i<a->space.rank; i++) size *= a->space.count[i];
01593 if (size > 10 ) size = 10;
01594 if (a->type.tclass == H5DATATYPE_VLEN
01595 || a->type.tclass == H5DATATYPE_COMPOUND
01596 || a->type.tclass == H5DATATYPE_STRING)
01597 strs = (char **)a->value;
01598
01599 for (i=0; i<size; i++)
01600 {
01601 if (a->type.tclass == H5DATATYPE_INTEGER)
01602 {
01603 if (a->type.sign == H5DATATYPE_SGN_NONE)
01604 {
01605 if (a->type.size == 1)
01606 printf("%u\t", *((unsigned char*)(pv+i)));
01607 else if (a->type.size == 2)
01608 printf("%u\t", *((unsigned short*)(pv+i*2)));
01609 else if (a->type.size == 4)
01610 printf("%u\t", *((unsigned int*)(pv+i*4)));
01611 else if (a->type.size == 8)
01612 printf("%u\t", *((unsigned long*)(pv+i*8)));
01613 }
01614 else
01615 {
01616 if (a->type.size == 1)
01617 printf("%d\t", *((char*)(pv+i)));
01618 else if (a->type.size == 2)
01619 printf("%d\t", *((short*)(pv+i*2)));
01620 else if (a->type.size == 4)
01621 printf("%d\t", *((int*)(pv+i*4)));
01622 else if (a->type.size == 8)
01623 printf("%d\t", *((long *)(pv+i*8)));
01624 }
01625 } else if (a->type.tclass == H5DATATYPE_FLOAT)
01626 {
01627 if (a->type.size == 4)
01628 printf("%f\t", *((float *)(pv+i*4)));
01629 else if (a->type.size == 8)
01630 printf("%f\t", *((double *)(pv+i*8)));
01631 } else if (a->type.tclass == H5DATATYPE_VLEN
01632 || a->type.tclass == H5DATATYPE_COMPOUND)
01633 {
01634 if (strs[i])
01635 printf("%s\t", strs[i]);
01636 } else if (a->type.tclass == H5DATATYPE_STRING)
01637 {
01638 if (strs[i]) printf("%s\t", strs[i]);
01639 }
01640 }
01641 printf("\n\n");
01642 }
01643 }
01644
01645
01646
01647 #ifdef __cplusplus
01648 }
01649 #endif
01650