ATOMS: minor GUI fix
[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     winId = [];
110
111     if regexp(url_in, "/^(https?|ftp):\/\//", "o") == 1 then
112         proxy_host_arg = "";
113         proxy_user_arg = "";
114         timeout_arg  = "";
115
116         // Timeout configuration
117         if CURL then
118             // Curl
119             timeout_arg = " --connect-timeout ";
120         else
121             // wget
122             timeout_arg = " --timeout=";
123         end
124
125         timeout = strtod(atomsGetConfig("downloadTimeout"));
126
127         if ~isnan(timeout) then // Value found in config file
128             timeout_arg = timeout_arg + string(timeout);
129         else // Default timeout
130             timeout_arg = timeout_arg + "5";
131         end
132
133         timeout_arg = timeout_arg + " ";
134
135         // Proxy configuration
136         if (atomsGetConfig("useProxy") == "True") & (atomsGetConfig("proxyHost") <> "") then
137             // Host
138             proxy_host = atomsGetConfig("proxyHost");
139
140             // Port
141             if atomsGetConfig("proxyPort") <> "" then
142                 proxy_host =  proxy_host + ":" + atomsGetConfig("proxyPort");
143             end
144
145             // Host/port Argument
146             if CURL then
147                 // Curl
148                 proxy_host_arg = " --proxy "+ proxy_host;
149             else
150                 // wget
151                 proxy_host_arg = " http_proxy="""+proxy_host+""" ";
152             end
153
154             // Username/Password
155             if and([atomsGetConfig("proxyUser");atomsGetConfig("proxyPassword")]<> "") then
156                 if CURL then
157                     // Curl
158                     proxy_user_arg = " --proxy-user "+atomsGetConfig("proxyUser")+":"+atomsGetConfig("proxyPassword");
159                 else
160                     // wget
161                     proxy_user_arg = " --proxy-user="""+atomsGetConfig("proxyUser")+""" --proxy-password="""+atomsGetConfig("proxyPassword")+"""";
162                 end
163             end
164
165         end
166
167         if WGET & atomsGetConfig("useProxy") == "False" then
168             proxy_user_arg = " --no-proxy";
169         end
170
171
172         if getos() == "Windows" & CURL then
173             download_cmd = """" + pathconvert(SCI+"/tools/curl/curl.exe",%F) + """" + proxy_host_arg + proxy_user_arg + timeout_arg + " -s """ + url_in + """ -o """ + file_out + """";
174         elseif CURL then
175             // curl
176             download_cmd = "curl "+proxy_host_arg+proxy_user_arg+timeout_arg+" -s "+url_in + " -o " + file_out;
177         else
178             // wget
179             download_cmd = proxy_host_arg+"wget"+proxy_user_arg+timeout_arg+" "+url_in + " -O " + file_out;
180         end
181
182         winId = atomsOpenProgressBar(_("Download in progress... Please be patient."), %f);
183
184         err = [];
185         [rep,stat,err] = unix_g(download_cmd);
186
187         // Second try with httpdownload
188         if ( HTTPDOWNLOAD | stat<>0 ) & (getos() == "Windows") then
189             imode = ilib_verbose();
190             ilib_verbose(0) ;
191             id  = link(SCI+"/bin/windows_tools.dll","httpdownload","c");
192             stat  = call("httpdownload", url_in, 1, "c", file_out, 2, "c", "out", [1,1], 3, "d");
193             ulink(id);
194             ilib_verbose(imode);
195
196             // Save the parameter to always download with httpdownload
197             if stat == 0 then
198                 atomsSetConfig("downloadTool","httpdownload");
199             else
200                 select stat,
201                 case -1 then mprintf(gettext("%s: Error: the response status from the URL %s is invalid.\n"), "atomsDownload", url_in),
202                 case -2 then mprintf(gettext("%s: Error while opening an Internet connection.\n"), "atomsDownload"),
203                 case -3 then mprintf(gettext("%s: Error while opening the URL %s.\n"), "atomsDownload", url_in),
204                 case -4 then mprintf(gettext("%s: Error while creating the file %s on disk.\n"), "atomsDownload", file_out),
205                 case -5 then mprintf(gettext("%s: Error while retrieving the size of file at URL %s.\n"), "atomsDownload", url_in),
206                 case -6 then mprintf(gettext("%s: Error while reading the file from the URL %s.\n"), "atomsDownload", url_in),
207                 case -7 then mprintf(gettext("%s: Error while writing the file %s on disk.\n"), "atomsDownload", file_out),
208                 case -8 then mprintf(gettext("%s: Error while downloading the file from the URL %s.\n"), "atomsDownload", url_in),
209                 case -9 then mprintf(gettext("%s: Error: out of memory.\n"), "atomsDownload"),
210                 end
211             end
212         end
213
214         if stat <> 0 then
215             mprintf(gettext("%s: The following file hasn''t been downloaded:\n"), "atomsDownload");
216             mprintf(gettext("\t - URL      : ''%s''\n"), url_in);
217             mprintf(gettext("\t - Local location : ''%s''\n"), file_out);
218             if isdef("err") then
219                 atomsCloseProgressBar(winId);
220                 error(strcat(err, ascii(10)));
221             end
222         end
223
224     elseif regexp(url_in,"/^file:\/\//","o") == 1 then
225
226         if getos() == "Windows" then
227             url_pattern = "file:///";
228         else
229             url_pattern = "file://";
230         end
231
232         file_in = pathconvert(part(url_in,length(url_pattern)+1:length(url_in)),%F);
233
234         if copyfile(file_in,file_out) <> 1 then
235             mprintf(gettext("%s: The following file has not been copied:\n"),"atomsDownload");
236             mprintf(gettext("\t - source    : ''%s''\n"),file_in);
237             mprintf(gettext("\t - destination : ''%s''\n"),file_out);
238             atomsCloseProgressBar(winId);
239             error(strcat(lasterror(), ascii(10)));
240         end
241
242     end
243
244     // If md5sum is gived, check the md5sum of the downloaded file
245     // =========================================================================
246
247     if rhs>2 then
248
249         filemd5 = getmd5(file_out);
250
251         if filemd5 <> md5sum then
252             mprintf(gettext("%s: The downloaded file does not match the MD5SUM:\n"),"atomsDownload");
253             mprintf(gettext("\t - file      : ''%s''\n"),file_out);
254             mprintf(gettext("\t - MD5SUM expected : ''%s''\n"),md5sum);
255             mprintf(gettext("\t - MD5SUM watched  : ''%s''\n"),filemd5);
256             atomsCloseProgressBar(winId);
257             error("");
258         end
259
260     end
261
262     // Close progress bar handle, if not closed yet
263     // =========================================================================
264     if (~isempty(winId))
265         atomsCloseProgressBar(winId);
266     end
267 endfunction