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