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