Fix bugs and it is now possible to read hyperslabs
[scilab.git] / scilab / modules / hdf5 / src / cpp / H5AttributesList.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #include "H5AttributesList.hxx"
14 #include "H5Attribute.hxx"
15
16 namespace org_modules_hdf5
17 {
18
19 H5AttributesList::H5AttributesList(H5Object & _parent) : H5ListObject(_parent) { }
20
21 H5AttributesList::H5AttributesList(H5Object & _parent, const unsigned int _size, const unsigned int * _index) : H5ListObject(_parent, _size, _index) { }
22
23 H5AttributesList::~H5AttributesList() { }
24
25 const unsigned int H5AttributesList::getSize() const
26 {
27     if (H5ListObject::indexList)
28     {
29         return H5ListObject::indexSize;
30     }
31     else
32     {
33         H5O_info_t info;
34         herr_t err = H5Oget_info(parent.getH5Id(), &info);
35
36         if (err < 0)
37         {
38             throw H5Exception(__LINE__, __FILE__, _("Cannot get the size of attribute list."));
39         }
40
41         return (unsigned int)info.num_attrs;
42     }
43 }
44
45 void H5AttributesList::setObject(const unsigned int pos, H5Attribute & attribute)
46 {
47
48 }
49
50 H5Attribute & H5AttributesList::getObject(const std::string & name)
51 {
52     return *new H5Attribute(parent, name);
53 }
54
55 H5Attribute & H5AttributesList::getObject(const int pos)
56 {
57     return getObject(pos, true);
58 }
59
60 H5Attribute & H5AttributesList::getObject(const int pos, const bool checkPos)
61 {
62     hid_t attr;
63     ssize_t ssize;
64     std::string name;
65     int _pos = pos;
66
67     if (checkPos)
68     {
69         unsigned int size = getSize();
70         if (pos < 0 || pos >= size)
71         {
72             throw H5Exception(__LINE__, __FILE__, _("Invalid index %u: must be between 0 and %u."), pos, size);
73         }
74     }
75
76     if (H5ListObject::indexList)
77     {
78         _pos = H5ListObject::indexList[pos];
79     }
80
81     attr = H5Aopen_by_idx(parent.getH5Id(), ".", H5_INDEX_NAME, H5_ITER_NATIVE, (hsize_t)_pos, H5P_DEFAULT, H5P_DEFAULT);
82     if (attr < 0)
83     {
84         throw H5Exception(__LINE__, __FILE__, _("Cannot open attribute at position %u."), pos);
85     }
86
87     ssize = H5Aget_name(attr, 0, 0);
88     if (ssize > 0)
89     {
90         char * _name = new char[ssize + 1];
91         H5Aget_name(attr, ssize + 1, _name);
92         name = std::string(_name);
93         delete[] _name;
94     }
95
96     return *new H5Attribute(parent, name);
97 }
98
99 std::string H5AttributesList::dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
100 {
101     std::ostringstream os;
102     unsigned int size = getSize();
103
104     for (unsigned int i = 0; i < size; i++)
105     {
106         const H5Attribute & attr = const_cast<H5AttributesList *>(this)->getObject(i, false);
107         os << attr.dump(alreadyVisited, indentLevel);
108
109         delete &attr;
110     }
111
112     return os.str();
113 }
114
115 std::string H5AttributesList::toString(const unsigned int indentLevel) const
116 {
117     std::ostringstream os;
118     std::string indentString = H5Object::getIndentString(indentLevel);
119
120     os << indentString << _("Filename") << ": " << getFile().getFileName() << std::endl
121        << indentString << _("Attributes") << ": [1 x " << getSize() << "]";
122
123     return os.str();
124 }
125 }