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