68add72b13d34930e1d9cc9d797ec64931d1d16f
[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-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,"/^(http|ftp|file):\/\//","o") <> 1 then
60     error(msprintf(gettext("%s: Wrong value for input argument #%d: String that start with ''http://'',''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, "/^(http|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 = string(strtod(atomsGetConfig("downloadTimeout")));
125
126     if timeout <> "0" then
127       timeout_arg = timeout_arg + timeout;
128     else
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 getos() == 'Windows' & CURL then
167       download_cmd = """" + pathconvert(SCI+"/tools/curl/curl.exe",%F) + """" + proxy_host_arg + proxy_user_arg + timeout_arg + " -s """ + url_in + """ -o """ + file_out + """";
168     elseif CURL then
169       // curl
170       download_cmd = "curl "+proxy_host_arg+proxy_user_arg+timeout_arg+" -s "+url_in + " -o " + file_out;
171     else
172       // wget
173       download_cmd = proxy_host_arg+"wget"+proxy_user_arg+timeout_arg+" "+url_in + " -O " + file_out;
174     end
175
176     winId = atomsOpenProgressBar(_("Download in progress... Please be patient."), %f);
177
178     err = [];
179     [rep,stat,err] = unix_g(download_cmd);
180
181     // Second try with httpdownload
182     if ( HTTPDOWNLOAD | stat<>0 ) & (getos() == 'Windows') then
183       imode = ilib_verbose();
184       ilib_verbose(0) ;
185       id  = link(SCI+"/bin/windows_tools.dll","httpdownload","c");
186       stat  = call("httpdownload", url_in, 1, "c", file_out, 2, "c", "out", [1,1], 3, "d");
187       ulink(id);
188       ilib_verbose(imode);
189
190       // Save the parameter to always download with httpdownload
191       if stat == 0 then
192         atomsSetConfig("downloadTool","httpdownload");
193       else
194         select stat,
195           case -1 then mprintf(gettext("%s: Error: Invalid URL.\n"), 'atomsDownload'),
196           case -2 then mprintf(gettext("%s: Error: Internet Open.\n"), 'atomsDownload'),
197           case -3 then mprintf(gettext("%s: Error: URL Open.\n"), 'atomsDownload'),
198           case -4 then mprintf(gettext("%s: Error: Createfile.\n"), 'atomsDownload'),
199           case -5 then mprintf(gettext("%s: Error: Invalid File size.\n"), 'atomsDownload'),
200           case -6 then mprintf(gettext("%s: Error: Internet Read file.\n"), 'atomsDownload'),
201           case -7 then mprintf(gettext("%s: Error: Write file.\n"), 'atomsDownload'),
202           case -8 then mprintf(gettext("%s: Error: Failure.\n"), 'atomsDownload'),
203           case -9 then mprintf(gettext("%s: Error: Out Of Memory.\n"), 'atomsDownload'),
204         end
205       end
206     end
207
208     if stat <> 0 then
209       mprintf(gettext("%s: The following file hasn''t been downloaded:\n"), "atomsDownload");
210       mprintf(gettext("\t - URL      : ''%s''\n"), url_in);
211       mprintf(gettext("\t - Local location : ''%s''\n"), file_out);
212       if isdef('err') then
213         atomsCloseProgressBar(winId);
214         error(strcat(err, ascii(10)));
215       end
216     end
217
218   elseif regexp(url_in,"/^file:\/\//","o") == 1 then
219
220     if getos() == 'Windows' then
221       url_pattern = "file:///";
222     else
223       url_pattern = "file://";
224     end
225
226     file_in = pathconvert(part(url_in,length(url_pattern)+1:length(url_in)),%F);
227
228     if copyfile(file_in,file_out) <> 1 then
229       mprintf(gettext("%s: The following file hasn''t been copied:\n"),"atomsDownload");
230       mprintf(gettext("\t - source    : ''%s''\n"),file_in);
231       mprintf(gettext("\t - destination : ''%s''\n"),file_out);
232       atomsCloseProgressBar(winId);
233       error(strcat(lasterror(), ascii(10)));
234     end
235
236   end
237
238   // If md5sum is gived, check the md5sum of the downloaded file
239   // =========================================================================
240
241   if rhs>2 then
242
243     filemd5 = getmd5(file_out);
244
245     if filemd5 <> md5sum then
246       mprintf(gettext("%s: The downloaded file doesn''t check the MD5SUM:\n"),"atomsDownload");
247       mprintf(gettext("\t - file      : ''%s''\n"),file_out);
248       mprintf(gettext("\t - MD5SUM expected : ''%s''\n"),md5sum);
249       mprintf(gettext("\t - MD5SUM watched  : ''%s''\n"),filemd5);
250       atomsCloseProgressBar(winId);
251       error("");
252     end
253
254   end
255
256   atomsCloseProgressBar(winId);
257 endfunction