/* This is a callback function for H5Literate(). The parameters of this callback function have the following values or meanings: g_id Group that serves as root of the iteration; same value as the H5Lvisit group_id parameter name Name of link, relative to g_id, being examined at current step of the iteration info H5L_info_t struct containing information regarding that link op_data User-defined pointer to data required by the application in processing the link; a pass-through of the op_data pointer provided with the H5Lvisit function call */ herr_t op_func (hid_t g_id, const char *name, const H5L_info_t *info, void *op_data) { hid_t id; H5I_type_t obj_type; strcpy((char *)op_data, name); if ((id = H5Oopen_by_addr(g_id, info->u.address)) < 0) ERR; /* Using H5Ovisit is really slow. Use H5Iget_type for a fast * answer. */ /* if (H5Ovisit(id, H5_INDEX_CRT_ORDER, H5_ITER_INC, obj_iter, */ /* (void *)&obj_class) != 1) ERR; */ if ((obj_type = H5Iget_type(id)) < 0) ERR; if (H5Oclose(id) < 0) ERR; /* Turn this on to learn what type of object you've opened. */ /* switch (obj_type) */ /* { */ /* case H5I_GROUP: */ /* printf("group %s\n", name); */ /* break; */ /* case H5I_DATATYPE: */ /* printf("type %s\n", name); */ /* break; */ /* case H5I_DATASET: */ /* printf("data %s\n", name); */ /* break; */ /* default: */ /* printf("unknown class\n"); */ /* } */ return 1; }
static herr_t visit_link(hid_t g_id, const char *name, const H5L_info_t *info, void *op_data) { /* A positive return value causes the visit iterator to immediately * return that positive value, indicating short-circuit * success. The iterator can be restarted at the next group * member. */ int ret = 1; hid_t id; strncpy(((struct nc_hdf5_link_info *)op_data)->name, name, NC_MAX_NAME); /* Open this critter. */ if ((id = H5Oopen_by_addr(g_id, info->u.address)) < 0) return NC_EHDFERR; /* Is this critter a group, type, data, attribute, or what? */ if ((((struct nc_hdf5_link_info *)op_data)->obj_type = H5Iget_type(id)) < 0) ret = NC_EHDFERR; /* Close the critter to release resouces. */ if (H5Oclose(id) < 0) return NC_EHDFERR; return ret; }
herr_t H5Group::getLsInfo(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data) { H5O_info_t oinfo; herr_t err; hid_t obj; OpDataGetLs & opdata = *(OpDataGetLs *)op_data; switch (info->type) { case H5L_TYPE_SOFT: opdata.name->push_back(name); opdata.type->push_back("soft"); break; case H5L_TYPE_EXTERNAL: opdata.name->push_back(name); opdata.type->push_back("external"); break; case H5L_TYPE_HARD: obj = H5Oopen_by_addr(g_id, info->u.address); if (obj < 0) { return (herr_t) - 1; } err = H5Oget_info(obj, &oinfo); H5Oclose(obj); if (err < 0) { return (herr_t) - 1; } switch (oinfo.type) { case H5O_TYPE_GROUP: opdata.name->push_back(name); opdata.type->push_back("group"); break; case H5O_TYPE_DATASET: opdata.name->push_back(name); opdata.type->push_back("dataset"); break; case H5O_TYPE_NAMED_DATATYPE: opdata.name->push_back(name); opdata.type->push_back("type"); break; default: return (herr_t) - 1; } break; default: return (herr_t) - 1; } return (herr_t)0; }
/* * Class: hdf_hdf5lib_H5 * Method: _H5Oopen_by_addr * Signature: (JJ)J; */ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr (JNIEnv *env, jclass clss, jlong loc_id, jlong addr) { hid_t retVal = -1; retVal = H5Oopen_by_addr((hid_t)loc_id, (haddr_t)addr ); if (retVal < 0) h5libraryError(env); return (jlong)retVal; } /* end Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr */
/* * Class: hdf_hdf5lib_H5 * Method: _H5Oopen_by_addr * Signature: (JJ)J; */ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr (JNIEnv *env, jclass clss, jlong loc_id, jlong addr) { hid_t retVal = H5I_INVALID_HID; UNUSED(clss); if ((retVal = H5Oopen_by_addr((hid_t)loc_id, (haddr_t)addr)) < 0) H5_LIBRARY_ERROR(ENVONLY); done: return (jlong)retVal; } /* end Java_hdf_hdf5lib_H5__1H5Oopen_1by_1addr */
/****if* H5Of/h5oopen_by_addr_c * NAME * h5oopen_by_addr_c * PURPOSE * Calls H5open_by_addr * INPUTS * loc_id - File or group identifier * addr - Object’s address in the file * * OUTPUTS * obj_id - Dataset identifier * * RETURNS * 0 on success, -1 on failure * AUTHOR * M. Scot Breitenfeld * September 14, 2009 * SOURCE */ int_f nh5oopen_by_addr_c (hid_t_f *loc_id, haddr_t_f *addr, hid_t_f *obj_id) /******/ { int_f ret_value = 0; /* Return value */ /* * Call H5Oopen_by_address function. */ if((*obj_id = (hid_t_f)H5Oopen_by_addr((hid_t)*loc_id, (haddr_t)*addr)) < 0) HGOTO_DONE(FAIL); done: return ret_value; }
/* UD_hard_traverse * The actual traversal function simply needs to open the correct object and * return its ID. */ static hid_t UD_hard_traverse(const char *link_name, hid_t cur_group, const void *udata, size_t udata_size, hid_t lapl_id) { haddr_t addr; hid_t ret_value = -1; /* Sanity check; we have already verified the udata's size in the creation * callback. */ if(udata_size != sizeof(haddr_t)) return -1; addr = *((const haddr_t *) udata); /* Open the object by address. If H5Oopen_by_addr fails, ret_value will * be negative to indicate that the traversal function failed. */ ret_value = H5Oopen_by_addr(cur_group, addr); return ret_value; }
/* UD_hard_delete * Since the creation function increments the object's reference count, it's * important to decrement it again when the link is deleted. */ static herr_t UD_hard_delete(const char *link_name, hid_t loc_group, const void *udata, size_t udata_size) { haddr_t addr; hid_t target_obj = -1; herr_t ret_value = 0; /* Sanity check; we have already verified the udata's size in the creation * callback. */ if(udata_size != sizeof(haddr_t)) { ret_value = -1; goto done; } addr = *((const haddr_t *) udata); /* Open the object this link points to */ target_obj= H5Oopen_by_addr(loc_group, addr); if(target_obj < 0) { ret_value = -1; goto done; } /* Decrement the reference count of the target object */ if(H5Odecr_refcount(target_obj) < 0) { ret_value = -1; goto done; } done: /* Close the target object if we opened it */ if(target_obj >= 0) H5Oclose(target_obj); return ret_value; }
/* UD_hard_create * The most important thing this callback does is to increment the reference * count on the target object. Without this step, the object could be * deleted while this link still pointed to it, resulting in possible data * corruption! * The create callback also checks the arguments used to create this link. * If this function returns a negative value, the call to H5Lcreate_ud() * will also return failure and the link will not be created. */ static herr_t UD_hard_create(const char *link_name, hid_t loc_group, const void *udata, size_t udata_size, hid_t lcpl_id) { haddr_t addr; hid_t target_obj = -1; herr_t ret_value = 0; /* Make sure that the address passed in looks valid */ if(udata_size != sizeof(haddr_t)) { ret_value = -1; goto done; } addr = *((const haddr_t *) udata); /* Open the object this link points to so that we can increment * its reference count. This also ensures that the address passed * in points to a real object (although this check is not perfect!) */ target_obj= H5Oopen_by_addr(loc_group, addr); if(target_obj < 0) { ret_value = -1; goto done; } /* Increment the reference count of the target object */ if(H5Oincr_refcount(target_obj) < 0) { ret_value = -1; goto done; } done: /* Close the target object if we opened it */ if(target_obj >= 0) H5Oclose(target_obj); return ret_value; }