external_objects_java: fix crash on ScilabJavaEnvironment when used as a local variable
[scilab.git] / scilab / modules / external_objects_java / sci_gateway / cpp / sci_jconvMatrixMethod.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  * Copyright (C) 2013 - Scilab Enterprises - Sylvestre Ledru
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13
14 #include "ScilabJavaEnvironment.hxx"
15 #include "ScilabGateway.hxx"
16
17 extern "C" {
18 #include "warningmode.h"
19 #include "Scierror.h"
20 #include "gw_external_objects_java.h"
21 }
22
23 using namespace org_scilab_modules_external_objects_java;
24 using namespace org_modules_external_objects;
25
26 int sci_jconvMatrixMethod(char * fname, unsigned long fname_len)
27 {
28     int envId;
29     char * type = 0;
30
31     CheckInputArgument(pvApiCtx, 0, 1);
32     CheckOutputArgument(pvApiCtx, 1, 1);
33     if (getWarningMode())
34     {
35         sciprint(_("%s: Function %s is obsolete.\n"), _("Warning"), fname);
36         sciprint(_("%s: Please see documentation for more details.\n"), _("Warning"));
37         sciprint(_("%s: This function will be permanently removed in Scilab %s\n\n"), _("Warning"), "6.0.0");
38     }
39
40     envId = ScilabJavaEnvironment::start();
41     JavaOptionsSetter setter = ScilabJavaEnvironment::getInstance()->getOptionsHelper().getSetter(JavaOptionsSetter::METHODOFCONV);
42     ScilabAbstractEnvironment & env = ScilabEnvironments::getEnvironment(envId);
43     ScilabGatewayOptions & options = env.getGatewayOptions();
44     OptionsHelper::setCopyOccurred(false);
45     ScilabObjects::initialization(env, pvApiCtx);
46     options.setIsNew(false);
47
48     if (Rhs == 0)
49     {
50         const char * order = setter.get() ? "rc" : "cr";
51         createMatrixOfString(pvApiCtx, Rhs + 1, 1, 1, &order);
52
53         LhsVar(1) = 1;
54         PutLhsVar();
55
56         return 0;
57     }
58
59     try
60     {
61         type = ScilabObjects::getSingleString(Rhs, pvApiCtx);
62     }
63     catch (const std::exception & e)
64     {
65         Scierror(999, "%s: String \"rc\" or \"cr\" expected.", fname);
66         return 0;
67     }
68
69     if (!strcmp(type, "rc"))
70     {
71         setter.set(true);
72     }
73     else if (!strcmp(type, "cr"))
74     {
75         setter.set(false);
76     }
77     else
78     {
79         delete type;
80         Scierror(999, "%s: Invalid string: \"rc\" or \"cr\" expected.", fname);
81         return 0;
82     }
83
84     delete type;
85
86     LhsVar(1) = 0;
87     PutLhsVar();
88
89     return 0;
90 }