a384867e20eac3b824756cd6db4a84e5f719c1aa
[scilab.git] / scilab / modules / external_objects / src / cpp / newInstance.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 extern "C" {
16 #include "scicurdir.h"
17 }
18
19 namespace org_modules_external_objects
20 {
21
22 int ScilabGateway::newInstance(char * fname, const int envId, void * pvApiCtx)
23 {
24     SciErr err;
25     int * addr = 0;
26     int idClass = 0;
27     int * tmpvar = 0;
28     int * args = 0;
29     int ret = 0;
30     char * className = 0;
31     int error = 0;
32     char * cwd = 0;
33
34     if (Rhs == 0)
35     {
36         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong number of arguments : more than 1 argument expected"));
37     }
38
39     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
40     ScilabGatewayOptions & options = env.getGatewayOptions();
41     OptionsHelper & helper = env.getOptionsHelper();
42     OptionsHelper::setCopyOccurred(false);
43     ScilabObjects::initialization(env, pvApiCtx);
44     options.setIsNew(false);
45
46     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
47     if (err.iErr)
48     {
49         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
50     }
51
52     cwd = scigetcwd(&error);
53     if (error)
54     {
55         FREE(cwd);
56         cwd = 0;
57     }
58
59     if (isStringType(pvApiCtx, addr))
60     {
61         className = ScilabObjects::getSingleString(1, pvApiCtx);
62         try
63         {
64             idClass = env.loadclass(className, cwd, false, helper.getAllowReload());
65         }
66         catch (std::exception & e)
67         {
68             FREE(cwd);
69             freeAllocatedSingleString(className);
70             throw;
71         }
72         FREE(cwd);
73         freeAllocatedSingleString(className);
74     }
75     else if (ScilabObjects::isExternalClass(addr, pvApiCtx))
76     {
77         idClass = ScilabObjects::getArgumentId(addr, 0, false, true, envId, pvApiCtx);
78     }
79
80     tmpvar = new int[Rhs];
81     *tmpvar = 0;
82     args = new int[Rhs - 1];
83
84     for (int i = 0; i < Rhs - 1; i++)
85     {
86         err = getVarAddressFromPosition(pvApiCtx, i + 2, &addr);
87         if (err.iErr)
88         {
89             delete[] args;
90             ScilabObjects::removeTemporaryVars(envId, tmpvar);
91             delete[] tmpvar;
92             throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
93         }
94         try
95         {
96             args[i] = ScilabObjects::getArgumentId(addr, tmpvar, false, false, envId, pvApiCtx);
97         }
98         catch (ScilabAbstractEnvironmentException & e)
99         {
100             delete[] args;
101             delete[] tmpvar;
102             throw;
103         }
104     }
105
106     try
107     {
108         ret = env.newinstance(idClass, args, Rhs - 1);
109     }
110     catch (std::exception & e)
111     {
112         delete[] args;
113         ScilabObjects::removeTemporaryVars(envId, tmpvar);
114         delete[] tmpvar;
115         throw;
116     }
117
118     delete[] args;
119     ScilabObjects::removeTemporaryVars(envId, tmpvar);
120     delete[] tmpvar;
121
122     try
123     {
124         ScilabObjects::createEnvironmentObjectAtPos(EXTERNAL_OBJECT, Rhs + 1, ret, envId, pvApiCtx);
125     }
126     catch (ScilabAbstractEnvironmentException & e)
127     {
128         env.removeobject(ret);
129         throw;
130     }
131
132     LhsVar(1) = Rhs + 1;
133     PutLhsVar();
134
135     return 0;
136 }
137 }