45 #include "config_hdf.h"
69 static bool IsInternalVgroup(int32 fid, int32 ref);
76 void hdfistream_vgroup::_init(
void)
78 _vgroup_id = _index = _attr_index = _nattrs = 0;
85 void 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);
98 void hdfistream_vgroup::_seek_next(
void)
102 _seek(_vgroup_refs[_index]);
106 void hdfistream_vgroup::_seek(
const char *name)
108 int32 ref = Vfind(_file_id, name);
117 void hdfistream_vgroup::_seek(int32 ref)
121 vector < int32 >::iterator r =
122 find(_vgroup_refs.begin(), _vgroup_refs.end(), ref);
123 if (r == _vgroup_refs.end())
125 _index = r - _vgroup_refs.begin();
126 if ((_vgroup_id = Vattach(_file_id, ref,
"r")) < 0) {
131 _nattrs = Vnattrs(_vgroup_id);
135 string hdfistream_vgroup::_memberName(int32 ref)
137 char mName[hdfclass::MAXSTR];
140 if ((member_id = Vattach(_file_id, ref,
"r")) >= 0) {
141 if (Vgetname(member_id, mName) < 0) {
157 hdfistream_vgroup::hdfistream_vgroup(
const string filename):
hdfistream_obj
161 if (_filename.length() != 0)
162 open(_filename.c_str());
166 void hdfistream_vgroup::open(
const string & filename)
168 open(filename.c_str());
172 void hdfistream_vgroup::open(
const char *filename)
176 if ((_file_id = Hopen(filename, DFACC_RDONLY, 0)) < 0)
178 if (Vstart(_file_id) < 0)
181 BESDEBUG(
"h4",
"vgroup file opened: id=" << _file_id << endl);
183 _filename = filename;
189 void hdfistream_vgroup::close(
void)
191 BESDEBUG(
"h4",
"vgroup file closed: id=" << _file_id <<
", this: " <<
this << endl);
195 if (_vgroup_id != 0) {
196 status = Vdetach(_vgroup_id);
197 BESDEBUG(
"h4",
"vgroup Vdetach status: " << status <<
", this: " <<
this << endl);
201 status = Vend(_file_id);
202 BESDEBUG(
"h4",
"vgroup vend status: " << status <<
", this: " <<
this << endl);
204 status = Hclose(_file_id);
205 BESDEBUG(
"h4",
"vgroup HClose status: " << status <<
", this: " <<
this << endl);
206 BESDEBUG(
"h4",
"Error: " << HEstring((hdf_err_code_t)HEvalue(1)) << endl);
208 _vgroup_id = _file_id = _index = _attr_index = _nattrs = 0;
209 _vgroup_refs = vector < int32 > ();
214 void hdfistream_vgroup::seek(
int index)
216 if (index < 0 || index >= (
int) _vgroup_refs.size())
218 _seek(_vgroup_refs[index]);
223 void hdfistream_vgroup::seek_ref(
int ref)
229 void hdfistream_vgroup::seek(
const string & name)
234 void hdfistream_vgroup::seek(
const char *name)
240 string hdfistream_vgroup::memberName(int32 ref)
242 string mName = _memberName(ref);
266 hv.vclass = hv.name = string();
274 hv.ref = _vgroup_refs[_index];
278 char name[hdfclass::MAXSTR];
279 char vclass[hdfclass::MAXSTR];
281 if (Vinquire(_vgroup_id, &nentries, name) < 0)
283 hv.name = string(name);
284 if (Vgetclass(_vgroup_id, vclass) < 0)
286 hv.vclass = string(vclass);
289 int32 npairs = Vntagrefs(_vgroup_id);
292 for (
int i = 0; i < npairs; ++i) {
295 if (Vgettagref(_vgroup_id, i, &tag, &ref) < 0)
302 if (!vdin.isInternalVdata(ref)) {
303 hv.tags.push_back(tag);
304 hv.refs.push_back(ref);
305 hv.vnames.push_back(memberName(ref));
309 hv.tags.push_back(tag);
310 hv.refs.push_back(ref);
311 hv.vnames.push_back(memberName(ref));
323 bool hdf_vgroup::_ok(
void)
const
327 if (tags.size() == 0)
331 if (refs.size() == 0)
337 bool IsInternalVgroup(int32 fid, int32 ref)
340 set < string, less < string > >reserved_names;
341 reserved_names.insert(
"RIATTR0.0N");
342 reserved_names.insert(
"RIG0.0");
344 set < string, less < string > >reserved_classes;
345 reserved_classes.insert(
"Attr0.0");
346 reserved_classes.insert(
"RIATTR0.0C");
347 reserved_classes.insert(
"DimVal0.0");
348 reserved_classes.insert(
"DimVal0.1");
349 reserved_classes.insert(
"CDF0.0");
350 reserved_classes.insert(
"Var0.0");
351 reserved_classes.insert(
"Dim0.0");
352 reserved_classes.insert(
"UDim0.0");
353 reserved_classes.insert(
"Data0.0");
354 reserved_classes.insert(
"RI0.0");
358 if ((vid = Vattach(fid, ref,
"r")) < 0) {
362 char name[hdfclass::MAXSTR];
363 char vclass[hdfclass::MAXSTR];
364 if (Vgetname(vid, name) < 0) {
368 if (reserved_names.find(
string(name)) != reserved_names.end()) {
373 if (Vgetclass(vid, vclass) < 0) {
380 if (reserved_classes.find(
string(vclass)) != reserved_classes.end())
388 bool hdfistream_vgroup::eo_attr(
void)
const
390 if (_filename.length() == 0)
395 return (_attr_index >= _nattrs);
417 if (_filename.length() == 0)
422 char name[hdfclass::MAXSTR];
423 int32 number_type, count, size;
425 (_vgroup_id, _attr_index, name, &number_type, &count, &size) < 0)
430 data =
new char[count * DFKNTsize(number_type)];
435 if (Vgetattr(_vgroup_id, _attr_index, data) < 0) {
441 ha.values =
hdf_genvec(number_type, data, count);