75708f948eda8de4658b37825c2a2c03c3212fea
[scilab.git] / scilab / modules / scicos / sci_gateway / cpp / sci_scicosDiagramToScilab.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) Scilab Enterprises - 2016-2016 - ClĂ©ment DAVID
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  *
14  */
15 /*--------------------------------------------------------------------------*/
16 #include "Controller.hxx"
17 #include "view_scilab/Adapters.hxx"
18 #include "XMIResource.hxx"
19
20 #include "types.hxx"
21 #include "function.hxx"
22 #include "string.hxx"
23 #include "user.hxx"
24 #include "int.hxx"
25
26 #include "gw_scicos.hxx"
27
28 extern "C"
29 {
30 #include "sci_malloc.h"
31 #include "localization.h"
32 #include "Scierror.h"
33 }
34 /*--------------------------------------------------------------------------*/
35 using namespace org_scilab_modules_scicos;
36 /*--------------------------------------------------------------------------*/
37 static char funname[] = "scicosDiagramToScilab";
38 static types::InternalType* importFile(char const* file);
39 static bool exportFile(int index, char const* file, types::InternalType* uid);
40 /*--------------------------------------------------------------------------*/
41 types::Function::ReturnValue sci_scicosDiagramToScilab(types::typed_list &in, int _iRetCount, types::typed_list &out)
42 {
43     /*
44      * to import some files
45      * scs_m = scicosDiagramToScilab("/path/to/a/file")
46      * [scs_m1, scs_m2] = scicosDiagramToScilab(["/path/to/a/file", "/path/to/files"])
47      *
48      * to export a file
49      * scicosDiagramToScilab("/path/to/a/file", scs_m)
50      * scicosDiagramToScilab(["/path/to/a/file", "/path/to/files"], scs_m1, scs_m2)
51      */
52
53     if (in.size() < 1)
54     {
55         Scierror(77, _("%s: Wrong number of input arguments: at least %d expected.\n"), funname, 1);
56         return types::Function::Error;
57     }
58
59     if (!in[0]->isString())
60     {
61         Scierror(77, _("%s: Wrong type for input argument #%d: string expected.\n"), funname, 1);
62         return types::Function::Error;
63     }
64
65     types::String* files = in[0]->getAs<types::String>();
66     if (in.size() == 1 && files->getSize() == _iRetCount)
67     {
68         // the user asked to import
69         out.resize(_iRetCount);
70         for (int i = 0; i < _iRetCount; i++)
71         {
72             char* f = wide_string_to_UTF8(files->get(i));
73             out[i] = importFile(f);
74             FREE(f);
75             if (out[i] == nullptr)
76             {
77                 return types::Function::Error;
78             }
79         }
80     }
81     else if (in.size() == 1 + static_cast<size_t>(files->getSize()) && _iRetCount <= 1)
82     {
83         // the user asked to export
84         for (int i = 0; i < _iRetCount; i++)
85         {
86             if (!in[1 + i]->isUserType())
87             {
88                 Scierror(77, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, "diagram");
89                 return types::Function::Error;
90             }
91         }
92         for (int i = 0; i < _iRetCount; i++)
93         {
94             char* f = wide_string_to_UTF8(files->get(i));
95             bool success = exportFile(1 + i, f, in[1 + i]);
96             FREE(f);
97             if (!success)
98             {
99                 return types::Function::Error;
100             }
101         }
102     }
103     else
104     {
105         // report a comprehensible error message
106         if (in.size() == 1)
107         {
108             Scierror(77, _("%s: Wrong number of output arguments: %d expected.\n"), funname, files->getSize());
109         }
110         else if (in.size() == 1 + static_cast<size_t>(files->getSize()))
111         {
112             Scierror(77, _("%s: Wrong number of output arguments: %d expected.\n"), funname, 0);
113         }
114         else
115         {
116             Scierror(77, _("%s: Wrong number of input arguments: %d expected.\n"), funname, 1);
117         }
118         return types::Function::Error;
119     }
120
121     return types::Function::OK;
122 }
123 /*--------------------------------------------------------------------------*/
124 static types::InternalType* importFile(char const* file)
125 {
126     // create a diagram
127     org_scilab_modules_scicos::Controller controller;
128     ScicosID uid = controller.createObject(DIAGRAM);
129
130     // load it
131     if (XMIResource(uid).load(file) != 0)
132     {
133         Scierror(999, _("%s: Unable to load \"%s\" .\n"), funname, file);
134         return nullptr;
135     }
136
137     types::InternalType* pIT = view_scilab::Adapters::instance().allocate_view(uid, DIAGRAM);
138     return pIT;
139 }
140 /*--------------------------------------------------------------------------*/
141 static bool exportFile(int index, char const* file, types::InternalType* type)
142 {
143     // check that the passed argument is a diagram
144     const model::BaseObject* o = view_scilab::Adapters::instance().descriptor(type);
145     if (o == nullptr || o->kind() != DIAGRAM)
146     {
147         Scierror(77, _("%s: Wrong type for input argument #%d: ""%s"" expected.\n"), funname, index, "diagram");
148         return false;
149     }
150
151     if (XMIResource(o->id()).save(file) < 0)
152     {
153         Scierror(999, _("%s: Unable to save \"%s\" .\n"), funname, file);
154         return false;
155
156     }
157
158     return true;
159 }
160 /*--------------------------------------------------------------------------*/