summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeeshan Ali (Khattak) <zeeshanak@gnome.org>2013-01-16 04:05:07 +0200
committerZeeshan Ali (Khattak) <zeeshanak@gnome.org>2013-01-23 16:10:52 +0200
commit9ce057bf1c875a4b863ce61e35974d223596cb5f (patch)
treec2b33982b0bc8217c925bfb28a006bb2523e00db
parent22d3cb1c199168166c072a6d6f74b4f9c43c45c8 (diff)
downloader: (Try to) Support non-HTTP cases
This is not guaranteed to work for every kind of filesystem but at least now we don't assume HTTP blindly and support caching from local filesystem. Its a perfectly valid usecase for distros to provide product logos or driver files from local filesystem and with this patch we'll support that. https://bugzilla.gnome.org/show_bug.cgi?id=691823
-rw-r--r--src/downloader.vala66
1 files changed, 37 insertions, 29 deletions
diff --git a/src/downloader.vala b/src/downloader.vala
index 749116f..5911d0e 100644
--- a/src/downloader.vala
+++ b/src/downloader.vala
@@ -46,7 +46,6 @@ private class Boxes.Downloader : GLib.Object {
string cached_path,
ActivityProgress progress = new ActivityProgress ()) throws GLib.Error {
var uri = remote_file.get_uri ();
-
if (downloads.contains (uri))
// Already being downloaded
return yield await_download (uri, cached_path); // FIXME: No progress report in this case.
@@ -61,34 +60,10 @@ private class Boxes.Downloader : GLib.Object {
downloads.set (uri, cached_file);
try {
- var msg = new Soup.Message ("GET", uri);
- var address = msg.get_address ();
- var connectable = new NetworkAddress (address.name, (uint16) address.port);
- var network_monitor = NetworkMonitor.get_default ();
- if (!(yield network_monitor.can_reach_async (connectable)))
- throw new Boxes.Error.INVALID ("Failed to reach host '%s' on port '%d'", address.name, address.port);
-
- int64 total_num_bytes = 0;
- msg.got_headers.connect (() => {
- total_num_bytes = msg.response_headers.get_content_length ();
- });
-
- int64 current_num_bytes = 0;
- msg.got_chunk.connect ((msg, chunk) => {
- if (total_num_bytes <= 0)
- return;
-
- current_num_bytes += chunk.length;
- progress.progress = (double) current_num_bytes / total_num_bytes;
- });
-
- session.queue_message (msg, (session, msg) => {
- download.callback ();
- });
- yield;
- if (msg.status_code != Soup.KnownStatusCode.OK)
- throw new Boxes.Error.INVALID (msg.reason_phrase);
- yield cached_file.replace_contents_async (msg.response_body.data, null, false, 0, null, null);
+ if (remote_file.has_uri_scheme ("http") || remote_file.has_uri_scheme ("https"))
+ yield download_from_http (uri, cached_file, progress);
+ else
+ yield copy_file (remote_file, cached_file); // FIXME: No progress report in this case.
} catch (GLib.Error error) {
download_failed (uri, cached_file, error);
@@ -103,6 +78,39 @@ private class Boxes.Downloader : GLib.Object {
return cached_file;
}
+ private async void download_from_http (string uri,
+ File cached_file,
+ ActivityProgress progress) throws GLib.Error {
+ var msg = new Soup.Message ("GET", uri);
+ var address = msg.get_address ();
+ var connectable = new NetworkAddress (address.name, (uint16) address.port);
+ var network_monitor = NetworkMonitor.get_default ();
+ if (!(yield network_monitor.can_reach_async (connectable)))
+ throw new Boxes.Error.INVALID ("Failed to reach host '%s' on port '%d'", address.name, address.port);
+
+ int64 total_num_bytes = 0;
+ msg.got_headers.connect (() => {
+ total_num_bytes = msg.response_headers.get_content_length ();
+ });
+
+ int64 current_num_bytes = 0;
+ msg.got_chunk.connect ((msg, chunk) => {
+ if (total_num_bytes <= 0)
+ return;
+
+ current_num_bytes += chunk.length;
+ progress.progress = (double) current_num_bytes / total_num_bytes;
+ });
+
+ session.queue_message (msg, (session, msg) => {
+ download_from_http.callback ();
+ });
+ yield;
+ if (msg.status_code != Soup.KnownStatusCode.OK)
+ throw new Boxes.Error.INVALID (msg.reason_phrase);
+ yield cached_file.replace_contents_async (msg.response_body.data, null, false, 0, null, null);
+ }
+
public static async void fetch_os_logo (Gtk.Image image, Osinfo.Os os, int size) {
var logo_url = fetch_os_logo_url (os);
if (logo_url == null)