JIMS: add jvoid
[scilab.git] / scilab / modules / external_objects / src / cpp / invoke_lu.cpp
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 #include "ScilabGateway.hxx"
14
15 namespace org_modules_external_objects
16 {
17
18 int ScilabGateway::invoke_lu(char * fname, const int envId, void * pvApiCtx)
19 {
20     SciErr err;
21     int typ = 0;
22     int * addr = 0;
23     int * listaddr = 0;
24     int len = 0;
25     int * tmpvar = 0;
26     int idObj = 0;
27     int * args = 0;
28     int * child = 0;
29     char * methName = 0;
30     int * eId;
31     int row, col;
32     int * ret = 0;
33     int nbArgs = 0;
34
35     CheckInputArgument(pvApiCtx, 4, 4);
36
37     err = getVarAddressFromPosition(pvApiCtx, 4, &listaddr);
38     if (err.iErr)
39     {
40         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
41     }
42
43     err = getVarType(pvApiCtx, listaddr, &typ);
44     if (err.iErr)
45     {
46         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
47     }
48
49     if (typ != sci_list)
50     {
51         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: A List expected."), 4);
52     }
53
54     err = getListItemNumber(pvApiCtx, listaddr, &len);
55     if (err.iErr)
56     {
57         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
58     }
59
60     // Get the environment id
61     err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
62     if (err.iErr)
63     {
64         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
65     }
66
67     err = getVarType(pvApiCtx, addr, &typ);
68     if (err.iErr)
69     {
70         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
71     }
72
73     if (typ != sci_ints)
74     {
75         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: An Integer32 expected."), 2);
76     }
77     else
78     {
79         int prec;
80
81         err = getMatrixOfIntegerPrecision(pvApiCtx, addr, &prec);
82         if (err.iErr)
83         {
84             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
85         }
86
87         if (prec != SCI_INT32)
88         {
89             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: An Integer32 expected."), 2);
90         }
91
92         err = getMatrixOfInteger32(pvApiCtx, addr, &row, &col, &eId);
93         if (err.iErr)
94         {
95             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
96         }
97     }
98
99     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(*eId);
100     ScilabGatewayOptions & options = env.getGatewayOptions();
101     OptionsHelper::setCopyOccurred(false);
102     ScilabObjects::initialization(env, pvApiCtx);
103     options.setIsNew(false);
104
105     // Get the object id
106     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
107     if (err.iErr)
108     {
109         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
110     }
111
112     err = getVarType(pvApiCtx, addr, &typ);
113     if (err.iErr)
114     {
115         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
116     }
117
118     if (typ != sci_ints)
119     {
120         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: An Integer32 expected."), 1);
121     }
122     else
123     {
124         int prec;
125         int * id;
126
127         err = getMatrixOfIntegerPrecision(pvApiCtx, addr, &prec);
128         if (err.iErr)
129         {
130             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
131         }
132
133         if (prec != SCI_INT32)
134         {
135             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: An Integer32 expected."), 1);
136         }
137
138         err = getMatrixOfInteger32(pvApiCtx, addr, &row, &col, &id);
139         if (err.iErr)
140         {
141             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
142         }
143
144         idObj = *id;
145     }
146
147     if (idObj == 0)
148     {
149         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Cannot invoke on null object."), __FILE__, __LINE__);
150     }
151
152     tmpvar = new int[len + 1];
153     *tmpvar = 0;
154
155     args = new int[len];
156     nbArgs = len;
157
158     for (int i = 0; i < len; i++)
159     {
160         err = getListItemAddress(pvApiCtx, listaddr, i + 1, &child);
161         if (err.iErr)
162         {
163             delete[] args;
164             ScilabObjects::removeTemporaryVars(*eId, tmpvar);
165             delete[] tmpvar;
166             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
167         }
168
169         try
170         {
171             args[i] = ScilabObjects::getArgumentId(child, tmpvar, false, false, *eId, pvApiCtx);
172         }
173         catch (ScilabAbstractEnvironmentException & e)
174         {
175             delete[] args;
176             delete[] tmpvar;
177             throw;
178         }
179
180         if (args[i] == VOID_OBJECT)
181         {
182             nbArgs = 0;
183         }
184     }
185
186     try
187     {
188         methName = ScilabObjects::getSingleString(3, pvApiCtx);
189     }
190     catch (ScilabAbstractEnvironmentException & e)
191     {
192         delete[] args;
193         ScilabObjects::removeTemporaryVars(*eId, tmpvar);
194         delete[] tmpvar;
195         throw;
196     }
197
198     try
199     {
200         ret = env.invoke(idObj, methName, args, nbArgs);
201     }
202     catch (std::exception & e)
203     {
204         delete[] args;
205         ScilabObjects::removeTemporaryVars(*eId, tmpvar);
206         delete[] tmpvar;
207         freeAllocatedSingleString(methName);
208         throw;
209     }
210
211     delete[] args;
212     ScilabObjects::removeTemporaryVars(*eId, tmpvar);
213     delete[] tmpvar;
214     freeAllocatedSingleString(methName);
215
216     if (!ret || *ret <= 0 || (*ret == 1 && ret[1] == VOID_OBJECT))
217     {
218         if (ret)
219         {
220             delete[] ret;
221         }
222
223         PutLhsVar();
224
225         return 0;
226     }
227
228     for (int i = 1; i <= *ret; i++)
229     {
230         if (!ScilabObjects::unwrap(ret[i], Rhs + i, *eId, pvApiCtx))
231         {
232             try
233             {
234                 ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + i, ret[i], *eId, pvApiCtx);
235             }
236             catch (ScilabAbstractEnvironmentException & e)
237             {
238                 for (int j = 1; j <= *ret; j++)
239                 {
240                     env.removeobject(ret[j]);
241                 }
242                 delete[] ret;
243                 throw;
244             }
245         }
246         else
247         {
248             env.removeobject(ret[i]);
249         }
250
251         LhsVar(i) = Rhs + i;
252     }
253
254     delete[] ret;
255
256     PutLhsVar();
257
258     return 0;
259 }
260 }