Changeset 1729


Ignore:
Timestamp:
02/11/11 14:49:48 (7 months ago)
Author:
Tobias Richter
Message:

implement more hdf1.8 features to make external links visible

refs #290 #287

still some issues with actually having external links,
but everything else still works, so this is a good state
to commit anyway

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/configure.ac

    r1684 r1729  
    574574                EXTRA_LDPATH="$EXTRA_LDPATH $HDF5_LDFLAGS" 
    575575                HDF5_LDFLAGS="$HDF5_LDFLAGS -lhdf5 -lz" 
    576                 HDF5_CPPFLAGS="-I$H5ROOT/include -DHDF5 -DH5Acreate_vers=2 -DH5Aiterate_vers=2 -DH5Dcreate_vers=2 -DH5Dopen_vers=2 -DH5Eclear_vers=2 -DH5Eprint_vers=2 -DH5Epush_vers=2 -DH5Eset_auto_vers=2 -DH5Eget_auto_vers=2 -DH5Ewalk_vers=2 -DH5Gcreate_vers=2 -DH5Gopen_vers=2 -DH5Pget_filter_vers=2 -DH5Pget_filter_by_id_vers=2 -DH5Pinsert_vers=2 -DH5Pregister_vers=2 -DH5Rget_obj_type_vers=2 -DH5Tarray_create_vers=2 -DH5Tcommit_vers=2 -DH5Tget_array_dims_vers=2 -DH5Topen_vers=2" 
     576                HDF5_CPPFLAGS="-I$H5ROOT/include -DHDF5 -DH5_NO_DEPRECATED_SYMBOLS -DH5Acreate_vers=2 -DH5Aiterate_vers=2 -DH5Dcreate_vers=2 -DH5Dopen_vers=2 -DH5Eclear_vers=2 -DH5Eprint_vers=2 -DH5Epush_vers=2 -DH5Eset_auto_vers=2 -DH5Eget_auto_vers=2 -DH5Ewalk_vers=2 -DH5Gcreate_vers=2 -DH5Gopen_vers=2 -DH5Pget_filter_vers=2 -DH5Pget_filter_by_id_vers=2 -DH5Pinsert_vers=2 -DH5Pregister_vers=2 -DH5Rget_obj_type_vers=2 -DH5Tarray_create_vers=2 -DH5Tcommit_vers=2 -DH5Tget_array_dims_vers=2 -DH5Topen_vers=2" 
    577577                # HDF5_CPPFLAGS="-I$H5ROOT/include -DHDF5 -DH5_NO_DEPRECATED_SYMBOLS -DH5Acreate_vers=2 -DH5Aiterate_vers=2 -DH5Dcreate_vers=2 -DH5Dopen_vers=2 -DH5Eclear_vers=2 -DH5Eprint_vers=2 -DH5Epush_vers=2 -DH5Eset_auto_vers=2 -DH5Eget_auto_vers=2 -DH5Ewalk_vers=2 -DH5Gcreate_vers=2 -DH5Gopen_vers=2 -DH5Pget_filter_vers=2 -DH5Pget_filter_by_id_vers=2 -DH5Pinsert_vers=2 -DH5Pregister_vers=2 -DH5Rget_obj_type_vers=2 -DH5Tarray_create_vers=2 -DH5Tcommit_vers=2 -DH5Tget_array_dims_vers=2 -DH5Topen_vers=2" 
    578578                ;; 
  • trunk/include/napi5.h

    r1677 r1729  
    4646void NX5assignFunctions(pNexusFunction fHandle); 
    4747 
    48 herr_t nxgroup_info(hid_t loc_id, const char *name, void *op_data); 
    4948herr_t attr_info(hid_t loc_id, const char *name, const H5A_info_t *unused, void *opdata); 
    50 herr_t group_info(hid_t loc_id, const char *name, void *opdata); 
     49herr_t group_info(hid_t loc_id, const char *name, const H5L_info_t *unused, void *opdata); 
     50herr_t nxgroup_info(hid_t loc_id, const char *name, const H5L_info_t *unused, void *op_data); 
    5151 
    5252#endif /* NAPI5_H */ 
  • trunk/src/napi.c

    r1728 r1729  
    685685        return status; 
    686686      } 
    687       status = NXopenpath(fid,expath); 
     687      status = NXopenpath(fid, expath); 
    688688      NXgetgroupID(fid,&breakID); 
    689689      setCloseID(fileStack,breakID); 
     
    15701570    necessary. This can happen with paths like ../ 
    15711571  */ 
    1572   if(strlen(name) < 1) 
    1573   { 
     1572  if (strlen(name) < 1) { 
    15741573      return NX_OK; 
    15751574  } 
    15761575   
    15771576  NXinitgroupdir(hfil); 
    1578   while(NXgetnextentry(hfil,name2,xclass,&datatype) != NX_EOD) 
    1579   { 
    1580      
     1577 
     1578  while(NXgetnextentry(hfil, name2, xclass, &datatype) != NX_EOD) 
     1579  { 
    15811580    if(strcmp(name2,name) == 0) 
    15821581    { 
     
    15841583      { 
    15851584        return NXopendata(hfil,name); 
    1586       }  
    1587       else 
    1588       { 
     1585      } else { 
    15891586        return NXopengroup(hfil,name,xclass); 
    15901587      } 
     
    16171614    if(strcmp(name2,name) == 0) 
    16181615    { 
    1619       if(strcmp(xclass,"SDS") == 0) 
    1620       { 
     1616      if(strcmp(xclass,"SDS") == 0) { 
    16211617        return NX_EOD; 
    16221618      }  
  • trunk/src/napi5.c

    r1728 r1729  
    403403  } 
    404404  /*------------------------------------------------------------------------*/ 
    405   NXstatus  NX5opengroup (NXhandle fid, CONSTCHAR *name, CONSTCHAR *nxclass) 
     405  NXstatus  NX5opengroup(NXhandle fid, CONSTCHAR *name, CONSTCHAR *nxclass) 
    406406  { 
    407407 
     
    413413           
    414414    pFile = NXI5assert (fid); 
    415     if (pFile->iCurrentG == 0) 
    416     { 
     415    if (pFile->iCurrentG == 0) { 
    417416      strcpy(pBuffer,name); 
    418     }  
    419     else  
    420     { 
     417    } else { 
    421418       sprintf(pBuffer,"%s/%s",pFile->name_tmp,name); 
    422419    } 
    423     iRet = H5Gopen(pFile->iFID,(const char *)pBuffer, H5P_DEFAULT); 
     420    iRet = H5Gopen(pFile->iFID, (const char *)pBuffer, H5P_DEFAULT); 
    424421    if (iRet < 0) { 
    425422      sprintf (pBuffer, "ERROR: group %s does not exist", pFile->name_tmp); 
     
    446443        } 
    447444        /* check contents of group attribute */ 
    448         attr1 = H5Aopen_name(pFile->iCurrentG, "NX_class"); 
     445        attr1 = H5Aopen_by_name(pFile->iCurrentG, ".", "NX_class", H5P_DEFAULT, H5P_DEFAULT); 
    449446        if (attr1 < 0) 
    450447        { 
     
    952949      H5Tset_size(aid1,datalen);  
    953950    }          
    954     iRet = H5Aopen_name(vid, name); 
     951    iRet = H5Aopen_by_name(vid, ".", name, H5P_DEFAULT, H5P_DEFAULT); 
    955952    if (iRet>0) { 
    956953      H5Aclose(iRet); 
     
    11441141      return NX_ERROR; 
    11451142    } 
    1146     status = H5Aopen_name(dataID,name); 
     1143    status = H5Aopen_by_name(dataID,".", name, H5P_DEFAULT, H5P_DEFAULT); 
    11471144    if(status > 0) 
    11481145    { 
     
    11791176    char        linkTarget[1024]; 
    11801177    int         type = NX_CHAR; 
     1178    hid_t       targetid; 
    11811179 
    11821180    pFile = NXI5assert (fid); 
     
    12021200    }  
    12031201 
    1204     H5Glink(pFile->iFID, H5G_LINK_HARD, sLink->targetPath, linkTarget); 
     1202    //targetid = H5Oopen(pFile->iFID, sLink->targetPath, H5P_DEFAULT); 
     1203    H5Lcreate_hard(pFile->iFID, sLink->targetPath, H5L_SAME_LOC, linkTarget, H5P_DEFAULT, H5P_DEFAULT); 
     1204    //H5Oclose(targetid); 
    12051205 
    12061206    return NX5settargetattribute(pFile,sLink); 
     
    12141214    int         type = NX_CHAR; 
    12151215    char        *itemName = NULL; 
     1216    hid_t       targetid; 
    12161217 
    12171218    pFile = NXI5assert (fid); 
     
    12471248    }  
    12481249 
    1249     H5Glink(pFile->iFID, H5G_LINK_HARD, sLink->targetPath, linkTarget); 
     1250    //targetid = H5Oopen(pFile->iFID, sLink->targetPath, H5P_DEFAULT); 
     1251    H5Lcreate_hard(pFile->iFID, sLink->targetPath, H5L_SAME_LOC, linkTarget, H5P_DEFAULT, H5P_DEFAULT); 
     1252    //H5Oclose(targetid); 
    12501253 
    12511254    return NX5settargetattribute(pFile,sLink); 
     
    12831286  /* Operator function. */ 
    12841287            
    1285   herr_t nxgroup_info(hid_t loc_id, const char *name, void *op_data) 
    1286   { 
    1287     H5G_stat_t statbuf; 
    1288     pinfo self; 
    1289      
    1290     self = (pinfo)op_data; 
    1291     H5Gget_objinfo(loc_id, name, 0, &statbuf); 
    1292     switch (statbuf.type)  
    1293     { 
    1294       case H5G_GROUP:  
     1288  herr_t nxgroup_info(hid_t loc_id, const char *name, const H5L_info_t *statbuf, void *op_data) 
     1289  { 
     1290    pinfo self = (pinfo) op_data; 
     1291    H5O_info_t object_info; 
     1292    H5Oget_info_by_name(loc_id, name, &object_info, H5P_DEFAULT); 
     1293    switch ((object_info).type) { 
     1294      case H5O_TYPE_GROUP:  
    12951295         self->iname = strdup(name); 
    1296          self->type = H5G_GROUP; 
     1296         self->type = H5O_TYPE_GROUP; 
    12971297         break; 
    1298       case H5G_DATASET:  
     1298      case H5O_TYPE_DATASET:  
    12991299         self->iname = strdup(name); 
    1300          self->type = H5G_DATASET; 
     1300         self->type = H5O_TYPE_DATASET; 
    13011301         break; 
    13021302      default: 
     1303         // TODO defaults to group. not what we would want? 
    13031304         self->type=0; 
    13041305         break;      
     
    13101311  /* Operator function. */ 
    13111312 
    1312   herr_t group_info1(hid_t loc_id, const char *name, void *opdata) 
    1313   { 
    1314     H5G_stat_t statbuf; 
     1313  herr_t group_info1(hid_t loc_id, const char *name, const H5L_info_t *statbuf, void *opdata) 
     1314  { 
    13151315    int iNX = *((int*)opdata); 
    1316     H5Gget_objinfo(loc_id, name, 0, &statbuf); 
    1317      
    1318     switch (statbuf.type)  
    1319     { 
    1320       case H5G_GROUP:  
     1316    H5O_info_t object_info; 
     1317    H5Oget_info_by_name(loc_id, name, &object_info, H5P_DEFAULT); 
     1318    switch ((object_info).type) { 
     1319      case H5O_TYPE_GROUP:  
    13211320        iNX++; 
    13221321        *((int*)opdata)=iNX; 
    13231322        break; 
    1324       case H5G_DATASET: 
     1323      case H5O_TYPE_DATASET: 
    13251324        iNX++; 
    13261325        *((int*)opdata)=iNX; 
     
    13341333  /*-------------------------------------------------------------------------*/ 
    13351334 
    1336   NXstatus  NX5getgroupinfo_recurse (NXhandle fid, int *iN, NXname pName, NXname pClass) 
     1335  NXstatus  NX5getgroupinfo_recurse(NXhandle fid, int *iN, NXname pName, NXname pClass) 
    13371336  { 
    13381337    pNexusFile5 pFile; 
    1339     hid_t       atype, attr_id; 
     1338    hid_t       atype, attr_id, grp; 
    13401339    char        data[64]; 
    13411340         
     
    13461345       strcpy (pClass, "NXroot"); 
    13471346       pFile->iNX=0; 
    1348        H5Giterate(pFile->iFID,"/",0,group_info1,&pFile->iNX); 
     1347       grp = H5Gopen(pFile->iFID,"/",H5P_DEFAULT); 
     1348       H5Literate(grp, H5_INDEX_NAME, H5_ITER_INC, 0, group_info1, &pFile->iNX); 
     1349       H5Gclose(grp); 
    13491350       *iN=pFile->iNX; 
    13501351    } 
    13511352    else { 
    13521353      strcpy (pName,pFile->name_ref); 
    1353       attr_id = H5Aopen_name(pFile->iCurrentG,"NX_class"); 
     1354      attr_id = H5Aopen_by_name(pFile->iCurrentG,".", "NX_class", H5P_DEFAULT, H5P_DEFAULT); 
    13541355      if (attr_id<0) { 
    13551356         strcpy(pClass, NX_UNKNOWN_GROUP); 
     
    13601361        strcpy(pClass,data); 
    13611362        pFile->iNX=0; 
    1362         H5Giterate(pFile->iFID,pFile->name_ref,0,group_info1, &pFile->iNX); 
     1363        grp = H5Gopen(pFile->iFID,pFile->name_ref,H5P_DEFAULT); 
     1364        H5Literate(grp, H5_INDEX_NAME, H5_ITER_INC, 0, group_info1, &pFile->iNX); 
     1365        H5Gclose(grp); 
    13631366        *iN=pFile->iNX; 
    13641367        H5Aclose(attr_id); 
     
    13711374{ 
    13721375  int count = 0, type; 
    1373   hsize_t numobj, i; 
     1376  H5G_info_t numobj; 
    13741377   
    13751378  herr_t status; 
    13761379 
    1377   status = H5Gget_num_objs(loc_id, &numobj); 
     1380  status = H5Gget_info(loc_id, &numobj); 
    13781381  if(status < 0) { 
    13791382    NXReportError("Internal error, failed to retrive no of objects"); 
     
    13811384  } 
    13821385 
    1383   for(i = 0; i < numobj; i++){ 
    1384     type = H5Gget_objtype_by_idx(loc_id,i); 
    1385     if(type == H5G_GROUP || type == H5G_DATASET){ 
    1386       count++; 
    1387     } 
    1388   } 
     1386  count = numobj.nlinks; 
    13891387  return count; 
    13901388} 
     
    13951393    hid_t atype, attr_id, gid; 
    13961394    char data[64]; 
    1397          
     1395 
    13981396    pFile = NXI5assert (fid); 
    13991397    /* check if there is a group open */ 
     
    14071405    else { 
    14081406      strcpy (pName,pFile->name_ref); 
    1409       attr_id = H5Aopen_name(pFile->iCurrentG,"NX_class"); 
     1407      attr_id = H5Aopen_by_name(pFile->iCurrentG,".", "NX_class", H5P_DEFAULT, H5P_DEFAULT); 
    14101408      if (attr_id<0) { 
    14111409         strcpy(pClass, NX_UNKNOWN_GROUP); 
     
    15741572  /*-------------------------------------------------------------------------*/ 
    15751573 
    1576   NXstatus  NX5getnextentry (NXhandle fid,NXname name, NXname nxclass, int *datatype) 
     1574  NXstatus  NX5getnextentry(NXhandle fid, NXname name, NXname nxclass, int *datatype) 
    15771575  { 
    15781576    pNexusFile5 pFile; 
     
    15801578    herr_t      iRet; 
    15811579    int         iPtype, i; 
    1582     int         idx; 
     1580    hsize_t     idx; 
    15831581    H5T_class_t tclass; 
    15841582    char        data[128]; 
     
    15991597       strcpy(pFile->name_ref,"/"); 
    16001598    }   
    1601     iRet=H5Giterate(pFile->iFID,pFile->name_ref,&idx,nxgroup_info,&op_data); 
     1599    grp = H5Gopen(pFile->iFID, pFile->name_ref, H5P_DEFAULT); 
     1600    // index can be wrong here 
     1601    iRet=H5Literate(grp, H5_INDEX_NAME, H5_ITER_INC, &idx, nxgroup_info, &op_data); 
     1602    H5Gclose(grp); 
    16021603    strcpy(nxclass, NX_UNKNOWN_GROUP); 
    16031604    
     
    16071608    */ 
    16081609    if (pFile->iCurrentG == 0) { 
     1610        // if pFile->iCurrentG == 0 would not pFile->name_ref be "/" already, so we could skip that if statement ? 
    16091611       pFile->iNX=0; 
    1610        iRet_iNX = H5Giterate(pFile->iFID,"/",0,group_info1,&pFile->iNX); 
     1612       grp = H5Gopen(pFile->iFID, "/", H5P_DEFAULT); 
     1613       iRet_iNX=H5Literate(grp, H5_INDEX_NAME, H5_ITER_INC, 0, group_info1, &pFile->iNX); 
     1614       H5Gclose(grp); 
    16111615    } else { 
    16121616      pFile->iNX=0; 
    1613       iRet_iNX = H5Giterate(pFile->iFID,pFile->name_ref,0,group_info1, &pFile->iNX); 
     1617      grp = H5Gopen(pFile->iFID, pFile->name_ref, H5P_DEFAULT); 
     1618        // index can be wrong here 
     1619      iRet_iNX=H5Literate(grp, H5_INDEX_NAME, H5_ITER_INC, 0, group_info1, &pFile->iNX); 
     1620      H5Gclose(grp); 
    16141621    } 
    16151622    if (idx == pFile->iNX) { 
     1623        // why 2? 
    16161624       iRet_iNX = 2;    
    16171625    }  
     
    16271635          return NX_EOD; 
    16281636        }          
    1629         if (op_data.type == H5G_GROUP) 
    1630         { 
     1637        if (op_data.type == H5O_TYPE_GROUP) { 
    16311638          /* 
    16321639            open group and find class name attribute  
     
    16411648           grp = H5Gopen(pFile->iFID,ph_name, H5P_DEFAULT); 
    16421649           if (grp < 0) { 
    1643               sprintf (pBuffer, "ERROR: group %s does not exist", ph_name); 
    1644               NXReportError( pBuffer); 
     1650              sprintf(pBuffer, "ERROR: group %s does not exist", ph_name); 
     1651              NXReportError(pBuffer); 
    16451652              return NX_ERROR;   
    16461653           } 
    1647            attr1 = H5Aopen_name(grp, "NX_class"); 
     1654           attr1 = H5Aopen_by_name(grp,".",  "NX_class", H5P_DEFAULT, H5P_DEFAULT); 
    16481655           if (attr1 < 0) { 
    16491656              strcpy(nxclass, NX_UNKNOWN_GROUP); 
     
    16581665           } 
    16591666           H5Gclose(grp); 
    1660         } else if (op_data.type==H5G_DATASET) 
    1661         { 
     1667        } else if (op_data.type==H5O_TYPE_DATASET) { 
    16621668          /* 
    16631669            open dataset and find type 
     
    16751681         } 
    16761682          return NX_OK; 
    1677        }  
    1678        else 
    1679        {  
     1683       } else {  
    16801684         /* 
    16811685           we are at the end of the search: clear the data structure and reset  
     
    16921696            free(op_data.iname); 
    16931697         }  
    1694          NXReportError(  
    1695                             "ERROR: Iteration (directory) was not successful"); 
     1698         NXReportError("ERROR: iterating through group not successful"); 
    16961699         return NX_ERROR;               
    16971700       } 
     
    19011904     hsize_t idx, intern_idx=-1; 
    19021905     int vid; 
     1906     H5O_info_t oinfo; 
    19031907 
    19041908     pFile = NXI5assert (fileid); 
     
    19091913     idx=pFile->iAtt5.iCurrentIDX; 
    19101914     iRet=0; 
    1911      // TODO replace 
    1912      intern_idx=H5Aget_num_attrs(vid); 
     1915  
     1916     H5Oget_info(vid, &oinfo); 
     1917     intern_idx=oinfo.num_attrs; 
    19131918     if(intern_idx == idx) { 
    19141919       killAttVID(pFile,vid); 
     
    19171922 
    19181923     if (intern_idx > idx) { 
    1919        /* iRet=H5Aiterate(vid,&idx,attr_info,&iname); */ 
    19201924       iRet=H5Aiterate(vid,H5_INDEX_CRT_ORDER,H5_ITER_INC,&idx,attr_info,&iname); 
    19211925     } else { 
     
    19431947       strcpy(pName,"What is this?"); 
    19441948     } 
    1945      pFile->iCurrentA = H5Aopen_name(vid, pName); 
     1949     pFile->iCurrentA = H5Aopen_by_name(vid, ".", pName, H5P_DEFAULT, H5P_DEFAULT); 
    19461950     atype  = H5Aget_type(pFile->iCurrentA); 
    19471951     aspace = H5Aget_space(pFile->iCurrentA); 
     
    19621966     H5Aclose(pFile->iCurrentA); 
    19631967   
    1964      intern_idx=H5Aget_num_attrs(vid); 
     1968     H5Oget_info(vid, &oinfo); 
     1969     intern_idx=oinfo.num_attrs; 
    19651970 
    19661971     killAttVID(pFile,vid); 
     
    19831988 
    19841989     vid = getAttVID(pFile); 
    1985      iNew = H5Aopen_name(vid, name); 
     1990     iNew = H5Aopen_by_name(vid, ".", name, H5P_DEFAULT, H5P_DEFAULT); 
    19861991     if (iNew < 0) { 
    19871992       sprintf (pBuffer, "ERROR: attribute \"%s\" not found", name); 
     
    20282033     pNexusFile5 pFile; 
    20292034     char *iname = NULL;  
    2030      unsigned int idx; 
     2035     hid_t idx; 
    20312036     int vid; 
     2037     H5O_info_t oinfo; 
    20322038     
    20332039     pFile = NXI5assert (fid); 
     
    20372043     vid = getAttVID(pFile); 
    20382044 
    2039      idx=H5Aget_num_attrs(vid); 
     2045     H5Oget_info(vid, &oinfo); 
     2046     idx=oinfo.num_attrs; 
    20402047     if (idx > 0) { 
    20412048       if(pFile->iCurrentG > 0 && pFile->iCurrentD == 0){ 
     
    21622169      fHandle->nxinitattrdir=NX5initattrdir; 
    21632170      fHandle->nxprintlink=NX5printlink; 
    2164       fHandle->nxnativeexternallink=NX5nativeexternallink; 
     2171//      fHandle->nxnativeexternallink=NX5nativeexternallink; 
     2172      fHandle->nxnativeexternallink=NULL; 
    21652173} 
    21662174 
Note: See TracChangeset for help on using the changeset viewer.