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