With release 1.3.0 of giws (fixes some various issues)
[scilab.git] / scilab / modules / gui / sci_gateway / cpp / sci_uiputfile.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009 - DIGITEO - Vincent COUVERT
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 /*------------------------------------------------------------------------*/
14 /* file: sci_uiputfile.cpp                                                */
15 /* desc : interface for uiputfile routine                                 */
16 /*------------------------------------------------------------------------*/
17 #include "CallJuigetfile.hxx"
18 #include "GiwsException.hxx"
19
20 extern "C"
21 {
22 #include <string.h>
23 #include <stdio.h>
24 #include "gw_gui.h"
25 #include "PATH_MAX.h"
26 #include "stack-c.h"
27 #include "MALLOC.h"
28 #include "localization.h"
29 #include "Scierror.h"
30 #include "expandPathVariable.h"
31 #include "freeArrayOfString.h"
32 #ifdef _MSC_VER
33 #include "strdup_windows.h"
34 #endif
35 #include "BOOL.h"
36 }
37 using namespace org_scilab_modules_gui_filechooser;
38
39 /*--------------------------------------------------------------------------*/
40
41 int sci_uiputfile(char *fname, unsigned long fname_len)
42 {
43     int nbRow = 0, nbCol = 0;
44     int nbRow2 = 0, nbCol2 = 0;
45     int nbRow3 = 0, nbCol3 = 0;
46
47     int nbRowOutSelection = 1, nbColOutSelection = 0;
48     int nbRowOutFilterIndex = 1, nbColOutFilterIndex = 1;
49     int nbRowOutPath = 1, nbColOutPath = 1;
50
51     char *optName = NULL;
52
53     char **mask = NULL;
54     char **description = NULL;
55     char **titleBox = NULL, *selectionPathName = NULL;
56     char **initialDirectory = NULL;
57     int multipleSelection = 0;
58
59     char **selection = NULL;
60     char **selectionFileNames = NULL;
61     int selectionSize = 0;
62     int filterIndex = 0;
63
64     char *menuCallback = NULL;
65
66     CheckRhs(0, 3);
67     CheckLhs(1, 3);
68
69     if ((optName = (char *)MALLOC(sizeof(char *) * (strlen("title") + 1))) == NULL)
70     {
71         Scierror(999, _("%s: No more memory.\n"), fname);
72         return 0;
73     }
74
75     //inputs checking
76     /* call uiputfile with 1 arg */
77     if (Rhs >= 1)
78     {
79         if (VarType(1) != sci_strings)
80         {
81             Scierror(999, _("%s: Wrong type for input argument #%d: A string matrix expected.\n"), fname, 1);
82             FREE(optName);
83             return 0;
84         }
85
86         GetRhsVar(1, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &mask);
87
88         if (nbCol == 1)
89         {
90             // only masks of files are provided
91             description = NULL;
92         }
93         else if (nbCol == 2)
94         {
95             // mask contains both the masks for files and the description of each mask
96             // in the sequence [m1, m2,..., mn, d1, d2,...,dn].
97             // So description is at the middle of the array.
98             description = (char **)MALLOC(sizeof(char *) * nbRow);
99             for (int i = 0; i < nbRow; i++)
100             {
101                 description[i] = strdup(mask[nbRow + i]);
102             }
103         }
104         else
105         {
106             Scierror(999, _("%s: Wrong size for input argument #%d: A string matrix expected.\n"), fname, 1);
107             FREE(optName);
108             return 0;
109         }
110     }
111
112     /* call uiputfile with 2 arg */
113     if (Rhs >= 2)
114     {
115         char *path = NULL;
116
117         if (VarType(2) != sci_strings)
118         {
119             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 2);
120             FREE(optName);
121             return 0;
122         }
123
124         GetRhsVar(2, MATRIX_OF_STRING_DATATYPE, &nbRow2, &nbCol2, &initialDirectory);
125
126         if (nbCol2 != 1 || nbRow2 != 1)
127         {
128             Scierror(999, _("%s: Wrong size for input argument #%d: A string  expected.\n"), fname, 2);
129             FREE(optName);
130             return 0;
131         }
132
133         path = expandPathVariable(initialDirectory[0]);
134         FREE(initialDirectory[0]);
135         initialDirectory[0] = path;
136     }
137
138     /* call uiputfile with 3 arg */
139     if (Rhs >= 3)
140     {
141         if (VarType(3) != sci_strings)
142         {
143             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"), fname, 3);
144             FREE(optName);
145             return 0;
146         }
147
148         GetRhsVar(3, MATRIX_OF_STRING_DATATYPE, &nbRow3, &nbCol3, &titleBox);
149
150         if (nbCol3 != 1 || nbRow3 != 1)
151         {
152             Scierror(999, _("%s: Wrong size for input argument #%d: A string  expected.\n"), fname, 3);
153             FREE(optName);
154             return 0;
155         }
156     }
157
158     try
159     {
160         /* Call Java */
161         switch (Rhs)
162         {
163         case 0:
164             CallJuiputfileWithoutInput();
165             break;
166
167         case 1:
168             CallJuiputfileOnlyWithMask(mask, description, nbRow);
169             break;
170
171         case 2:
172             CallJuiputfileWithMaskAndInitialdirectory(mask, description, nbRow, initialDirectory[0]);
173             break;
174
175         case 3:
176             CallJuiputfileWithoutMultipleSelection(mask, description, nbRow, initialDirectory[0], titleBox[0]);
177             break;
178
179         default:
180             // never here
181             break;
182         }
183
184         // free pointer
185         freeArrayOfString(description, nbRow);
186         freeArrayOfString(mask, nbRow * nbCol);
187         freeArrayOfString(initialDirectory, nbRow2 * nbCol2);
188         freeArrayOfString(titleBox, nbRow3 * nbCol3);
189
190         // Get return values
191         selection = getJuigetfileSelection();
192         selectionPathName = getJuigetfileSelectionPathName();
193         selectionFileNames = getJuigetfileSelectionFileNames();
194         selectionSize = getJuigetfileSelectionSize();
195         multipleSelection = getJuigetfileMultipleSelection();
196         filterIndex = getJuigetfileFilterIndex();
197         menuCallback = getJuigetfileMenuCallback();
198     }
199     catch(const GiwsException::JniException & e)
200     {
201         Scierror(999, _("%s: A Java exception arised:\n%s"), fname, e.whatStr().c_str());
202         return 0;
203     }
204
205     // nbColOutSelection
206     nbColOutSelection = selectionSize;
207
208     //if cancel is selected on the filechooser
209     if (strcmp(selection[0], "") == 0)
210     {
211         nbRowOutSelection = 1;
212         nbColOutSelection = 1;
213
214         // "" is returned as filename
215         CreateVarFromPtr(Rhs + 1, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selection);
216         LhsVar(1) = Rhs + 1;
217
218         if (Lhs > 1)
219         {
220             // "" is returned as pathname
221             CreateVarFromPtr(Rhs + 2, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selection);
222             LhsVar(2) = Rhs + 2;
223         }
224
225         if (Lhs > 2)
226         {
227             // 0 is returned as pathname
228             double *tmp = (double *)MALLOC(sizeof(double));
229
230             if (tmp == NULL)
231             {
232                 Scierror(999, _("%s: No more memory.\n"), fname);
233                 return 0;
234             }
235             tmp[0] = 0;
236             CreateVarFromPtr(Rhs + 3, MATRIX_OF_DOUBLE_DATATYPE, &nbRowOutSelection, &nbColOutSelection, &tmp);
237             FREE(tmp);
238             tmp = NULL;
239             LhsVar(3) = Rhs + 3;
240         }
241         PutLhsVar();
242         return 0;
243     }
244
245     // Only one output then it contains path+filenames
246     if (Lhs == 1)
247     {
248         CreateVarFromPtr(Rhs + 1, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selection);
249         LhsVar(1) = Rhs + 1;
250         PutLhsVar();
251         return 0;
252     }
253
254     // More than one output
255     CreateVarFromPtr(Rhs + 1, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selectionFileNames);
256
257     nbColOutPath = (int)strlen(selectionPathName);
258     CreateVarFromPtr(Rhs + 2, STRING_DATATYPE, &nbColOutPath, &nbRowOutPath, &selectionPathName);
259
260     LhsVar(1) = Rhs + 1;
261     LhsVar(2) = Rhs + 2;
262     if (Lhs > 2)
263     {
264         double *tmp = (double *)MALLOC(sizeof(double));
265
266         if (tmp == NULL)
267         {
268             Scierror(999, _("%s: No more memory.\n"), fname);
269             return 0;
270         }
271         tmp[0] = filterIndex;
272         CreateVarFromPtr(Rhs + 3, MATRIX_OF_DOUBLE_DATATYPE, &nbRowOutFilterIndex, &nbColOutFilterIndex, &tmp);
273         FREE(tmp);
274         tmp = NULL;
275         LhsVar(3) = Rhs + 3;
276     }
277
278     PutLhsVar();
279     return 0;
280 }
281
282 /*--------------------------------------------------------------------------*/