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