/* * Class: hdf_hdf5lib_H5 * Method: H5Lvisit_by_name * Signature: (JLjava/lang/String;IILjava/lang/Object;Ljava/lang/Object;J)I */ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name (JNIEnv *env, jclass clss, jlong grp_id, jstring name, jint idx_type, jint order, jobject callback_op, jobject op_data, jlong access_id) { herr_t status = -1; const char *lName; cb_wrapper wrapper = {callback_op, op_data}; ENVPTR->GetJavaVM(ENVPAR &jvm); if ((op_data == NULL) || (callback_op == NULL)) { h5nullArgument(env, "H5Lvisit_by_name: op_data or callback_op is NULL"); } /* end if */ else { PIN_JAVA_STRING(name, lName); if (lName != NULL) { status = H5Lvisit_by_name((hid_t)grp_id, lName, (H5_index_t)idx_type, (H5_iter_order_t)order, (H5L_iterate_t)H5L_iterate_cb, (void*)&wrapper, (hid_t)access_id); UNPIN_JAVA_STRING(name, lName); if (status < 0) h5libraryError(env); } } /* end else */ return status; } /* end Java_hdf_hdf5lib_H5_H5Lvisit_1by_1name */
/*------------------------------------------------------------------------- * Function: traverse * * Purpose: Iterate over all the objects/links in a file. Conforms to the * "visitor" pattern. * * Return: 0 on success, -1 on failure * * Programmer: Quincey Koziol, [email protected] * * Date: September 1, 2007 * *------------------------------------------------------------------------- */ static int traverse(hid_t file_id, const char *grp_name, hbool_t visit_start, hbool_t recurse, const trav_visitor_t *visitor) { H5O_info_t oinfo; /* Object info for starting group */ /* Get info for starting object */ if(H5Oget_info_by_name(file_id, grp_name, &oinfo, H5P_DEFAULT) < 0) return -1; /* Visit the starting object */ if(visit_start && visitor->visit_obj) (*visitor->visit_obj)(grp_name, &oinfo, NULL, visitor->udata); /* Go visiting, if the object is a group */ if(oinfo.type == H5O_TYPE_GROUP) { trav_addr_t seen; /* List of addresses seen */ trav_ud_traverse_t udata; /* User data for iteration callback */ /* Init addresses seen */ seen.nused = seen.nalloc = 0; seen.objs = NULL; /* Check for multiple links to top group */ if(oinfo.rc > 1) trav_addr_add(&seen, oinfo.addr, grp_name); /* Set up user data structure */ udata.seen = &seen; udata.visitor = visitor; udata.is_absolute = (*grp_name == '/'); udata.base_grp_name = grp_name; /* Check for iteration of links vs. visiting all links recursively */ if(recurse) { /* Visit all links in group, recursively */ if(H5Lvisit_by_name(file_id, grp_name, trav_index_by, trav_index_order, traverse_cb, &udata, H5P_DEFAULT) < 0) return -1; } /* end if */ else { /* Iterate over links in group */ if(H5Literate_by_name(file_id, grp_name, trav_index_by, trav_index_order, NULL, traverse_cb, &udata, H5P_DEFAULT) < 0) return -1; } /* end else */ /* Free visited addresses table */ if(seen.objs) { size_t u; /* Local index variable */ /* Free paths to objects */ for(u = 0; u < seen.nused; u++) HDfree(seen.objs[u].path); HDfree(seen.objs); } /* end if */ } /* end if */ return 0; }