3a7af1f0cdfaa6a81e925e08a04272db1519943c
[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     std::string name;
52
53     friend class H5AttributesList;
54     friend class H5LinkList;
55     friend class H5Dataset;
56
57 public :
58
59     H5Object(H5Object & _parent);
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 haddr_t getAddr() const
79     {
80         return getInfo().addr;
81     }
82
83     virtual const std::string & getName() const
84     {
85         return name;
86     }
87     virtual std::string getCompletePath() const;
88     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const
89     {
90         return "";
91     }
92
93     virtual std::string ls() const
94     {
95         return "";
96     }
97
98     virtual void printLsInfo(std::ostringstream & os) const
99     {
100         return;
101     }
102
103     virtual std::string toString() const
104     {
105         return toString(0);
106     }
107     virtual std::string toString(const unsigned int indentLevel) const
108     {
109         return "";
110     }
111     virtual void getAccessibleAttribute(const std::string & _name, const int pos, void * pvApiCtx) const;
112     virtual void getAccessibleAttribute(const double index, const int pos, void * pvApiCtx) const
113     {
114         throw H5Exception(__LINE__, __FILE__, _("Invalid operation"));
115     }
116
117     virtual void setAccessibleAttribute(const std::string & name, const int pos, void * pvApiCtx) const
118     {
119         throw H5Exception(__LINE__, __FILE__, _("Invalid operation"));
120     }
121
122     virtual void setAccessibleAttribute(const double index, const int pos, void * pvApiCtx) const
123     {
124         throw H5Exception(__LINE__, __FILE__, _("Invalid operation"));
125     }
126
127     virtual bool checkType(const int type) const
128     {
129         return getInfo().type == type;
130     }
131
132     void setScilabId(const int id)
133     {
134         scilabId = id;
135     }
136
137     H5Object & getParent() const
138     {
139         return parent;
140     }
141     H5File & getFile() const;
142
143     virtual void createOnScilabStack(int pos, void * pvApiCtx) const;
144     virtual void createInScilabList(int * list, int stackPos, int pos, void * pvApiCtx) const;
145     bool isRoot() const
146     {
147         return this == &root;
148     }
149
150     static std::string getIndentString(const unsigned int indentLevel)
151     {
152         return std::string((size_t)(__H5_INDENT_LENGTH__ * indentLevel), ' ');
153     }
154
155     static H5Object & getRoot()
156     {
157         return root;
158     }
159
160     static void cleanAll()
161     {
162         root.locked = true;
163         for (std::set<H5Object *>::iterator it = root.children.begin(); it != root.children.end(); it++)
164         {
165             delete *it;
166         }
167         root.locked = false;
168         H5VariableScope::clearScope();
169     }
170
171     static void getResizedString(std::string & str)
172     {
173         if (str.length() < __H5_LS_LENGTH__)
174         {
175             str.resize(__H5_LS_LENGTH__, ' ');
176         }
177     }
178
179     static H5Object & getObject(H5Object & parent, hid_t obj);
180     static H5Object & getObject(H5Object & parent, const char * name);
181     static H5Object & getObject(H5Object & parent, const std::string & name);
182     static void getLinksInfo(const H5Object & obj, std::vector<std::string> & linksName, std::vector<std::string> & types, std::vector<std::string> & linksType);
183
184 protected :
185     std::set<H5Object *> children;
186     void registerChild(H5Object * child)
187     {
188         if (!locked) children.insert(child);
189     }
190     void unregisterChild(H5Object * child)
191     {
192         if (!locked) children.erase(child);
193     }
194
195 private :
196
197     H5Object() : parent(*this) { }
198
199     typedef struct
200     {
201         std::vector<std::string> * name;
202         std::vector<std::string> * type;
203         std::vector<std::string> * linktype;
204     } LinksInfo_;
205
206     static herr_t iterateGetInfo(hid_t g_id, const char * name, const H5L_info_t * info, void * op_data);
207 };
208 }
209
210 #undef __H5_INDENT_LENGTH__
211 #undef __H5_LS_LENGTH__
212
213 #endif // __H5OBJECT_HXX__