f8e8fec7350ecd0dbc3210e2d8625d3866c614ac
[scilab.git] / scilab / modules / external_objects / src / cpp / getFields.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::getFields(char * fname, const int envId, void * pvApiCtx)
19 {
20     SciErr err;
21     int * addr = 0;
22     int tmpvar[2] = {0, 0};
23     int row = 0, col = 0;
24     int idObj = 0;
25     ScilabStringStackAllocator * allocator = 0;
26
27     CheckInputArgument(pvApiCtx, 1, 1);
28
29     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
30     ScilabGatewayOptions & options = env.getGatewayOptions();
31     OptionsHelper::setCopyOccured(false);
32     ScilabObjects::initialization(env, pvApiCtx);
33     options.setIsNew(false);
34
35     err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
36     if (err.iErr)
37     {
38         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Invalid variable: cannot retrieve the data"));
39     }
40
41     if (!ScilabObjects::isExternalObjOrClass(addr, pvApiCtx))
42     {
43         throw ScilabAbstractEnvironmentException(__LINE__, __FILE__, gettext("Wrong type for input argument #%d: An External Object expected."), 1);
44     }
45
46     idObj = ScilabObjects::getArgumentId(addr, tmpvar, false, false, envId, pvApiCtx);
47
48     allocator = new ScilabStringStackAllocator(pvApiCtx, Rhs + 1);
49
50     try
51     {
52         env.getaccessiblefields(idObj, *allocator);
53     }
54     catch (std::exception & e)
55     {
56         delete allocator;
57         throw;
58     }
59     delete allocator;
60
61     LhsVar(1) = Rhs + 1;
62     PutLhsVar();
63
64     return 0;
65 }
66 }