* Bug #15207 fixed : `xcos(scs_m)` did not work for sub-systems.
[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  * Copyright (C) 2012 - 2016 - Scilab Enterprises
8  *
9  * This file is hereby licensed under the terms of the GNU GPL v2.0,
10  * pursuant to article 5.3.4 of the CeCILL v.2.1.
11  * This file was originally licensed under the terms of the CeCILL v2.1,
12  * and continues to be available under such terms.
13  * For more information, see the COPYING file which you should have received
14  * along with this program.
15  *
16  */
17 /*--------------------------------------------------------------------------*/
18
19 #include <iostream>
20 #include <string>
21 #include <cwchar>
22
23 #include "Xcos.hxx"
24 #include "loadStatus.hxx"
25 #include "view_scilab/Adapters.hxx"
26
27 #include "types.hxx"
28 #include "function.hxx"
29 #include "string.hxx"
30 #include "user.hxx"
31
32 #include "gw_xcos.hxx"
33
34 extern "C" {
35 #include "sci_malloc.h"
36 #include "getFullFilename.h"
37 #include "getScilabJavaVM.h"
38 #include "Scierror.h"
39 #include "localization.h"
40 }
41
42 using namespace org_scilab_modules_xcos;
43 using namespace org_scilab_modules_scicos;
44
45 static int callXcos(char* fname, char* file, long diagramId);
46
47 /*--------------------------------------------------------------------------*/
48 static char funname[] = "xcos";
49
50 types::Function::ReturnValue sci_Xcos(types::typed_list &in, int _iRetCount, types::typed_list &/*out*/)
51 {
52     if (in.size() > 2)
53     {
54         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), funname, 0, 2);
55         return types::Function::Error;
56     }
57
58     if (_iRetCount > 1)
59     {
60         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), funname, 1);
61         return types::Function::Error;
62     }
63
64     /*
65      * xcos() call
66      */
67     if (in.empty())
68     {
69         callXcos(funname, nullptr, ScicosID());
70         return types::Function::OK;
71     }
72
73     /*
74      * xcos("file.zcos") or xcos(["file.zcos" "foo.zcos"]) call
75      */
76     if (in.size() == 1 && in[0]->isString())
77     {
78         types::String* arg1 = in[0]->getAs<types::String>();
79
80         for (int i = 0; i < arg1->getSize(); ++i)
81         {
82             char* c_str = wide_string_to_UTF8(arg1->get(0));
83             char* file = getFullFilename(c_str);
84             FREE(c_str);
85             if (file == nullptr)
86             {
87                 return types::Function::Error;
88             }
89             if (callXcos(funname, file, ScicosID()))
90             {
91                 FREE(file);
92                 return types::Function::Error;
93             }
94             FREE(file);
95         }
96
97         return types::Function::OK;
98     }
99
100     /*
101      * xcos(scs_m) call
102      */
103     if (in.size() == 1 && in[0]->isUserType())
104     {
105         const model::BaseObject* o = view_scilab::Adapters::instance().descriptor(in[0]);
106         if (o == nullptr)
107         {
108             Scierror(77, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 1, "diagram");
109             return types::Function::Error;
110         }
111         if (o->kind() != DIAGRAM && o->kind() != BLOCK)
112         {
113             Scierror(77, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 1, "diagram");
114             return types::Function::Error;
115         }
116
117         if (callXcos(funname, nullptr, static_cast<long>(o->id())))
118         {
119             return types::Function::Error;
120         }
121         return types::Function::OK;
122     }
123
124     //  we finished the 1-argument handling ; short-cut return with a clear error message
125     if (in.size() == 1)
126     {
127         Scierror(999, _("%s: Wrong type for input argument #%d: string or ""%s"" expected.\n"), funname, 1, "diagram");
128         return types::Function::Error;
129     }
130
131
132     /*
133      * xcos("file.zcos", scs_m) call ; load the file into an existing diagram
134      */
135     if (in.size() == 2 &&
136             in[0]->isString() &&
137             in[1]->isUserType())
138     {
139         if (in[0]->getAs<types::String>()->getSize() != 1)
140         {
141             Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), funname, 1);
142             return types::Function::Error;
143         }
144
145         const model::BaseObject* o = view_scilab::Adapters::instance().descriptor(in[1]);
146         if (o == nullptr || o->kind() != DIAGRAM)
147         {
148             Scierror(999, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 2, "diagram");
149             return types::Function::Error;
150         }
151
152         char* c_str = wide_string_to_UTF8(in[0]->getAs<types::String>()->get(0));
153         char* file = getFullFilename(c_str);
154         FREE(c_str);
155         if (file == nullptr)
156         {
157             return types::Function::Error;
158         }
159
160         if (callXcos(funname, file, o->id()))
161         {
162             FREE(file);
163             return types::Function::Error;
164         }
165         FREE(file);
166         return types::Function::OK;
167     }
168
169     /*
170      * If not returned yet, display a generic error message.
171      */
172     Scierror(999, _("%s: Wrong type for input argument #%d: string or ""%s"" expected.\n"), funname, 1, "diagram");
173     return types::Function::Error;
174 }
175 /*--------------------------------------------------------------------------*/
176
177 static int callXcos(char *fname, char* file, long diagramId)
178 {
179     set_loaded_status(XCOS_CALLED);
180
181     try
182     {
183         Xcos::xcos(getScilabJavaVM(), file, diagramId);
184     }
185     catch (GiwsException::JniCallMethodException &exception)
186     {
187         std::cerr << exception.getJavaExceptionName() << std::endl;
188         std::cerr << exception.getJavaDescription() << std::endl;
189         std::cerr << exception.getJavaStackTrace() << std::endl;
190
191         Scierror(999, "%s: %s\n", fname,
192                  exception.getJavaDescription().c_str());
193         return 1;
194     }
195     catch (GiwsException::JniException &exception)
196     {
197         std::cerr << exception.getJavaExceptionName() << std::endl;
198         std::cerr << exception.getJavaDescription() << std::endl;
199         std::cerr << exception.getJavaStackTrace() << std::endl;
200
201         Scierror(999, "%s: %s\n", fname, exception.whatStr().c_str());
202         return 1;
203     }
204     return 0;
205 }
206