/* * Class: hdf_hdf5lib_H5 * Method: H5G_obj_t H5Rget_obj_type * Signature: (JI[B)I */ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rget_1obj_1type(JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref) { int retVal =-1; jboolean isCopy; jbyte *refP; H5O_type_t object_info; if (ref == NULL) { h5nullArgument( env, "H5Rget_object_type: ref is NULL"); } /* end if */ else { refP = (jbyte*)ENVPTR->GetByteArrayElements(ENVPAR ref, &isCopy); if (refP == NULL) { h5JNIFatalError(env, "H5Rget_object_type: ref not pinned"); } /* end if */ else { retVal = H5Rget_obj_type2((hid_t)loc_id, (H5R_type_t)ref_type, refP, &object_info); if(retVal >= 0) retVal = object_info; ENVPTR->ReleaseByteArrayElements(ENVPAR ref, refP, JNI_ABORT); if (retVal < 0) h5libraryError(env); } /* end else */ } /* end else */ return (jint)retVal; } /* end Java_hdf_hdf5lib_H5_H5Rget_1obj_1type */
//-------------------------------------------------------------------------- // Function: H5Location::p_get_ref_obj_type (protected) // Purpose Retrieves the type of object that an object reference points to. // Parameters // ref - IN: Reference to query // ref_type - IN: Type of reference to query // Return An object type, which can be one of the following: // H5O_TYPE_UNKNOWN - Unknown object type (-1) // H5O_TYPE_GROUP - Object is a group // H5O_TYPE_DATASET - Object is a dataset // H5O_TYPE_NAMED_DATATYPE - Object is a named datatype // H5O_TYPE_NTYPES - Number of object types // Exception H5::ReferenceException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- H5O_type_t H5Location::p_get_ref_obj_type(void *ref, H5R_type_t ref_type) const { H5O_type_t obj_type = H5O_TYPE_UNKNOWN; herr_t ret_value = H5Rget_obj_type2(getId(), ref_type, ref, &obj_type); if (ret_value < 0) { throw ReferenceException(inMemFunc("getRefObjType"), "H5Rget_obj_type2 failed"); } if (obj_type == H5O_TYPE_UNKNOWN || obj_type >= H5O_TYPE_NTYPES) { throw ReferenceException(inMemFunc("getRefObjType"), "H5Rget_obj_type2 returned invalid type"); } return(obj_type); }
/* * Class: hdf_hdf5lib_H5 * Method: int H5Rget_obj_type2 * Signature: (JI[B[I)I */ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2(JNIEnv *env, jclass clss, jlong loc_id, jint ref_type, jbyteArray ref, jintArray ref_obj) { jint status; jboolean isCopy; jbyte *refP; jint *ref_objP; int retVal = -1; if (ref == NULL) { h5nullArgument( env, "H5Rget_object_type: ref is NULL"); } /* end if */ else if (ref_obj == NULL) { h5nullArgument( env, "H5Rget_object_type: ref_obj is NULL"); } /* end else if */ else { refP = (jbyte *)ENVPTR->GetByteArrayElements(ENVPAR ref, &isCopy); if (refP == NULL) { h5JNIFatalError(env, "H5Rget_object_type: ref not pinned"); } /* end if */ else { ref_objP = (jint *)ENVPTR->GetIntArrayElements(ENVPAR ref_obj, &isCopy); if (ref_objP == NULL) { ENVPTR->ReleaseByteArrayElements(ENVPAR ref,refP,0); h5JNIFatalError(env, "H5Rget_object_type: ref_obj not pinned"); } /* end if */ else { status = H5Rget_obj_type2((hid_t)loc_id, (H5R_type_t)ref_type, refP, (H5O_type_t*)ref_objP); retVal = ref_objP[0]; ENVPTR->ReleaseByteArrayElements(ENVPAR ref, refP, JNI_ABORT); if (status < 0) { ENVPTR->ReleaseIntArrayElements(ENVPAR ref_obj,ref_objP, JNI_ABORT); h5libraryError(env); } /* end if */ else { ENVPTR->ReleaseIntArrayElements(ENVPAR ref_obj, ref_objP, 0); } /* end else */ } /* end else */ } /* end else */ } /* end else */ return (jint)retVal; } /* end Java_hdf_hdf5lib_H5_H5Rget_1obj_1type2 */
int main(void) { hid_t fid; /* File, group, datasets, datatypes */ hid_t gid_a; /* and dataspaces identifiers */ hid_t did_b, sid_b, tid_b; hid_t did_r, tid_r, sid_r; H5O_type_t obj_type; herr_t status; hobj_ref_t *wbuf; /* buffer to write to disk */ hobj_ref_t *rbuf; /* buffer to read from disk */ hsize_t dim_r[1]; hsize_t dim_b[2]; /* * Create a file using default properties. */ fid = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create group "A" in the file. */ gid_a = H5Gcreate2(fid, "A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset "B" in the file. */ dim_b[0] = 2; dim_b[1] = 6; sid_b = H5Screate_simple(2, dim_b, NULL); did_b = H5Dcreate2(fid, "B", H5T_NATIVE_FLOAT, sid_b, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset "R" to store references to the objects "A" and "B". */ dim_r[0] = 2; sid_r = H5Screate_simple(1, dim_r, NULL); tid_r = H5Tcopy(H5T_STD_REF_OBJ); did_r = H5Dcreate2(fid, "R", tid_r, sid_r, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Allocate write and read buffers. */ wbuf = (hobj_ref_t *)malloc(sizeof(hobj_ref_t) * 2); rbuf = (hobj_ref_t *)malloc(sizeof(hobj_ref_t) * 2); /* * Create references to the group "A" and dataset "B" * and store them in the wbuf. */ H5Rcreate(&wbuf[0], fid, "A", H5R_OBJECT, (hid_t)-1); H5Rcreate(&wbuf[1], fid, "B", H5R_OBJECT, (hid_t)-1); /* * Write dataset R using default transfer properties. */ status = H5Dwrite(did_r, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); /* * Close all objects. */ H5Gclose(gid_a); H5Sclose(sid_b); H5Dclose(did_b); H5Tclose(tid_r); H5Sclose(sid_r); H5Dclose(did_r); H5Fclose(fid); /* * Reopen the file. */ fid = H5Fopen(H5FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); /* * Open and read dataset "R". */ did_r = H5Dopen2(fid, "R", H5P_DEFAULT); status = H5Dread(did_r, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); /* * Find the type of referenced objects. */ status = H5Rget_obj_type2(did_r, H5R_OBJECT, &rbuf[0], &obj_type); if(obj_type == H5O_TYPE_GROUP) printf("First dereferenced object is a group. \n"); status = H5Rget_obj_type2(did_r, H5R_OBJECT, &rbuf[1], &obj_type); if(obj_type == H5O_TYPE_DATASET) printf("Second dereferenced object is a dataset. \n"); /* * Get datatype of the dataset "B" */ did_b = H5Rdereference2(did_r, H5P_DEFAULT, H5R_OBJECT, &rbuf[1]); tid_b = H5Dget_type(did_b); if(H5Tequal(tid_b, H5T_NATIVE_FLOAT)) printf("Datatype of the dataset is H5T_NATIVE_FLOAT.\n"); printf("\n"); /* * Close all objects and free memory buffers. */ H5Dclose(did_r); H5Dclose(did_b); H5Tclose(tid_b); H5Fclose(fid); free(rbuf); free(wbuf); return 0; }