Fix bugs and it is now possible to read hyperslabs
[scilab.git] / scilab / modules / hdf5 / src / cpp / H5CompoundData.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 __H5COMPOUNDDATA_HXX__
14 #define __H5COMPOUNDDATA_HXX__
15
16 #include "H5Data.hxx"
17 #include "H5BasicData.hxx"
18
19 namespace org_modules_hdf5
20 {
21
22 class H5CompoundData : public H5BasicData<char>
23 {
24     const unsigned int nfields;
25     const std::string * fieldsname;
26     H5Data ** fieldsvalue;
27
28 public:
29
30     H5CompoundData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const unsigned int _nfields, std::string * _fieldsname, H5Data ** _fieldsvalue, char * _data, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, -1, 0, _dataOwner), nfields(_nfields), fieldsname(_fieldsname), fieldsvalue(_fieldsvalue)
31     {
32
33     }
34
35     virtual ~H5CompoundData()
36     {
37         delete[] fieldsname;
38         delete[] fieldsvalue;
39     }
40
41     H5Data & getData(const std::string fieldname) const
42     {
43         for (unsigned int i = 0; i < nfields; i++)
44         {
45             if (fieldname == fieldsname[i])
46             {
47                 return *fieldsvalue[i];
48             }
49         }
50
51         throw H5Exception(__LINE__, __FILE__, _("Invalid field name: %s"), fieldname.c_str());
52     }
53
54     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
55     {
56         return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this, false);
57     }
58
59     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
60     {
61         os << "{" << std::endl;
62         std::string indent = H5Object::getIndentString(indentLevel + 2);
63         for (unsigned int i = 0; i < nfields - 1; i++)
64         {
65             os << indent;
66             fieldsvalue[i]->printData(os, pos, indentLevel + 2);
67             os << ", " << std::endl;
68         }
69         os << indent;
70         fieldsvalue[nfields - 1]->printData(os, pos, indentLevel + 2);
71         os << std::endl << H5Object::getIndentString(indentLevel + 1) << "}";
72     }
73
74     virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
75     {
76         // TODO: gerer le cas ndims=0 (cas SCALAR)
77
78         static int structdims[2] = { 1, 1 };
79         const char ** _fieldsname = new const char *[nfields + 2];
80         SciErr err;
81         int * scilabStruct = 0;
82
83         _fieldsname[0] = "st";
84         _fieldsname[1] = "dims";
85         for (int i = 0; i < nfields; i++)
86         {
87             _fieldsname[i + 2] = fieldsname[i].c_str();
88         }
89
90         if (parentList)
91         {
92             err = createMListInList(pvApiCtx, lhsPosition, parentList, listPosition, nfields + 1, &scilabStruct);
93         }
94         else
95         {
96             err = createMList(pvApiCtx, lhsPosition, nfields + 2, &scilabStruct);
97         }
98
99         if (err.iErr)
100         {
101             delete[] _fieldsname;
102             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
103         }
104
105         err = createMatrixOfStringInList(pvApiCtx, lhsPosition, scilabStruct, 1, 1, nfields + 2, _fieldsname);
106         delete[] _fieldsname;
107         if (err.iErr)
108         {
109             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
110         }
111
112         err = createMatrixOfInteger32InList(pvApiCtx, lhsPosition, scilabStruct, 2, 1, 2, structdims);
113         if (err.iErr)
114         {
115             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
116         }
117
118         for (int i = 0; i < nfields; i++)
119         {
120             fieldsvalue[i]->toScilab(pvApiCtx, lhsPosition, scilabStruct, i + 3);
121         }
122     }
123 };
124 }
125
126 #endif // __H5COMPOUNDDATA_HXX__