keep user_data in C
[scilab.git] / scilab / modules / graphic_objects / src / cpp / getGraphicObjectProperty.cpp
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
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.1-en.txt
10  *
11  */
12
13 extern "C"
14 {
15 #include <stdlib.h>
16 #include <string.h>
17 #include "getGraphicObjectProperty.h"
18 #include "graphicObjectProperties.h"
19 #include "getScilabJavaVM.h"
20 #include <stdio.h>
21 }
22
23 #include "CallGraphicController.hxx"
24 #include "DataController.hxx"
25 #include "ScilabView.hxx"
26
27 using namespace org_scilab_modules_graphic_objects;
28
29 void getGraphicObjectProperty(int iUID, int _iName, _ReturnType_ _returnType, void **_pvData)
30 {
31     // do not perform anything if the id is undefined
32     if (iUID == 0)
33     {
34         return;
35     }
36
37     switch (_iName)
38     {
39         case __GO_USER_DATA__ :
40         {
41             *_pvData = ScilabView::getUserdata(iUID);
42             break;
43         }
44         case __GO_USER_DATA_SIZE__ :
45         {
46             ((int *)*_pvData)[0] = ScilabView::getUserdataSize(iUID);
47             break;
48         }
49
50         /* All the Data model properties have the DATA_MODEL prefix */
51         case __GO_DATA_MODEL__ :
52         case __GO_DATA_MODEL_COORDINATES__ :
53         case __GO_DATA_MODEL_X__ :
54         case __GO_DATA_MODEL_Y__ :
55         case __GO_DATA_MODEL_Z__ :
56         case __GO_DATA_MODEL_X_COORDINATES_SHIFT__ :
57         case __GO_DATA_MODEL_Y_COORDINATES_SHIFT__ :
58         case __GO_DATA_MODEL_Z_COORDINATES_SHIFT__ :
59         case __GO_DATA_MODEL_X_COORDINATES_SHIFT_SET__ :
60         case __GO_DATA_MODEL_Y_COORDINATES_SHIFT_SET__ :
61         case __GO_DATA_MODEL_Z_COORDINATES_SHIFT_SET__ :
62         case __GO_DATA_MODEL_NUM_ELEMENTS__ :
63         case __GO_DATA_MODEL_NUM_ELEMENTS_ARRAY__ :
64         case __GO_DATA_MODEL_NUM_VERTICES_PER_GON__ :
65         case __GO_DATA_MODEL_NUM_GONS__ :
66         case __GO_DATA_MODEL_Z_COORDINATES_SET__ :
67         case __GO_DATA_MODEL_COLORS__ :
68         case __GO_DATA_MODEL_NUM_COLORS__ :
69         case __GO_DATA_MODEL_NUM_VERTICES__ :
70         case __GO_DATA_MODEL_NUM_INDICES__ :
71         case __GO_DATA_MODEL_INDICES__ :
72         case __GO_DATA_MODEL_VALUES__ :
73         case __GO_DATA_MODEL_FEC_TRIANGLES__ :
74         case __GO_DATA_MODEL_NUM_X__ :
75         case __GO_DATA_MODEL_NUM_Y__ :
76         case __GO_DATA_MODEL_NUM_Z__ :
77         case __GO_DATA_MODEL_GRID_SIZE__ :
78         case __GO_DATA_MODEL_X_DIMENSIONS__ :
79         case __GO_DATA_MODEL_Y_DIMENSIONS__ :
80         case __GO_DATA_MODEL_MATPLOT_BOUNDS__ :
81         case __GO_DATA_MODEL_MATPLOT_TYPE__ :
82         case __GO_DATA_MODEL_MATPLOT_DATA_INFOS__ :
83         case __GO_DATA_MODEL_MATPLOT_DATA_TYPE__ :
84         case __GO_DATA_MODEL_MATPLOT_DATA_ORDER__ :
85         case __GO_DATA_MODEL_MATPLOT_GL_TYPE__ :
86         case __GO_DATA_MODEL_MATPLOT_IMAGE_TYPE__ :
87         case __GO_DATA_MODEL_MATPLOT_IMAGE_DATA__ :
88         case __GO_DATA_MODEL_MATPLOT_IMAGE_DATASIZE__ :
89         case __GO_DATA_MODEL_DISPLAY_FUNCTION__ :
90         case __GO_DATA_MODEL_DISPLAY_FUNCTION_SIZE__ :
91         {
92             DataController::getGraphicObjectProperty(iUID, _iName, _pvData);
93             break;
94         }
95         default : //property in Java Model
96         {
97             try
98             {
99                 switch (_returnType)
100                 {
101                     case jni_string:
102                     {
103                         *(_pvData) = CallGraphicController::getGraphicObjectPropertyAsString(getScilabJavaVM(), iUID, _iName);
104                         return;
105                     }
106                     case jni_string_vector:
107                     {
108                         *_pvData = CallGraphicController::getGraphicObjectPropertyAsStringVector(getScilabJavaVM(), iUID, _iName);
109                         return;
110                     }
111                     case jni_double:
112                     {
113                         double * ret = CallGraphicController::getGraphicObjectPropertyAsDoubleVector(getScilabJavaVM(), iUID, _iName);
114                         if (ret == NULL)
115                         {
116                             *_pvData = NULL;
117                         }
118                         else
119                         {
120                             ((double *)*_pvData)[0] = *ret;
121                             delete[] ret;
122                         }
123
124                         return;
125                     }
126                     case jni_double_vector:
127                     {
128                         *_pvData = CallGraphicController::getGraphicObjectPropertyAsDoubleVector(getScilabJavaVM(), iUID, _iName);
129                         return;
130                     }
131                     case jni_bool:
132                     {
133                         int * ret = CallGraphicController::getGraphicObjectPropertyAsBooleanVector(getScilabJavaVM(), iUID, _iName);
134                         if (ret == NULL)
135                         {
136                             *_pvData = NULL;
137                         }
138                         else
139                         {
140                             ((int *)*_pvData)[0] = *ret;
141                             delete[] ret;
142                         }
143
144                         return;
145                     }
146                     case jni_bool_vector:
147                     {
148                         *_pvData = CallGraphicController::getGraphicObjectPropertyAsBooleanVector(getScilabJavaVM(), iUID, _iName);
149                         return;
150                     }
151                     case jni_int:
152                     {
153                         int * ret = CallGraphicController::getGraphicObjectPropertyAsIntegerVector(getScilabJavaVM(), iUID, _iName);
154                         if (ret == NULL)
155                         {
156                             *_pvData = NULL;
157                         }
158                         else
159                         {
160                             ((int *)*_pvData)[0] = *ret;
161                             delete[] ret;
162                         }
163
164                         return;
165                     }
166                     case jni_int_vector:
167                     {
168                         *_pvData = CallGraphicController::getGraphicObjectPropertyAsIntegerVector(getScilabJavaVM(), iUID, _iName);
169                         return;
170                     }
171                     default:
172                         *_pvData = NULL;
173                         return;
174                 }
175             }
176             catch (std::exception &e)
177             {
178                 e.what();
179                 // If we have an exception, return null to scilab to manage error.
180                 *_pvData = NULL;
181                 return;
182             }
183         }
184     }
185
186     return;
187 }
188
189
190 void releaseGraphicObjectProperty(int _iName, void * _pvData, enum _ReturnType_ _returnType, int numElements)
191 {
192
193     /* All the Data model properties have the DATA_MODEL prefix */
194     if (_iName == __GO_DATA_MODEL__
195             || _iName == __GO_DATA_MODEL_COORDINATES__
196             || _iName == __GO_DATA_MODEL_X__
197             || _iName == __GO_DATA_MODEL_Y__
198             || _iName == __GO_DATA_MODEL_Z__
199             || _iName == __GO_DATA_MODEL_X_COORDINATES_SHIFT__
200             || _iName == __GO_DATA_MODEL_Y_COORDINATES_SHIFT__
201             || _iName == __GO_DATA_MODEL_Z_COORDINATES_SHIFT__
202             || _iName == __GO_DATA_MODEL_X_COORDINATES_SHIFT_SET__
203             || _iName == __GO_DATA_MODEL_Y_COORDINATES_SHIFT_SET__
204             || _iName == __GO_DATA_MODEL_Z_COORDINATES_SHIFT_SET__
205             || _iName == __GO_DATA_MODEL_NUM_ELEMENTS__
206             || _iName == __GO_DATA_MODEL_NUM_ELEMENTS_ARRAY__
207             || _iName == __GO_DATA_MODEL_NUM_VERTICES_PER_GON__
208             || _iName == __GO_DATA_MODEL_NUM_GONS__
209             || _iName == __GO_DATA_MODEL_Z_COORDINATES_SET__
210             || _iName == __GO_DATA_MODEL_COLORS__
211             || _iName == __GO_DATA_MODEL_NUM_COLORS__
212             || _iName == __GO_DATA_MODEL_NUM_VERTICES__
213             || _iName == __GO_DATA_MODEL_NUM_INDICES__
214             || _iName == __GO_DATA_MODEL_INDICES__
215             || _iName == __GO_DATA_MODEL_VALUES__
216             || _iName == __GO_DATA_MODEL_FEC_TRIANGLES__
217             || _iName == __GO_DATA_MODEL_NUM_X__
218             || _iName == __GO_DATA_MODEL_NUM_Y__
219             || _iName == __GO_DATA_MODEL_NUM_Z__
220             || _iName == __GO_DATA_MODEL_GRID_SIZE__
221             || _iName == __GO_DATA_MODEL_X_DIMENSIONS__
222             || _iName == __GO_DATA_MODEL_Y_DIMENSIONS__
223             || _iName == __GO_DATA_MODEL_MATPLOT_BOUNDS__
224             || _iName == __GO_DATA_MODEL_MATPLOT_TYPE__
225             || _iName == __GO_DATA_MODEL_MATPLOT_DATA_INFOS__
226             || _iName == __GO_DATA_MODEL_MATPLOT_DATA_TYPE__
227             || _iName == __GO_DATA_MODEL_MATPLOT_DATA_ORDER__
228             || _iName == __GO_DATA_MODEL_MATPLOT_GL_TYPE__
229             || _iName == __GO_DATA_MODEL_MATPLOT_IMAGE_TYPE__
230             || _iName == __GO_DATA_MODEL_MATPLOT_IMAGE_DATA__
231             || _iName == __GO_DATA_MODEL_MATPLOT_IMAGE_DATASIZE__
232        )
233     {
234         // passed by reference, do not free them
235         return;
236     }
237
238     switch (_returnType)
239     {
240         case jni_string:
241         {
242             delete[] (char*) _pvData;
243             return;
244         }
245         case jni_string_vector:
246         {
247             char** data = (char**) _pvData;
248             for (int i = 0; i < numElements; ++i)
249             {
250                 delete[] data[i];
251             }
252             delete[] data;
253             return;
254         }
255         case jni_double:
256         {
257             // passed by value
258             return;
259         }
260         case jni_double_vector:
261         {
262             delete[] (double*) _pvData;
263             return;
264         }
265         case jni_bool:
266         {
267             // passed by value
268             return;
269         }
270         case jni_bool_vector:
271         {
272             delete[] (int*) _pvData;
273             return;
274         }
275         case jni_int:
276         {
277             // passed by value
278             return;
279         }
280         case jni_int_vector:
281         {
282             delete[] (int*) _pvData;
283             return;
284         }
285         default:
286             return;
287     }
288
289 }
290