/*-----------------------------------------------------------------------*/ void *nx_isexternalgroup(void *handle, char *name, char *nxclass){ int status, length = 1024; NXhandle hfil; char url[1024]; hfil = (NXhandle)handle; status = NXisexternalgroup(hfil,name, nxclass,url,length); if(status == NX_OK){ createTextNXDataset(url); } else { return NULL; } return NULL;/*NOTREACHED*/ }
/* Outputs the contents of a NeXus group */ int NXBdir(NXhandle fileId) { int status, dataType, dataRank, dataDimensions[NX_MAXRANK], length; NXname name, nxclass, nxurl; if (NXinitgroupdir(fileId) != NX_OK) return NX_ERROR; do { status = NXgetnextentry(fileId, name, nxclass, &dataType); if (status == NX_ERROR) break; if (status == NX_OK) { if (strncmp(nxclass, "CDF", 3) == 0) { ; } else if (strcmp(nxclass, "SDS") == 0) { printf(" NX Data : %s", name); if (NXopendata(fileId, name) != NX_OK) return NX_ERROR; if (NXgetinfo (fileId, &dataRank, dataDimensions, &dataType) != NX_OK) return NX_ERROR; if (NXclosedata(fileId) != NX_OK) return NX_ERROR; PrintDimensions(dataRank, dataDimensions); printf(" "); PrintType(dataType); printf("\n"); } else { length = sizeof(nxurl); if (NXisexternalgroup(fileId, name, nxclass, nxurl, length) == NX_OK) { printf(" NX external Group: %s (%s), linked to: %s \n", name, nxclass, nxurl); } else { printf(" NX Group : %s (%s)\n", name, nxclass); if ((status = NXopengroup(fileId, name, nxclass)) != NX_OK) { return status; } PrintGroupAttributes(fileId, name); if ((status = NXclosegroup(fileId)) != NX_OK) { return status; } } } } } while (status == NX_OK); return status; }
/*---------------------------------------------------------------------*/ static int testExternal(char *progName){ char nxfile[255], ext[5], testFile[80], time[132], filename[256]; int create; NXhandle hfil; int dummylen = 1; float dummyfloat = 1; float temperature; if(strstr(progName,"hdf4") != NULL){ strcpy(ext,"hdf"); create = NXACC_CREATE; } else if(strstr(progName,"hdf5") != NULL){ strcpy(ext,"h5"); create = NXACC_CREATE5; } else if(strstr(progName,"xml") != NULL){ strcpy(ext,"xml"); create = NXACC_CREATEXML; } else { printf("Failed to recognise napi_test program in testExternal\n"); return 1; } sprintf(testFile,"nxext.%s", ext); /* create the test file */ if(NXopen(testFile,create,&hfil) != NX_OK){ return 1; } /*if(NXmakegroup(hfil,"entry1","NXentry") != NX_OK){ return 1; }*/ sprintf(nxfile,"nxfile://data/dmc01.%s#/entry1",ext); if(NXlinkexternal(hfil,"entry1","NXentry",nxfile) != NX_OK){ return 1; } /*if(NXmakegroup(hfil,"entry2","NXentry") != NX_OK){ return 1; }*/ sprintf(nxfile,"nxfile://data/dmc02.%s#/entry1",ext); if(NXlinkexternal(hfil,"entry2","NXentry",nxfile) != NX_OK){ return 1; } if(NXmakegroup(hfil,"entry3","NXentry") != NX_OK){ return 1; } if(NXopengroup(hfil,"entry3","NXentry") != NX_OK){ return 1; } /* force create old style external link */ if (NXmakedata (hfil, "extlinkdata", NX_FLOAT32, 1, &dummylen) != NX_OK) return 1; if (NXopendata (hfil, "extlinkdata") != NX_OK) return 1; if (NXputdata (hfil, &dummyfloat) != NX_OK) return 1; sprintf(nxfile,"nxfile://data/dmc01.%s#/entry1/sample/temperature_mean",ext); if(NXputattr(hfil,"napimount",nxfile,strlen(nxfile), NX_CHAR) != NX_OK) return 1; /* this would segfault because we are tricking the napi stack if(NXclosedata(&hfil) != NX_OK){ return 1; } */ if(NXopenpath(hfil,"/entry3") != NX_OK){ return 1; } /* create new style external link on hdf5 , equivalent to the above on other backends */ if (NXlinkexternaldataset(hfil, "extlinknative", nxfile) != NX_OK) return 1; if(NXclose(&hfil) != NX_OK){ return 1; } /* actually test linking */ if(NXopen(testFile,NXACC_RDWR,&hfil) != NX_OK){ return 1; } if(NXopenpath(hfil,"/entry1/start_time") != NX_OK){ return 1; } memset(time,0,132); if(NXgetdata(hfil,time) != NX_OK){ return 1; } printf("First file time: %s\n", time); if(NXinquirefile(hfil,filename,256) != NX_OK){ return 1; } printf("NXinquirefile found: %s\n", relativePathOf(filename)); if(NXopenpath(hfil,"/entry2/sample/sample_name") != NX_OK){ return 1; } memset(time,0,132); if(NXgetdata(hfil,time) != NX_OK){ return 1; } printf("Second file sample: %s\n", time); if(NXinquirefile(hfil,filename,256) != NX_OK){ return 1; } printf("NXinquirefile found: %s\n", relativePathOf(filename)); if(NXopenpath(hfil,"/entry2/start_time") != NX_OK){ return 1; } memset(time,0,132); if(NXgetdata(hfil,time) != NX_OK){ return 1; } printf("Second file time: %s\n", time); NXopenpath(hfil,"/"); if(NXisexternalgroup(hfil,"entry1","NXentry",filename,255) != NX_OK){ return 1; } else { printf("entry1 external URL = %s\n", filename); } printf("testing link to external data set\n"); if(NXopenpath(hfil,"/entry3") != NX_OK){ return 1; } if(NXisexternaldataset(hfil,"extlinkdata",filename,255) != NX_OK){ printf("extlinkdata should be external link\n"); return 1; } else { printf("extlinkdata external URL = %s\n", filename); } if (NXopendata (hfil, "extlinkdata") != NX_OK) return 1; memset(&temperature,0,4); if(NXgetdata(hfil,&temperature) != NX_OK){ return 1; } printf("value retrieved: %4.2f\n", temperature); if(NXopenpath(hfil,"/entry3") != NX_OK){ return 1; } if(NXisexternaldataset(hfil,"extlinknative",filename,255) != NX_OK){ printf("extlinknative should be external link\n"); return 1; } else { printf("extlinknative external URL = %s\n", filename); } if (NXopendata (hfil, "extlinknative") != NX_OK) return 1; memset(&temperature,0,4); if(NXgetdata(hfil,&temperature) != NX_OK){ return 1; } printf("value retrieved: %4.2f\n", temperature); NXclose(&hfil); printf("External File Linking tested OK\n"); return 0; }