05c199d05f059659678f7042ad27314032aea6ff
[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 int sci_uiputfile(char *fname, unsigned long fname_len)
41 {
42     int nbRow = 0, nbCol = 0;
43     int nbRow2 = 0, nbCol2 = 0;
44     int nbRow3 = 0, nbCol3 = 0;
45
46     int nbRowOutSelection = 1, nbColOutSelection = 0;
47     int nbRowOutFilterIndex = 1, nbColOutFilterIndex = 1;
48     int nbRowOutPath = 1, nbColOutPath = 1;
49
50     char *optName = NULL;
51
52     char **mask = NULL;
53     char ** description = NULL;
54     char **titleBox = NULL, *selectionPathName = NULL;
55     char ** initialDirectory = NULL;
56     int multipleSelection = 0;
57
58     char **selection = NULL;
59     char **selectionFileNames = NULL;
60     int selectionSize = 0;
61     int filterIndex = 0;
62
63     char *menuCallback = NULL;
64
65     CheckRhs(0,3);
66     CheckLhs(1,3);
67
68     if ((optName = (char*)MALLOC(sizeof(char*)*(strlen("title") + 1))) == NULL)
69     {
70         Scierror(999, _("%s: No more memory.\n"), fname);
71         return 0;
72     }
73
74     //inputs checking
75     /* call uiputfile with 1 arg */
76     if (Rhs >= 1)
77     {
78         if (VarType(1) != sci_strings)
79         {
80             Scierror(999, _("%s: Wrong type for input argument #%d: A string matrix expected.\n"),fname, 1);
81             FREE(optName);
82             return 0;
83         }
84
85         GetRhsVar(1, MATRIX_OF_STRING_DATATYPE, &nbRow, &nbCol, &mask);
86
87         if (nbCol == 1)
88         {
89             // only masks of files are provided
90             description = NULL;
91         }
92         else if (nbCol == 2)
93         {
94             // mask contains both the masks for files and the description of each mask
95             // in the sequence [m1, m2,..., mn, d1, d2,...,dn].
96             // So description is at the middle of the array.
97             description = (char**)MALLOC( sizeof(char*) * nbRow);
98             for (int i = 0;i < nbRow; i++)
99             {
100                 description[i] = strdup(mask[nbRow + i]);
101             }
102         }
103         else
104         {
105             Scierror(999, _("%s: Wrong size for input argument #%d: A string matrix expected.\n"),fname, 1);
106             FREE(optName);
107             return 0;
108         }
109     }
110
111     /* call uiputfile with 2 arg */
112     if (Rhs >= 2)
113     {
114         char *path = NULL;
115
116         if (VarType(2) != sci_strings)
117         {
118             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 2);
119             FREE(optName);
120             return 0;
121         }
122
123         GetRhsVar(2, MATRIX_OF_STRING_DATATYPE, &nbRow2, &nbCol2, &initialDirectory);
124
125         if (nbCol2 != 1 || nbRow2 != 1)
126         {
127             Scierror(999, _("%s: Wrong size for input argument #%d: A string  expected.\n"),fname, 2);
128             FREE(optName);
129             return 0;
130         }
131
132         path = expandPathVariable(initialDirectory[0]);
133         FREE(initialDirectory[0]);
134         initialDirectory[0] = path;
135     }
136
137     /* call uiputfile with 3 arg */
138     if (Rhs >= 3)
139     {
140         if (VarType(3) != sci_strings)
141         {
142             Scierror(999, _("%s: Wrong type for input argument #%d: A string expected.\n"),fname, 3);
143             FREE(optName);
144             return 0;
145         }
146
147         GetRhsVar(3, MATRIX_OF_STRING_DATATYPE, &nbRow3, &nbCol3, &titleBox);
148
149         if (nbCol3 != 1 || nbRow3 != 1)
150         {
151             Scierror(999, _("%s: Wrong size for input argument #%d: A string  expected.\n"),fname, 3);
152             FREE(optName);
153             return 0;
154         }
155     }
156
157     try
158     {
159         /* Call Java */
160         switch (Rhs)
161         {
162         case 0:
163             CallJuiputfileWithoutInput();
164             break;
165
166         case 1:
167             CallJuiputfileOnlyWithMask(mask, description, nbRow);
168             break;
169
170         case 2:
171             CallJuiputfileWithMaskAndInitialdirectory(mask, description, nbRow, initialDirectory[0]);
172             break;
173
174         case 3:
175             CallJuiputfileWithoutMultipleSelection(mask, description, nbRow, initialDirectory[0], titleBox[0]);
176             break;
177
178         default:
179             // never here
180             break;
181         }
182
183         // free pointer
184         freeArrayOfString(description, nbRow);
185         freeArrayOfString(mask, nbRow * nbCol);
186         freeArrayOfString(initialDirectory, nbRow2 * nbCol2);
187         freeArrayOfString(titleBox, nbRow3 * nbCol3);
188
189         // Get return values
190         selection = getJuigetfileSelection();
191         selectionPathName = getJuigetfileSelectionPathName();
192         selectionFileNames = getJuigetfileSelectionFileNames();
193         selectionSize = getJuigetfileSelectionSize();
194         multipleSelection = getJuigetfileMultipleSelection();
195         filterIndex = getJuigetfileFilterIndex();
196         menuCallback = getJuigetfileMenuCallback();
197     }
198     catch (const GiwsException::JniException & e)
199     {
200         Scierror(999, _("%s: A Java exception arised:\n%s"), fname, e.what());
201         return 0;
202     }
203
204     // nbColOutSelection
205     nbColOutSelection = selectionSize;
206
207     //if cancel is selected on the filechooser
208     if (strcmp(selection[0], "") == 0)
209     {
210         nbRowOutSelection = 1;
211         nbColOutSelection = 1;
212
213         // "" is returned as filename
214         CreateVarFromPtr(Rhs + 1, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selection);
215         LhsVar(1) = Rhs + 1 ;
216
217         if (Lhs > 1)
218         {
219             // "" is returned as pathname
220             CreateVarFromPtr(Rhs + 2, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selection);
221             LhsVar(2) = Rhs + 2 ;
222         }
223
224         if (Lhs > 2)
225         {
226             // 0 is returned as pathname
227             double *tmp = (double*)MALLOC(sizeof(double));
228             if (tmp == NULL)
229             {
230                 Scierror(999, _("%s: No more memory.\n"), fname);
231                 return 0;
232             }
233             tmp[0] = 0;
234             CreateVarFromPtr(Rhs + 3, MATRIX_OF_DOUBLE_DATATYPE, &nbRowOutSelection, &nbColOutSelection, &tmp);
235             FREE(tmp); tmp = NULL;
236             LhsVar(3) = Rhs + 3 ;
237         }
238         PutLhsVar();
239         return 0;
240     }
241
242     // Only one output then it contains path+filenames
243     if (Lhs == 1)
244     {
245         CreateVarFromPtr(Rhs + 1, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selection);
246         LhsVar(1) = Rhs + 1 ;
247         PutLhsVar();
248         return 0;
249     }
250
251     // More than one output
252     CreateVarFromPtr(Rhs + 1, MATRIX_OF_STRING_DATATYPE, &nbRowOutSelection, &nbColOutSelection, selectionFileNames);
253
254     nbColOutPath = (int)strlen(selectionPathName);
255     CreateVarFromPtr(Rhs + 2, STRING_DATATYPE, &nbColOutPath,&nbRowOutPath, &selectionPathName);
256
257     LhsVar(1) = Rhs + 1 ;
258     LhsVar(2) = Rhs + 2 ;
259     if (Lhs > 2)
260     {
261         double *tmp = (double*)MALLOC(sizeof(double));
262         if (tmp == NULL)
263         {
264             Scierror(999, _("%s: No more memory.\n"), fname);
265             return 0;
266         }
267         tmp[0] = filterIndex;
268         CreateVarFromPtr(Rhs + 3, MATRIX_OF_DOUBLE_DATATYPE, &nbRowOutFilterIndex, &nbColOutFilterIndex, &tmp);
269         FREE(tmp); tmp = NULL;
270         LhsVar(3) = Rhs + 3 ;
271     }
272
273     PutLhsVar();
274     return 0;
275 }
276 /*--------------------------------------------------------------------------*/