Update of the getURL test due to the recent changes
[scilab.git] / scilab / modules / fileio / sci_gateway / c / sci_getURL.c
1 /*
2  * Copyright (C) 2011 - DIGITEO - Sylvestre LEDRU
3  * Copyright (C) 2013 - Scilab Enterprises - Sylvestre LEDRU
4  * Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
11  *
12  */
13 #include <stdio.h>
14 #include "sciprint.h"
15 #include "api_scilab.h"
16 #include "Scierror.h"
17 #include "MALLOC.h"
18 #include "dlManager.h"
19 #include "localization.h"
20 /* ==================================================================== */
21 static void freeAllocatedStrings(char *url, char *dest, char *username, char *password, char* content);
22 /* ==================================================================== */
23 int sci_getURL(char *fname, int fname_len)
24 {
25     SciErr sciErr;
26     int length = 0;
27
28     int *piAddr = NULL;
29     char *url = NULL;
30     char *dest = NULL;
31     char *username = NULL;
32     char *password = NULL;
33     char *content = NULL;
34
35     int iRows = 0, iCols = 0;
36     int iType = 0;
37     int *piAddressVarOne = NULL;
38     int ret = 0;
39     char *filePath = NULL;
40
41     int iRhs = nbInputArgument(pvApiCtx);
42
43     CheckInputArgument(pvApiCtx, 1, 4);
44     CheckOutputArgument(pvApiCtx, 0, 2);
45
46
47     sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddressVarOne);
48     if (sciErr.iErr)
49     {
50         printError(&sciErr, 0);
51         return 0;
52     }
53
54     ret = getAllocatedSingleString(pvApiCtx, piAddressVarOne, &url);
55     if (ret)
56     {
57         Scierror(999, _("%s: Wrong type for argument %d: A string expected.\n"), fname, 1);
58         freeAllocatedStrings(url, dest, username, password, content);
59         return 0;
60     }
61
62     if (iRhs > 1)
63     {
64         /* Specify the destination */
65         int *piAddressVarTwo = NULL;
66
67         sciErr = getVarAddressFromPosition(pvApiCtx, 2, &piAddressVarTwo);
68         if (sciErr.iErr)
69         {
70             printError(&sciErr, 0);
71             freeAllocatedStrings(url, dest, username, password, content);
72             return 0;
73         }
74
75         ret = getAllocatedSingleString(pvApiCtx, piAddressVarTwo, &dest);
76         if (ret)
77         {
78             Scierror(999, _("%s: Wrong type for argument %d: A string expected.\n"), fname, 2);
79             freeAllocatedStrings(url, dest, username, password, content);
80             return 0;
81         }
82
83     }
84     if (iRhs > 2)
85     {
86         /* Specify the username */
87         int *piAddressVarThree = NULL;
88
89         sciErr = getVarAddressFromPosition(pvApiCtx, 3, &piAddressVarThree);
90         if (sciErr.iErr)
91         {
92             printError(&sciErr, 0);
93             freeAllocatedStrings(url, dest, username, password, content);
94             return 0;
95         }
96
97         ret = getAllocatedSingleString(pvApiCtx, piAddressVarThree, &username);
98         if (ret)
99         {
100             Scierror(999, _("%s: Wrong type for argument %d: A string expected.\n"), fname, 3);
101             freeAllocatedStrings(url, dest, username, password, content);
102             return 0;
103         }
104
105     }
106
107     if (iRhs > 3)
108     {
109         /* Specify the password */
110         int *piAddressVarFour = NULL;
111
112         sciErr = getVarAddressFromPosition(pvApiCtx, 4, &piAddressVarFour);
113         if (sciErr.iErr)
114         {
115             printError(&sciErr, 0);
116             freeAllocatedStrings(url, dest, username, password, content);
117             return 0;
118         }
119
120         ret = getAllocatedSingleString(pvApiCtx, piAddressVarFour, &password);
121         if (ret)
122         {
123             Scierror(999, _("%s: Wrong type for argument %d: A string expected.\n"), fname, 4);
124             freeAllocatedStrings(url, dest, username, password, content);
125             return 0;
126         }
127
128     }
129
130     /* Set to NULL if 0 length strings */
131     if (url != NULL && strlen(url) == 0)
132     {
133         url = NULL;
134     }
135
136     if (dest != NULL && strlen(dest) == 0)
137     {
138         dest = NULL;
139     }
140
141     if (username != NULL && strlen(username) == 0)
142     {
143         username = NULL;
144     }
145
146     if (password != NULL && strlen(password) == 0)
147     {
148         password = NULL;
149     }
150
151     // call function
152     filePath = downloadFile(url, dest, username, password, &content);
153     if (filePath != NULL)
154     {
155         //create new variable
156         ret = createSingleString(pvApiCtx, iRhs + 1, filePath);
157         FREE(filePath);
158         filePath = NULL;
159         if (ret)
160         {
161             Scierror(999, _("%s: Could not create the output argument.\n"));
162             freeAllocatedStrings(url, dest, username, password, content);
163             return 0;
164         }
165     }
166     // call function
167     /* Return the second argument which is the content */
168     if (content != NULL && nbOutputArgument(pvApiCtx) == 2)
169     {
170         //create new variable with the content
171         int res = createSingleString(pvApiCtx, iRhs + 2, content);
172         FREE(content);
173         content = NULL;
174         if (res)
175         {
176             Scierror(999, _("%s: Could not create the output argument.\n"));
177             freeAllocatedStrings(url, dest, username, password, content);
178             return 0;
179         }
180     }
181
182     AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
183     AssignOutputVariable(pvApiCtx, 2) = iRhs + 2;
184     ReturnArguments(pvApiCtx);
185     return 0;
186 }
187 /* ==================================================================== */
188 static void freeAllocatedStrings(char *url, char *dest, char *username, char *password, char* content)
189 {
190     if (url != NULL)
191     {
192         freeAllocatedSingleString(url);
193     }
194
195     if (dest != NULL)
196     {
197         freeAllocatedSingleString(dest);
198     }
199
200     if (username != NULL)
201     {
202         freeAllocatedSingleString(username);
203     }
204
205     if (password != NULL)
206     {
207         freeAllocatedSingleString(password);
208     }
209
210     if (content != NULL)
211     {
212         freeAllocatedSingleString(content);
213     }
214 }
215