13e3d8e86ab67a8c3fc54b50dbc40cd92bc19349
[scilab.git] / scilab / modules / atoms / macros / atoms_internals / atomsDownload.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
3 // Copyright (C) 2011 - DIGITEO - Allan CORNET
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.1-en.txt
10
11 // Internal function
12
13 function atomsDownload(url_in,file_out,md5sum)
14
15     // Operating system detection + Architecture detection
16     // =========================================================================
17     [OSNAME, ARCH, LINUX, MACOSX, SOLARIS,BSD] = atomsGetPlatform();
18
19     // Check input parameters number
20     // =========================================================================
21     rhs  = argn(2);
22
23     if rhs < 2 | rhs > 3 then
24         error(msprintf(gettext("%s: Wrong number of input argument: %d to %d expected.\n"), "atomsDownload", 2, 3));
25     end
26
27     // Check input parameters type
28     // =========================================================================
29     if type(url_in) <> 10 then
30         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"), "atomsDownload", 1));
31     end
32
33     if type(file_out) <> 10 then
34         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"), "atomsDownload", 2));
35     end
36
37     if (rhs>2) & (type(md5sum) <> 10) then
38         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"), "atomsDownload", 3));
39     end
40
41     // Check input parameters size
42     // =========================================================================
43
44     if size(url_in, "*") <> 1 then
45         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"atomsDownload",1));
46     end
47
48     if size(file_out, "*") <> 1 then
49         error(msprintf(gettext("%s: Wrong size for input argument #%d: Single string expected.\n"),"atomsDownload",2));
50     end
51
52     if (rhs>2) & (size(md5sum,"*") <> 1) then
53         error(msprintf(gettext("%s: Wrong type for input argument #%d: Single string expected.\n"),"atomsDownload",3));
54     end
55
56     // Check input parameters value
57     // =========================================================================
58
59     if regexp(url_in,"/^(https?|ftp|file):\/\//","o") <> 1 then
60         error(msprintf(gettext("%s: Wrong value for input argument #%d: String that starts with ''http(s)?://'',''ftp://'' or ''file://'' expected.\n"),"atomsDownload",1));
61     end
62
63     if (rhs>2) & (length(md5sum)<>32) then
64         error(msprintf(gettext("%s: Wrong length for input argument #%d: String which has 32-characters length expected.\n"),"atomsDownload",3));
65     end
66
67     // curl, wget or httpdownload
68     // =========================================================================
69
70     CURL     = %F;
71     WGET     = %F;
72     HTTPDOWNLOAD = %F;
73
74     // Maybe the detection has already been done
75
76     if atomsGetConfig("downloadTool") == "wget" then
77         WGET = %T;
78     elseif atomsGetConfig("downloadTool") == "curl" then
79         CURL = %T;
80     elseif atomsGetConfig("downloadTool") == "httpdownload" & getos() == "Windows" then
81         HTTPDOWNLOAD = %T;
82     else
83         // Default values according to platform
84         if LINUX | SOLARIS | BSD then
85
86             // Need to detect under Linux platforms
87             [rep, stat, err] = unix_g("wget --version");
88
89             if stat == 0 then
90                 WGET = %T;
91                 atomsSetConfig("downloadTool", "wget");
92             else
93                 [rep, stat, err] = unix_g("curl --version");
94                 if stat == 0 then
95                     CURL = %T;
96                     atomsSetConfig("downloadTool", "curl");
97                 else
98                     error(msprintf(gettext("%s: Neither Wget or Curl found: Please install one of them\n"), "atomsDownload"));
99                 end
100             end
101         elseif MACOSX | getos() == "Windows" then
102             CURL = %T;
103             atomsSetConfig("downloadTool", "curl");
104         end
105     end
106
107     // Build the command
108     // =========================================================================
109
110     if regexp(url_in, "/^(https?|ftp):\/\//", "o") == 1 then
111         proxy_host_arg = "";
112         proxy_user_arg = "";
113         timeout_arg  = "";
114
115         // Timeout configuration
116         if CURL then
117             // Curl
118             timeout_arg = " --connect-timeout ";
119         else
120             // wget
121             timeout_arg = " --timeout=";
122         end
123
124         timeout = strtod(atomsGetConfig("downloadTimeout"));
125
126         if ~isnan(timeout) then // Value found in config file
127             timeout_arg = timeout_arg + string(timeout);
128         else // Default timeout
129             timeout_arg = timeout_arg + "5";
130         end
131
132         timeout_arg = timeout_arg + " ";
133
134         // Proxy configuration
135         if (atomsGetConfig("useProxy") == "True") & (atomsGetConfig("proxyHost") <> "") then
136             // Host
137             proxy_host = atomsGetConfig("proxyHost");
138
139             // Port
140             if atomsGetConfig("proxyPort") <> "" then
141                 proxy_host =  proxy_host + ":" + atomsGetConfig("proxyPort");
142             end
143
144             // Host/port Argument
145             if CURL then
146                 // Curl
147                 proxy_host_arg = " --proxy "+ proxy_host;
148             else
149                 // wget
150                 proxy_host_arg = " http_proxy="""+proxy_host+""" ";
151             end
152
153             // Username/Password
154             if and([atomsGetConfig("proxyUser");atomsGetConfig("proxyPassword")]<> "") then
155                 if CURL then
156                     // Curl
157                     proxy_user_arg = " --proxy-user "+atomsGetConfig("proxyUser")+":"+atomsGetConfig("proxyPassword");
158                 else
159                     // wget
160                     proxy_user_arg = " --proxy-user="""+atomsGetConfig("proxyUser")+""" --proxy-password="""+atomsGetConfig("proxyPassword")+"""";
161                 end
162             end
163
164         end
165
166         if WGET & atomsGetConfig("useProxy") == "False" then
167             proxy_user_arg = " --no-proxy";
168         end
169
170
171         if getos() == "Windows" & CURL then
172             download_cmd = """" + pathconvert(SCI+"/tools/curl/curl.exe",%F) + """" + proxy_host_arg + proxy_user_arg + timeout_arg + " -s """ + url_in + """ -o """ + file_out + """";
173         elseif CURL then
174             // curl
175             download_cmd = "curl "+proxy_host_arg+proxy_user_arg+timeout_arg+" -s "+url_in + " -o " + file_out;
176         else
177             // wget
178             download_cmd = proxy_host_arg+"wget"+proxy_user_arg+timeout_arg+" "+url_in + " -O " + file_out;
179         end
180
181         winId = atomsOpenProgressBar(_("Download in progress... Please be patient."), %f);
182
183         err = [];
184         [rep,stat,err] = unix_g(download_cmd);
185
186         // Second try with httpdownload
187         if ( HTTPDOWNLOAD | stat<>0 ) & (getos() == "Windows") then
188             imode = ilib_verbose();
189             ilib_verbose(0) ;
190             id  = link(SCI+"/bin/windows_tools.dll","httpdownload","c");
191             stat  = call("httpdownload", url_in, 1, "c", file_out, 2, "c", "out", [1,1], 3, "d");
192             ulink(id);
193             ilib_verbose(imode);
194
195             // Save the parameter to always download with httpdownload
196             if stat == 0 then
197                 atomsSetConfig("downloadTool","httpdownload");
198             else
199                 select stat,
200                 case -1 then mprintf(gettext("%s: Error: the response status from the URL %s is invalid.\n"), "atomsDownload", url_in),
201                 case -2 then mprintf(gettext("%s: Error while opening an Internet connection.\n"), "atomsDownload"),
202                 case -3 then mprintf(gettext("%s: Error while opening the URL %s.\n"), "atomsDownload", url_in),
203                 case -4 then mprintf(gettext("%s: Error while creating the file %s on disk.\n"), "atomsDownload", file_out),
204                 case -5 then mprintf(gettext("%s: Error while retrieving the size of file at URL %s.\n"), "atomsDownload", url_in),
205                 case -6 then mprintf(gettext("%s: Error while reading the file from the URL %s.\n"), "atomsDownload", url_in),
206                 case -7 then mprintf(gettext("%s: Error while writing the file %s on disk.\n"), "atomsDownload", file_out),
207                 case -8 then mprintf(gettext("%s: Error while downloading the file from the URL %s.\n"), "atomsDownload", url_in),
208                 case -9 then mprintf(gettext("%s: Error: out of memory.\n"), "atomsDownload"),
209                 end
210             end
211         end
212
213         if stat <> 0 then
214             mprintf(gettext("%s: The following file hasn''t been downloaded:\n"), "atomsDownload");
215             mprintf(gettext("\t - URL      : ''%s''\n"), url_in);
216             mprintf(gettext("\t - Local location : ''%s''\n"), file_out);
217             if isdef("err") then
218                 atomsCloseProgressBar(winId);
219                 error(strcat(err, ascii(10)));
220             end
221         end
222
223     elseif regexp(url_in,"/^file:\/\//","o") == 1 then
224
225         if getos() == "Windows" then
226             url_pattern = "file:///";
227         else
228             url_pattern = "file://";
229         end
230
231         file_in = pathconvert(part(url_in,length(url_pattern)+1:length(url_in)),%F);
232
233         if copyfile(file_in,file_out) <> 1 then
234             mprintf(gettext("%s: The following file has not been copied:\n"),"atomsDownload");
235             mprintf(gettext("\t - source    : ''%s''\n"),file_in);
236             mprintf(gettext("\t - destination : ''%s''\n"),file_out);
237             atomsCloseProgressBar(winId);
238             error(strcat(lasterror(), ascii(10)));
239         end
240
241     end
242
243     // If md5sum is gived, check the md5sum of the downloaded file
244     // =========================================================================
245
246     if rhs>2 then
247
248         filemd5 = getmd5(file_out);
249
250         if filemd5 <> md5sum then
251             mprintf(gettext("%s: The downloaded file does not match the MD5SUM:\n"),"atomsDownload");
252             mprintf(gettext("\t - file      : ''%s''\n"),file_out);
253             mprintf(gettext("\t - MD5SUM expected : ''%s''\n"),md5sum);
254             mprintf(gettext("\t - MD5SUM watched  : ''%s''\n"),filemd5);
255             atomsCloseProgressBar(winId);
256             error("");
257         end
258
259     end
260
261     atomsCloseProgressBar(winId);
262 endfunction