626c52784680d22cc4b07367cae0045ca858d62f
[scilab.git] / scilab / modules / external_objects / src / cpp / invoker.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(char * fname, const int envId, ScilabAbstractInvoker & invoker, void * pvApiCtx)
19 {
20     SciErr err;
21     int * tmpvar = 0;
22     int * addr = 0;
23     int * args = 0;
24     int ret = 0;
25
26     CheckOutputArgument(pvApiCtx, 1, 1);
27
28     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
29     ScilabGatewayOptions & options = env.getGatewayOptions();
30     OptionsHelper & helper = env.getOptionsHelper();
31     OptionsHelper::setCopyOccurred(false);
32     ScilabObjects::initialization(env, pvApiCtx);
33     options.setIsNew(false);
34
35     tmpvar = new int[Rhs + 1];
36     *tmpvar = 0;
37     args = new int[Rhs];
38
39     for (int i = 0; i < Rhs; i++)
40     {
41         err = getVarAddressFromPosition(pvApiCtx, i + 1, &addr);
42         if (err.iErr)
43         {
44             delete[] args;
45             ScilabObjects::removeTemporaryVars(envId, tmpvar);
46             delete[] tmpvar;
47             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
48         }
49         try
50         {
51             args[i] = ScilabObjects::getArgumentId(addr, tmpvar, false, false, envId, pvApiCtx);
52         }
53         catch (ScilabAbstractEnvironmentException & e)
54         {
55             delete[] args;
56             delete[] tmpvar;
57             throw;
58         }
59     }
60
61     try
62     {
63         ret = invoker.invoke(args, Rhs);
64     }
65     catch (std::exception & e)
66     {
67         delete[] args;
68         ScilabObjects::removeTemporaryVars(envId, tmpvar);
69         delete[] tmpvar;
70         throw;
71     }
72
73     delete[] args;
74     ScilabObjects::removeTemporaryVars(envId, tmpvar);
75     delete[] tmpvar;
76
77     if (ret == VOID_OBJECT)
78     {
79         PutLhsVar();
80
81         return 0;
82     }
83
84     if (helper.getAutoUnwrap())
85     {
86         if (!ScilabObjects::unwrap(ret, Rhs + 1, envId, pvApiCtx))
87         {
88             try
89             {
90                 ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + 1, ret, envId, pvApiCtx);
91             }
92             catch (ScilabAbstractEnvironmentException & e)
93             {
94                 env.removeobject(ret);
95                 throw;
96             }
97         }
98         else
99         {
100             env.removeobject(ret);
101         }
102     }
103     else
104     {
105         try
106         {
107             ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + 1, ret, envId, pvApiCtx);
108         }
109         catch (ScilabAbstractEnvironmentException & e)
110         {
111             env.removeobject(ret);
112             throw;
113         }
114     }
115
116     LhsVar(1) = Rhs + 1;
117     PutLhsVar();
118
119     return 0;
120 }
121 }