Fix bugs and it is now possible to read hyperslabs
[scilab.git] / scilab / modules / hdf5 / src / cpp / H5Object.hxx
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 #ifndef __H5OBJECT_HXX__
14 #define __H5OBJECT_HXX__
15
16 #include <hdf5.h>
17
18 #include <algorithm>
19 #include <iostream>
20 #include <string>
21 #include <set>
22 #include <map>
23 #include <cstdlib>
24
25 extern "C"
26 {
27 #include "MALLOC.h"
28 #include "Scierror.h"
29 #include "api_scilab.h"
30 #include "localization.h"
31 }
32
33 #include "H5VariableScope.hxx"
34 #include "H5Exception.hxx"
35
36 #define __H5_INDENT_LENGTH__ 3
37 #define __H5_LS_LENGTH__ 25
38
39 namespace org_modules_hdf5
40 {
41 class H5AttributesList;
42 class H5File;
43
44 class H5Object
45 {
46     static H5Object & root;
47
48     bool locked;
49     H5Object & parent;
50     int scilabId;
51
52     friend class H5AttributesList;
53     friend class H5LinkList;
54     friend class H5Dataset;
55
56 public :
57
58     H5Object(H5Object & _parent);
59     H5Object(H5Object & _parent, const std::string & _name);
60     virtual ~H5Object();
61
62     virtual hid_t getH5Id() const;
63     virtual H5AttributesList & getAttributes();
64
65     virtual H5O_info_t getInfo() const
66     {
67         H5O_info_t info;
68         H5Oget_info(getH5Id(), &info);
69
70         return info;
71     }
72
73     virtual bool isFile() const
74     {
75         return false;
76     }
77
78     virtual bool isGroup() const
79     {
80         return false;
81     }
82
83     virtual bool isAttribute() const
84     {
85         return false;
86     }
87
88     virtual bool isReference() const
89     {
90         return false;
91     }
92
93     virtual bool isDataspace() const
94     {
95         return false;
96     }
97
98     virtual bool isDataset() const
99     {
100         return false;
101     }
102
103     virtual bool isType() const
104     {
105         return false;
106     }
107
108     virtual bool isList() const
109     {
110         return false;
111     }
112
113     virtual haddr_t getAddr() const
114     {
115         return getInfo().addr;
116     }
117
118     virtual const std::string & getName() const
119     {
120         return name;
121     }
122
123     virtual const std::string getBaseName() const
124     {
125         std::string::size_type pos = name.find_last_of('/');
126         if (pos == std::string::npos)
127         {
128             return name;
129         }
130         else
131         {
132             return name.substr(pos + 1);
133         }
134     }
135
136     virtual std::string getCompletePath() const;
137     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const
138     {
139         return "";
140     }
141
142     virtual std::string ls() const
143     {
144         return "";
145     }
146
147     virtual void ls(std::vector<std::string> & name, std::vector<std::string> & type) const
148     {
149
150     }
151
152     virtual void printLsInfo(std::ostringstream & os) const
153     {
154         return;
155     }
156
157     virtual std::string toString() const
158     {
159         return toString(0);
160     }
161     virtual std::string toString(const unsigned int indentLevel) const
162     {
163         return "";
164     }
165     virtual void getAccessibleAttribute(const std::string & _name, const int pos, void * pvApiCtx) const;
166     virtual void getAccessibleAttribute(const double index, const int pos, void * pvApiCtx) const
167     {
168         throw H5Exception(__LINE__, __FILE__, _("Invalid operation"));
169     }
170
171     virtual void setAccessibleAttribute(const std::string & name, const int pos, void * pvApiCtx) const
172     {
173         throw H5Exception(__LINE__, __FILE__, _("Invalid operation"));
174     }
175
176     virtual void setAccessibleAttribute(const double index, const int pos, void * pvApiCtx) const
177     {
178         throw H5Exception(__LINE__, __FILE__, _("Invalid operation"));
179     }
180
181     void setScilabId(const int id)
182     {
183         scilabId = id;
184     }
185
186     H5Object & getParent() const
187     {
188         return parent;
189     }
190     H5File & getFile() const;
191
192     virtual void createOnScilabStack(int pos, void * pvApiCtx) const;
193     virtual void createInScilabList(int * list, int stackPos, int pos, void * pvApiCtx) const;
194     bool isRoot() const
195     {
196         return this == &root;
197     }
198
199     static std::string getIndentString(const unsigned int indentLevel)
200     {
201         return std::string((size_t)(__H5_INDENT_LENGTH__ * indentLevel), ' ');
202     }
203
204     static H5Object & getRoot()
205     {
206         return root;
207     }
208
209     static void cleanAll()
210     {
211         root.locked = true;
212         for (std::set<H5Object *>::iterator it = root.children.begin(); it != root.children.end(); it++)
213         {
214             delete *it;
215         }
216         root.locked = false;
217         H5VariableScope::clearScope();
218     }
219
220     static void getResizedString(std::string & str)
221     {
222         if (str.length() < __H5_LS_LENGTH__)
223         {
224             str.resize(__H5_LS_LENGTH__, ' ');
225         }
226     }
227
228     static H5Object & getObject(H5Object & parent, hid_t obj);
229     static H5Object & getObject(H5Object & parent, const std::string & name);
230     static void getLinksInfo(const H5Object & obj, std::vector<std::string> & linksName, std::vector<std::string> & types, std::vector<std::string> & linksType);
231
232 protected :
233
234     typedef struct
235     {
236         H5Object * parent;
237         std::vector<std::string> * name;
238         std::vector<std::string> * type;
239     } OpDataGetLs;
240
241     const std::string name;
242     std::set<H5Object *> children;
243     void registerChild(H5Object * child)
244     {
245         if (!locked) children.insert(child);
246     }
247     void unregisterChild(H5Object * child)
248     {
249         if (!locked) children.erase(child);
250     }
251
252     static herr_t getLsAttributes(hid_t location_id, const char * attr_name, const H5A_info_t * ainfo, void * op_data);
253
254 private :
255
256     H5Object() : parent(*this) { }
257
258     typedef struct
259     {
260         std::vector<std::string> * name;
261         std::vector<std::string> * type;
262         std::vector<std::string> * linktype;
263     } LinksInfo_;
264
265     static herr_t iterateGetInfo(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
266 };
267 }
268
269 #undef __H5_INDENT_LENGTH__
270 #undef __H5_LS_LENGTH__
271
272 #endif // __H5OBJECT_HXX__