114fc726999aaaff956bf5451b8dea5a9aa70946
[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 || o->kind() != DIAGRAM)
107         {
108             Scierror(77, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 1, "diagram");
109             return types::Function::Error;
110         }
111
112         if (callXcos(funname, nullptr, static_cast<long>(o->id())))
113         {
114             return types::Function::Error;
115         }
116         return types::Function::OK;
117     }
118
119     //  we finished the 1-argument handling ; short-cut return with a clear error message
120     if (in.size() == 1)
121     {
122         Scierror(999, _("%s: Wrong type for input argument #%d: string or ""%s"" expected.\n"), funname, 1, "diagram");
123         return types::Function::Error;
124     }
125
126
127     /*
128      * xcos("file.zcos", scs_m) call ; load the file into an existing diagram
129      */
130     if (in.size() == 2 &&
131             in[0]->isString() &&
132             in[1]->isUserType())
133     {
134         if (in[0]->getAs<types::String>()->getSize() != 1)
135         {
136             Scierror(999, _("%s: Wrong size for input argument #%d: string expected.\n"), funname, 1);
137             return types::Function::Error;
138         }
139
140         const model::BaseObject* o = view_scilab::Adapters::instance().descriptor(in[1]);
141         if (o == nullptr || o->kind() != DIAGRAM)
142         {
143             Scierror(999, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, 2, "diagram");
144             return types::Function::Error;
145         }
146
147         char* c_str = wide_string_to_UTF8(in[0]->getAs<types::String>()->get(0));
148         char* file = getFullFilename(c_str);
149         FREE(c_str);
150         if (file == nullptr)
151         {
152             return types::Function::Error;
153         }
154
155         if (callXcos(funname, file, o->id()))
156         {
157             FREE(file);
158             return types::Function::Error;
159         }
160         FREE(file);
161         return types::Function::OK;
162     }
163
164     /*
165      * If not returned yet, display a generic error message.
166      */
167     Scierror(999, _("%s: Wrong type for input argument #%d: string or ""%s"" expected.\n"), funname, 1, "diagram");
168     return types::Function::Error;
169 }
170 /*--------------------------------------------------------------------------*/
171
172 static int callXcos(char *fname, char* file, long diagramId)
173 {
174     set_loaded_status(XCOS_CALLED);
175
176     try
177     {
178         Xcos::xcos(getScilabJavaVM(), file, diagramId);
179     }
180     catch (GiwsException::JniCallMethodException &exception)
181     {
182         std::cerr << exception.getJavaExceptionName() << std::endl;
183         std::cerr << exception.getJavaDescription() << std::endl;
184         std::cerr << exception.getJavaStackTrace() << std::endl;
185
186         Scierror(999, "%s: %s\n", fname,
187                  exception.getJavaDescription().c_str());
188         return 1;
189     }
190     catch (GiwsException::JniException &exception)
191     {
192         std::cerr << exception.getJavaExceptionName() << std::endl;
193         std::cerr << exception.getJavaDescription() << std::endl;
194         std::cerr << exception.getJavaStackTrace() << std::endl;
195
196         Scierror(999, "%s: %s\n", fname, exception.whatStr().c_str());
197         return 1;
198     }
199     return 0;
200 }
201