45#include "config_hdf.h"
68static bool IsInternalVgroup(int32 fid, int32 ref);
69static bool IsInternalVdata(int32 fid,int32 ref);
76void hdfistream_vgroup::_init(
void)
78 _vgroup_id = _index = _attr_index = _nattrs = 0;
85void hdfistream_vgroup::_get_fileinfo(
void)
90 while ((ref = Vgetid(_file_id, ref)) != -1) {
91 if (!IsInternalVgroup(_file_id, ref))
92 _vgroup_refs.push_back(ref);
98void hdfistream_vgroup::_seek_next(
void)
102 _seek(_vgroup_refs[_index]);
106void hdfistream_vgroup::_seek(
const char *name)
108 int32 ref = Vfind(_file_id, name);
110 THROW(hcerr_vgroupfind);
117void hdfistream_vgroup::_seek(int32 ref)
121 auto r = find(_vgroup_refs.begin(), _vgroup_refs.end(), ref);
122 if (r == _vgroup_refs.end())
123 THROW(hcerr_vgroupfind);
124 _index = r - _vgroup_refs.begin();
125 if ((_vgroup_id = Vattach(_file_id, ref,
"r")) < 0) {
127 THROW(hcerr_vgroupopen);
130 _nattrs = Vnattrs(_vgroup_id);
134string hdfistream_vgroup::_memberName(int32 ref)
const
136 char mName[hdfclass::MAXSTR];
139 if ((member_id = Vattach(_file_id, ref,
"r")) >= 0) {
140 if (Vgetname(member_id, mName) < 0) {
142 THROW(hcerr_vgroupopen);
156hdfistream_vgroup::hdfistream_vgroup(
const string & filename):
hdfistream_obj
160 if (_filename.size() != 0)
161 open(_filename.c_str());
165void hdfistream_vgroup::open(
const string & filename)
167 open(filename.c_str());
171void hdfistream_vgroup::open(
const char *filename)
175 if ((_file_id = Hopen(filename, DFACC_RDONLY, 0)) < 0)
176 THROW(hcerr_openfile);
177 if (Vstart(_file_id) < 0)
178 THROW(hcerr_openfile);
180 BESDEBUG(
"h4",
"vgroup file opened: id=" << _file_id << endl);
182 _filename = filename;
188void hdfistream_vgroup::close(
void)
190 BESDEBUG(
"h4",
"vgroup file closed: id=" << _file_id <<
", this: " <<
this << endl);
194 if (_vgroup_id != 0) {
195 status = Vdetach(_vgroup_id);
196 BESDEBUG(
"h4",
"vgroup Vdetach status: " << status <<
", this: " <<
this << endl);
200 status = Vend(_file_id);
201 BESDEBUG(
"h4",
"vgroup vend status: " << status <<
", this: " <<
this << endl);
203 status = Hclose(_file_id);
204 BESDEBUG(
"h4",
"vgroup HClose status: " << status <<
", this: " <<
this << endl);
205 BESDEBUG(
"h4",
"Error: " << HEstring((hdf_err_code_t)HEvalue(1)) << endl);
207 _vgroup_id = _file_id = _index = _attr_index = _nattrs = 0;
208 _vgroup_refs = vector < int32 > ();
213void hdfistream_vgroup::seek(
int index)
215 if (index < 0 || index >= (
int) _vgroup_refs.size())
217 _seek(_vgroup_refs[index]);
222void hdfistream_vgroup::seek_ref(
int ref)
228void hdfistream_vgroup::seek(
const string & name)
233void hdfistream_vgroup::seek(
const char *name)
239string hdfistream_vgroup::memberName(int32 ref)
const
241 string mName = _memberName(ref);
250 for (hdf_vgroup hv; !eos();) {
265 hv.vclass = hv.name = string();
268 THROW(hcerr_invstream);
273 hv.ref = _vgroup_refs[_index];
277 char name[hdfclass::MAXSTR];
278 char vclass[hdfclass::MAXSTR];
280 if (Vinquire(_vgroup_id, &nentries, name) < 0)
281 THROW(hcerr_vgroupinfo);
282 hv.name = string(name);
283 if (Vgetclass(_vgroup_id, vclass) < 0)
284 THROW(hcerr_vgroupinfo);
285 hv.vclass = string(vclass);
288 int32 npairs = Vntagrefs(_vgroup_id);
290 hdfistream_vdata vdin(_filename);
293 for (
int i = 0; i < npairs; ++i) {
297 if (Vgettagref(_vgroup_id, i, &tag, &ref) < 0)
298 THROW(hcerr_vgroupread);
304 if (!vdin.isInternalVdata(ref)) {
306 if (!IsInternalVdata(_file_id,ref)) {
307 hv.tags.push_back(tag);
308 hv.refs.push_back(ref);
309 hv.vnames.push_back(memberName(ref));
313 hv.tags.push_back(tag);
314 hv.refs.push_back(ref);
315 hv.vnames.push_back(memberName(ref));
329bool hdf_vgroup::_ok(
void)
const
333 if (tags.empty() ==
true)
337 if (refs.empty() ==
true)
343static bool IsInternalVgroup(int32 fid, int32 ref)
346 set < string, less < string > >reserved_names;
347 reserved_names.emplace(
"RIATTR0.0N");
348 reserved_names.emplace(
"RIG0.0");
350 set < string, less < string > >reserved_classes;
351 reserved_classes.emplace(
"Attr0.0");
352 reserved_classes.emplace(
"RIATTR0.0C");
353 reserved_classes.emplace(
"DimVal0.0");
354 reserved_classes.emplace(
"DimVal0.1");
355 reserved_classes.emplace(
"CDF0.0");
356 reserved_classes.emplace(
"Var0.0");
357 reserved_classes.emplace(
"Dim0.0");
358 reserved_classes.emplace(
"UDim0.0");
359 reserved_classes.emplace(
"Data0.0");
360 reserved_classes.emplace(
"RI0.0");
364 if ((vid = Vattach(fid, ref,
"r")) < 0) {
365 THROW(hcerr_vgroupopen);
368 char name[hdfclass::MAXSTR];
369 char vclass[hdfclass::MAXSTR];
370 if (Vgetname(vid, name) < 0) {
372 THROW(hcerr_vgroupinfo);
374 if (reserved_names.find(
string(name)) != reserved_names.end()) {
379 if (Vgetclass(vid, vclass) < 0) {
381 THROW(hcerr_vgroupinfo);
386 if (reserved_classes.find(
string(vclass)) != reserved_classes.end())
392static bool IsInternalVdata(int32 fid, int32 ref) {
393 set<string, less<string> > reserved_names;
394 reserved_names.insert(
"RIATTR0.0N");
396 set<string, less<string> > reserved_classes;
397 reserved_classes.emplace(
"Attr0.0");
398 reserved_classes.emplace(
"RIATTR0.0C");
399 reserved_classes.emplace(
"DimVal0.0");
400 reserved_classes.emplace(
"DimVal0.1");
401 reserved_classes.emplace(
"_HDF_CHK_TBL_0");
405 if ((vid = VSattach(fid, ref,
"r")) < 0) {
406 THROW(hcerr_vdataopen);
408 char name[hdfclass::MAXSTR];
409 char vclass[hdfclass::MAXSTR];
410 if (VSgetname(vid, name) < 0) {
412 THROW(hcerr_vdatainfo);
414 if (reserved_names.find(
string(name)) != reserved_names.end()) {
419 if (VSgetclass(vid, vclass) < 0) {
421 THROW(hcerr_vdatainfo);
426 if (reserved_classes.find(
string(vclass)) != reserved_classes.end())
435bool hdfistream_vgroup::eo_attr(
void)
const
437 if (_filename.size() == 0)
438 THROW(hcerr_invstream);
442 return (_attr_index >= _nattrs);
447hdfistream_vgroup & hdfistream_vgroup::operator>>(vector < hdf_attr > &hav)
450 for (hdf_attr att; !eo_attr();) {
458hdfistream_vgroup & hdfistream_vgroup::operator>>(hdf_attr & ha)
462 ha.values = hdf_genvec();
464 if (_filename.size() == 0)
465 THROW(hcerr_invstream);
469 char name[hdfclass::MAXSTR];
475 (_vgroup_id, _attr_index, name, &number_type, &count, &size) < 0)
476 THROW(hcerr_vgroupinfo);
480 data =
new char[count * DFKNTsize(number_type)];
482 THROW(hcerr_nomemory);
485 if (Vgetattr(_vgroup_id, _attr_index, data) < 0) {
487 THROW(hcerr_vgroupinfo);
490 ha.values = hdf_genvec(number_type, data, count);