JNIEXPORT jint JNICALL Java_hdf_hdflib_HDFLibrary_Vinsert (JNIEnv *env, jclass clss, jlong vgroup_id, jint v_id) { int32 rval; rval = Vinsert((int32) vgroup_id, (int32) v_id); if (rval == FAIL) CALL_ERROR_CHECK(); return (jint)rval; }
static int do_groups(void) { int32 vg0_id, /* vgroup identifier */ vg1_id, /* vgroup identifier */ vg2_id, /* vgroup identifier */ file1_id; /* HDF file identifier */ /* create a HDF file */ if ((file1_id = Hopen (FILE7_NAME, DFACC_CREATE, (int16)0))<0) { printf("Error: Could not create file <%s>\n",FILE7_NAME); return FAIL; } /* initialize the V interface */ if (Vstart (file1_id)==FAIL) { printf( "Could not start VG\n"); return FAIL; } /* create a vgroup */ vg0_id = Vattach (file1_id, -1, "w"); if (Vsetname (vg0_id, "g0")==FAIL) { printf( "Could not name group\n"); goto out; } /* create the second vgroup */ vg1_id = Vattach (file1_id, -1, "w"); if (Vsetname (vg1_id, "g1")==FAIL) { printf( "Could not name group\n"); goto out; } /* create the third vgroup */ vg2_id = Vattach (file1_id, -1, "w"); if (Vsetname (vg2_id, "g1.1")==FAIL) { printf( "Could not name group\n"); goto out; } if (Vinsert (vg0_id, vg1_id)==FAIL) { printf( "Could not insert VG\n"); goto out; } if (Vinsert (vg0_id, vg2_id)==FAIL) { printf( "Could not insert VG\n"); goto out; } if (Vinsert (vg1_id, vg2_id)==FAIL) { printf( "Could not insert VG\n"); goto out; } if (Vinsert (vg2_id, vg1_id)==FAIL) { printf( "Could not insert VG\n"); goto out; } /* terminate access to the vgroup */ if (Vdetach (vg0_id)==FAIL) { printf( "Could not close group\n"); goto out; } /* terminate access to the vgroup */ if (Vdetach (vg1_id)==FAIL) { printf( "Could not close group\n"); goto out; } /* terminate access to the vgroup */ if (Vdetach (vg2_id)==FAIL) { printf( "Could not close group\n"); goto out; } /* terminate access to the V interface */ if (Vend (file1_id)==FAIL) { printf( "Could not end VG\n"); goto out; } /* close the HDF file */ if (Hclose (file1_id)==FAIL) { printf( "Could not close file\n"); return FAIL; } return SUCCEED; out: printf("Error...Exiting...\n"); return FAIL; }
int vgroup_insert(int32 infile_id, int32 outfile_id, int32 sd_id, /* SD interface identifier */ int32 sd_out, /* SD interface identifier */ int32 gr_id, /* GR interface identifier */ int32 gr_out, /* GR interface identifier */ int32 vgroup_id_out_par, /* output parent group ID */ char*path_name, /* absolute path for input group name */ int32* in_tags, /* tag list for parent group */ int32* in_refs, /* ref list for parent group */ int npairs, /* number tag/ref pairs for parent group */ list_table_t *list_tbl, dim_table_t *td1, dim_table_t *td2, options_t *options) { int32 vg_id; /* vgroup identifier for opened group in input */ int32 ntagrefs; /* number of tag/ref pairs in a vgroup */ int32 *tags=NULL; /* buffer to hold the tag numbers of vgroups */ int32 *refs=NULL; /* buffer to hold the ref numbers of vgroups */ int32 vgroup_id_out =-1; /* vgroup identifier for the created group in output */ char *vg_name; char *vg_class; char *path=NULL; uint16 name_len; int visited; int32 tag; int32 ref; int i; for ( i = 0; i < npairs; i++ ) { tag = in_tags[i]; ref = in_refs[i]; switch(tag) { /*------------------------------------------------------------------------- * DFTAG_VG *------------------------------------------------------------------------- */ case DFTAG_VG: visited = list_table_search(list_tbl,DFTAG_VG,ref); /*------------------------------------------------------------------------- * open input *------------------------------------------------------------------------- */ vg_id = Vattach (infile_id, ref, "r"); /* Get vgroup's name */ if (Vgetnamelen(vg_id, &name_len)==FAIL) { printf("Error: Could not get name length for group with ref <%d>\n", ref); goto out; } vg_name = (char *) HDmalloc(sizeof(char) * (name_len+1)); if (Vgetname (vg_id, vg_name)==FAIL) { printf( "Could not get name for group\n"); goto out; } /* Get vgroup's class name */ if (Vgetclassnamelen(vg_id, &name_len)==FAIL) { printf("Error: Could not get name length for group with ref <%d>\n", ref); goto out; } vg_class = (char *) HDmalloc(sizeof(char) * (name_len+1)); if (Vgetclass (vg_id, vg_class)==FAIL) { printf( "Could not get class for group\n"); goto out; } /* ignore reserved HDF groups/vdatas */ if( is_reserved(vg_class)) { if (Vdetach (vg_id)==FAIL) { printf( "Could not detach group\n"); goto out; } continue; } if(strcmp(vg_name,GR_NAME)==0) { if (Vdetach (vg_id)==FAIL) { printf( "Could not detach group\n"); goto out; } continue; } /*------------------------------------------------------------------------- * create the group in output or create the link *------------------------------------------------------------------------- */ if (options->trip==1) { if ( visited < 0 ) { /* * create the group in the output file. the vgroup reference number * is set to -1 for creating and the access mode is "w" for writing */ vgroup_id_out = Vattach (outfile_id, -1, "w"); if (Vsetname (vgroup_id_out, vg_name)==FAIL) { printf("Error: Could not create group <%s>\n", vg_name); goto out; } if (Vsetclass (vgroup_id_out, vg_class)==FAIL) { printf("Error: Could not create group <%s>\n", vg_name); goto out; } if (copy_vgroup_attrs(vg_id,vgroup_id_out,path,options)<0) goto out; if (copy_vg_an(infile_id,outfile_id,vg_id,vgroup_id_out,path,options)<0) goto out; } else { /* open previously visited group */ vgroup_id_out = Vattach (outfile_id, ref, "r"); } /* insert the created (or opened) vgroup into its parent */ if (Vinsert (vgroup_id_out_par, vgroup_id_out)==FAIL) { printf("Could not insert group <%s>\n", vg_name); goto out; } } /* create the group in output or create the link */ /*------------------------------------------------------------------------- * if group not visited, add to table and check for more tag/ref pairs *------------------------------------------------------------------------- */ /* check if already visited */ if ( visited < 0 ) { /* initialize path */ path=get_path(path_name,vg_name); /* add object to table */ list_table_add(list_tbl,tag,ref,path); if (options->verbose) printf(PFORMAT,"","","",path); if ( options->trip==0 ) { /*we must go to other groups always */ } /* insert objects for this group */ ntagrefs = Vntagrefs(vg_id); if ( ntagrefs > 0 ) { tags = (int32 *) malloc(sizeof(int32) * ntagrefs); refs = (int32 *) malloc(sizeof(int32) * ntagrefs); if (Vgettagrefs(vg_id, tags, refs, ntagrefs)<0) goto out; /* recurse */ if (vgroup_insert( infile_id, outfile_id, sd_id, sd_out, gr_id, gr_out, vgroup_id_out, path, tags, refs, ntagrefs, list_tbl, td1, td2, options)<0) { goto out; } free (tags); tags=NULL; free (refs); refs=NULL; } /* ntagrefs > 0 */ if (path) free(path); } /* check if already visited */ if(Vdetach (vg_id)==FAIL) { printf("Error: Could not detach group <%s>\n", vg_name); goto out; } if (options->trip==1) { if (Vdetach (vgroup_id_out)==FAIL) { printf("Error: Could not detach group <%s>\n", vg_name); goto out; } } break; /*------------------------------------------------------------------------- * SDS *------------------------------------------------------------------------- */ case DFTAG_SD: /* Scientific Data */ case DFTAG_SDG: /* Scientific Data Group */ case DFTAG_NDG: /* Numeric Data Group */ /* copy dataset */ if (copy_sds(sd_id, sd_out, tag,ref, vgroup_id_out_par, path_name, options, list_tbl, td1, td2, infile_id, outfile_id)<0) return FAIL; break; /*------------------------------------------------------------------------- * Image *------------------------------------------------------------------------- */ case DFTAG_RI: /* Raster Image */ case DFTAG_CI: /* Compressed Image */ case DFTAG_RIG: /* Raster Image Group */ case DFTAG_RI8: /* Raster-8 image */ case DFTAG_CI8: /* RLE compressed 8-bit image */ case DFTAG_II8: /* IMCOMP compressed 8-bit image */ /* copy GR */ if (copy_gr(infile_id, outfile_id, gr_id, gr_out, tag, ref, vgroup_id_out_par, path_name, options, list_tbl)<0) return FAIL; break; /*------------------------------------------------------------------------- * Vdata *------------------------------------------------------------------------- */ case DFTAG_VH: /* Vdata Header */ if (copy_vs(infile_id, outfile_id, tag, ref, vgroup_id_out_par, path_name, options, list_tbl, 0)<0) return FAIL; break; } /* switch */ } /* i */ return SUCCEED; out: if (tags!=NULL) free (tags); if (refs!=NULL) free (refs); return FAIL; }