45#include "config_hdf.h"
69static bool IsInternalVgroup(int32 fid, int32 ref);
70static bool IsInternalVdata(int32 fid,int32 ref);
77void hdfistream_vgroup::_init(
void)
79 _vgroup_id = _index = _attr_index = _nattrs = 0;
86void hdfistream_vgroup::_get_fileinfo(
void)
91 while ((ref = Vgetid(_file_id, ref)) != -1) {
92 if (!IsInternalVgroup(_file_id, ref))
93 _vgroup_refs.push_back(ref);
99void hdfistream_vgroup::_seek_next(
void)
103 _seek(_vgroup_refs[_index]);
107void hdfistream_vgroup::_seek(
const char *name)
109 int32 ref = Vfind(_file_id, name);
118void hdfistream_vgroup::_seek(int32 ref)
122 vector < int32 >::iterator r =
123 find(_vgroup_refs.begin(), _vgroup_refs.end(), ref);
124 if (r == _vgroup_refs.end())
126 _index = r - _vgroup_refs.begin();
127 if ((_vgroup_id = Vattach(_file_id, ref,
"r")) < 0) {
132 _nattrs = Vnattrs(_vgroup_id);
136string hdfistream_vgroup::_memberName(int32 ref)
138 char mName[hdfclass::MAXSTR];
141 if ((member_id = Vattach(_file_id, ref,
"r")) >= 0) {
142 if (Vgetname(member_id, mName) < 0) {
158hdfistream_vgroup::hdfistream_vgroup(
const string filename):
hdfistream_obj
162 if (_filename.length() != 0)
163 open(_filename.c_str());
167void hdfistream_vgroup::open(
const string & filename)
169 open(filename.c_str());
173void hdfistream_vgroup::open(
const char *filename)
177 if ((_file_id = Hopen(filename, DFACC_RDONLY, 0)) < 0)
179 if (Vstart(_file_id) < 0)
182 BESDEBUG(
"h4",
"vgroup file opened: id=" << _file_id << endl);
184 _filename = filename;
190void hdfistream_vgroup::close(
void)
192 BESDEBUG(
"h4",
"vgroup file closed: id=" << _file_id <<
", this: " <<
this << endl);
196 if (_vgroup_id != 0) {
197 status = Vdetach(_vgroup_id);
198 BESDEBUG(
"h4",
"vgroup Vdetach status: " << status <<
", this: " <<
this << endl);
202 status = Vend(_file_id);
203 BESDEBUG(
"h4",
"vgroup vend status: " << status <<
", this: " <<
this << endl);
205 status = Hclose(_file_id);
206 BESDEBUG(
"h4",
"vgroup HClose status: " << status <<
", this: " <<
this << endl);
207 BESDEBUG(
"h4",
"Error: " << HEstring((hdf_err_code_t)HEvalue(1)) << endl);
209 _vgroup_id = _file_id = _index = _attr_index = _nattrs = 0;
210 _vgroup_refs = vector < int32 > ();
215void hdfistream_vgroup::seek(
int index)
217 if (index < 0 || index >= (
int) _vgroup_refs.size())
219 _seek(_vgroup_refs[index]);
224void hdfistream_vgroup::seek_ref(
int ref)
230void hdfistream_vgroup::seek(
const string & name)
235void hdfistream_vgroup::seek(
const char *name)
241string hdfistream_vgroup::memberName(int32 ref)
243 string mName = _memberName(ref);
267 hv.vclass = hv.name = string();
275 hv.ref = _vgroup_refs[_index];
279 char name[hdfclass::MAXSTR];
280 char vclass[hdfclass::MAXSTR];
282 if (Vinquire(_vgroup_id, &nentries, name) < 0)
284 hv.name = string(name);
285 if (Vgetclass(_vgroup_id, vclass) < 0)
287 hv.vclass = string(vclass);
290 int32 npairs = Vntagrefs(_vgroup_id);
295 for (
int i = 0; i < npairs; ++i) {
298 if (Vgettagref(_vgroup_id, i, &tag, &ref) < 0)
305 if (!vdin.isInternalVdata(ref)) {
307 if (!IsInternalVdata(_file_id,ref)) {
308 hv.tags.push_back(tag);
309 hv.refs.push_back(ref);
310 hv.vnames.push_back(memberName(ref));
314 hv.tags.push_back(tag);
315 hv.refs.push_back(ref);
316 hv.vnames.push_back(memberName(ref));
330bool hdf_vgroup::_ok(
void)
const
334 if (tags.size() == 0)
338 if (refs.size() == 0)
344bool IsInternalVgroup(int32 fid, int32 ref)
347 set < string, less < string > >reserved_names;
348 reserved_names.insert(
"RIATTR0.0N");
349 reserved_names.insert(
"RIG0.0");
351 set < string, less < string > >reserved_classes;
352 reserved_classes.insert(
"Attr0.0");
353 reserved_classes.insert(
"RIATTR0.0C");
354 reserved_classes.insert(
"DimVal0.0");
355 reserved_classes.insert(
"DimVal0.1");
356 reserved_classes.insert(
"CDF0.0");
357 reserved_classes.insert(
"Var0.0");
358 reserved_classes.insert(
"Dim0.0");
359 reserved_classes.insert(
"UDim0.0");
360 reserved_classes.insert(
"Data0.0");
361 reserved_classes.insert(
"RI0.0");
365 if ((vid = Vattach(fid, ref,
"r")) < 0) {
369 char name[hdfclass::MAXSTR];
370 char vclass[hdfclass::MAXSTR];
371 if (Vgetname(vid, name) < 0) {
375 if (reserved_names.find(
string(name)) != reserved_names.end()) {
380 if (Vgetclass(vid, vclass) < 0) {
387 if (reserved_classes.find(
string(vclass)) != reserved_classes.end())
393bool IsInternalVdata(int32 fid, int32 ref) {
394 set<string, less<string> > reserved_names;
395 reserved_names.insert(
"RIATTR0.0N");
397 set<string, less<string> > reserved_classes;
398 reserved_classes.insert(
"Attr0.0");
399 reserved_classes.insert(
"RIATTR0.0C");
400 reserved_classes.insert(
"DimVal0.0");
401 reserved_classes.insert(
"DimVal0.1");
402 reserved_classes.insert(
"_HDF_CHK_TBL_0");
406 if ((vid = VSattach(fid, ref,
"r")) < 0) {
409 char name[hdfclass::MAXSTR];
410 char vclass[hdfclass::MAXSTR];
411 if (VSgetname(vid, name) < 0) {
415 if (reserved_names.find(
string(name)) != reserved_names.end()) {
420 if (VSgetclass(vid, vclass) < 0) {
427 if (reserved_classes.find(
string(vclass)) != reserved_classes.end())
436bool hdfistream_vgroup::eo_attr(
void)
const
438 if (_filename.length() == 0)
443 return (_attr_index >= _nattrs);
465 if (_filename.length() == 0)
470 char name[hdfclass::MAXSTR];
471 int32 number_type, count, size;
473 (_vgroup_id, _attr_index, name, &number_type, &count, &size) < 0)
478 data =
new char[count * DFKNTsize(number_type)];
483 if (Vgetattr(_vgroup_id, _attr_index, data) < 0) {
489 ha.values =
hdf_genvec(number_type, data, count);