Xcos: fix a memleak merge issue
[scilab.git] / scilab / modules / xcos / sci_gateway / cpp / sci_Xcos.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2010 - DIGITEO - Allan CORNET
4  * Copyright (C) 2012-2015 - Scilab Enterprises - Clement DAVID
5  * Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution.  The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12  *
13  */
14 /*--------------------------------------------------------------------------*/
15
16 #include "Xcos.hxx"
17 #include "loadStatus.hxx"
18 #include "view_scilab/Adapters.hxx"
19
20 #include "types.hxx"
21 #include "function.hxx"
22 #include "string.hxx"
23 #include "gw_xcos.hxx"
24
25 extern "C" 
26 {
27 #include "sci_malloc.h"
28 #include "getFullFilename.h"
29 #include "getScilabJavaVM.h"
30 #include "Scierror.h"
31 #include "localization.h"
32 }
33
34 using namespace org_scilab_modules_xcos;
35 using namespace org_scilab_modules_scicos;
36
37 static int callXcos(char* fname, char* file, long diagramId);
38
39 /*--------------------------------------------------------------------------*/
40 static char funname[] = "xcos";
41
42 types::Function::ReturnValue sci_Xcos(types::typed_list &in, int _iRetCount, types::typed_list &/*out*/)
43 {
44     if (in.size() > 2)
45     {
46         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), funname, 0, 2);
47         return types::Function::Error;
48     }
49
50     if (_iRetCount > 1)
51     {
52         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), funname, 1);
53         return types::Function::Error;
54     }
55
56     /*
57      * xcos() call
58      */
59     if (in.empty())
60     {
61         callXcos(funname, nullptr, ScicosID());
62         return types::Function::OK;
63     }
64
65     /*
66      * xcos("file.zcos") or xcos(["file.zcos" "foo.zcos"]) call
67      */
68     if (in.size() == 1 && in[0]->isString())
69     {
70         types::String* arg1 = in[0]->getAs<types::String>();
71
72         for (int i = 0; i < arg1->getSize(); ++i)
73         {
74             char* c_str = wide_string_to_UTF8(arg1->get(0));
75             char* file = getFullFilename(c_str);
76             FREE(c_str);
77             if (file == nullptr)
78             {
79                 return types::Function::Error;
80             }
81             if (callXcos(funname, file, ScicosID()))
82             {
83                 FREE(file);
84                 return types::Function::Error;
85             }
86             FREE(file);
87         }
88
89         return types::Function::OK;
90     }
91
92     /*
93      * xcos(scs_m) call
94      */
95     if (in.size() == 1 && in[0]->isUserType())
96     {
97         const model::BaseObject* o = view_scilab::Adapters::instance().descriptor(in[0]);
98         if (o == nullptr || o->kind() != DIAGRAM)
99         {
100             Scierror(77, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 1, "diagram");
101             return types::Function::Error;
102         }
103
104         if (callXcos(funname, nullptr, static_cast<long>(o->id())))
105         {
106             return types::Function::Error;
107         }
108         return types::Function::OK;
109     }
110
111     //  we finished the 1-argument handling ; short-cut return with a clear error message
112     if (in.size() == 1)
113     {
114         Scierror(999, _("%s: Wrong type for input argument #%d: string or ""%s"" expected.\n"), funname, 1, "diagram");
115         return types::Function::Error;
116     }
117
118
119     /*
120      * xcos("file.zcos", scs_m) call ; load the file into an existing diagram
121      */
122     if (in.size() == 2 &&
123             in[0]->isString() &&
124             in[1]->isUserType())
125     {
126         if (in[0]->getAs<types::String>()->getSize() != 1)
127         {
128             Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), funname, 1);
129             return types::Function::Error;
130         }
131
132         const model::BaseObject* o = view_scilab::Adapters::instance().descriptor(in[1]);
133         if (o == nullptr || o->kind() != DIAGRAM)
134         {
135             Scierror(999, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 2, "diagram");
136             return types::Function::Error;
137         }
138
139         char* c_str = wide_string_to_UTF8(in[0]->getAs<types::String>()->get(0));
140         char* file = getFullFilename(c_str);
141         FREE(c_str);
142         if (file == nullptr)
143         {
144             return types::Function::Error;
145         }
146
147         if (callXcos(funname, file, o->id()))
148         {
149             FREE(file);
150             return types::Function::Error;
151         }
152
153         FREE(file);
154         return types::Function::OK;
155     }
156     /*
157      * If not returned yet, display a generic error message.
158      */
159     Scierror(999, _("%s: Wrong type for input argument #%d: string or ""%s"" expected.\n"), funname, 1, "diagram");
160     return types::Function::Error;
161 }
162 /*--------------------------------------------------------------------------*/
163
164 static int callXcos(char *fname, char* file, long diagramId)
165 {
166     set_loaded_status(XCOS_CALLED);
167
168     try
169     {
170         Xcos::xcos(getScilabJavaVM(), file, diagramId);
171     }
172     catch (GiwsException::JniCallMethodException &exception)
173     {
174         std::cerr << exception.getJavaExceptionName() << std::endl;
175         std::cerr << exception.getJavaDescription() << std::endl;
176         std::cerr << exception.getJavaStackTrace() << std::endl;
177
178         Scierror(999, "%s: %s\n", fname,
179                  exception.getJavaDescription().c_str());
180         return 1;
181     }
182     catch (GiwsException::JniException &exception)
183     {
184         std::cerr << exception.getJavaExceptionName() << std::endl;
185         std::cerr << exception.getJavaDescription() << std::endl;
186         std::cerr << exception.getJavaStackTrace() << std::endl;
187
188         Scierror(999, "%s: %s\n", fname, exception.whatStr().c_str());
189         return 1;
190     }
191     return 0;
192 }
193