From 2748fe4f6483f8cfb3c4f91a01e8d897b7d1ac47 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Mon, 5 Apr 2010 21:35:38 +0000 Subject: Make downloads work again. svn path=/trunk/netsurf/; revision=10243 --- gtk/gtk_download.c | 98 +++++++++++++++++++++++++++++++++--------------------- gtk/gtk_download.h | 4 ++- 2 files changed, 64 insertions(+), 38 deletions(-) (limited to 'gtk') diff --git a/gtk/gtk_download.c b/gtk/gtk_download.c index fb8541587..64da611ad 100644 --- a/gtk/gtk_download.c +++ b/gtk/gtk_download.c @@ -27,7 +27,6 @@ #include "utils/utils.h" #include "utils/url.h" #include "utils/messages.h" -#include "content/fetch.h" #include "desktop/gui.h" #include "gtk/gtk_gui.h" #include "gtk/gtk_scaffolding.h" @@ -195,10 +194,11 @@ gboolean nsgtk_download_hide (GtkWidget *window) return TRUE; } -struct gui_download_window *gui_download_window_create(const char *url, - const char *mime_type, struct fetch *fetch, - unsigned int total_size, struct gui_window *gui) +struct gui_download_window *gui_download_window_create(download_context *ctx, + struct gui_window *gui) { + const char *url = download_context_get_url(ctx); + unsigned long total_size = download_context_get_total_length(ctx); gchar *domain; gchar *filename; gchar *destination; @@ -207,28 +207,48 @@ struct gui_download_window *gui_download_window_create(const char *url, messages_get("gtkUnknownSize") : human_friendly_bytesize(total_size)); - nsgtk_download_parent = nsgtk_scaffolding_window(nsgtk_get_scaffold( - gui)); + nsgtk_download_parent = + nsgtk_scaffolding_window(nsgtk_get_scaffold(gui)); + struct gui_download_window *download = malloc(sizeof *download); + if (download == NULL) + return NULL; - if (url_nice(url, &filename, false) != URL_FUNC_OK) - strcpy(filename, messages_get("gtkUnknownFile")); - if (url_host(url, &domain) != URL_FUNC_OK) - strcpy(domain, messages_get("gtkUnknownHost")); + if (url_nice(url, &filename, false) != URL_FUNC_OK) { + filename = g_strdup(messages_get("gtkUnknownFile")); + if (filename == NULL) { + free(download); + return NULL; + } + } + + if (url_host(url, &domain) != URL_FUNC_OK) { + domain = g_strdup(messages_get("gtkUnknownHost")); + if (domain == NULL) { + g_free(filename); + free(download); + return NULL; + } + } destination = nsgtk_download_dialog_show(filename, domain, size); - if (destination == NULL) + if (destination == NULL) { + g_free(domain); + g_free(filename); + free(download); return NULL; + } /* Add the new row and store the reference to it (which keeps track of * the tree changes) */ gtk_list_store_prepend(nsgtk_download_store, &nsgtk_download_iter); download->row = gtk_tree_row_reference_new( GTK_TREE_MODEL(nsgtk_download_store), - gtk_tree_model_get_path(GTK_TREE_MODEL - (nsgtk_download_store), &nsgtk_download_iter)); + gtk_tree_model_get_path( + GTK_TREE_MODEL(nsgtk_download_store), + &nsgtk_download_iter)); - download->fetch = fetch; + download->ctx = ctx; download->name = g_string_new(filename); download->time_left = g_string_new(""); download->size_total = total_size; @@ -240,38 +260,39 @@ struct gui_download_window *gui_download_window_create(const char *url, download->filename = destination; download->progress = 0; download->error = NULL; - download->write = g_io_channel_new_file(destination, "w", - &download->error); + download->write = + g_io_channel_new_file(destination, "w", &download->error); + if (nsgtk_download_handle_error(download->error)) { - g_string_free(download->name, TRUE); - g_string_free(download->time_left, TRUE); - g_free(download->filename); + g_string_free(download->name, TRUE); + g_string_free(download->time_left, TRUE); + g_free(download->filename); free(download); return NULL; } - g_io_channel_set_encoding(download->write, NULL, - &download->error); - + g_io_channel_set_encoding(download->write, NULL, &download->error); + nsgtk_download_change_sensitivity(download, NSGTK_DOWNLOAD_CANCEL); nsgtk_download_store_create_item(download); nsgtk_download_show(nsgtk_download_parent); if (unknown_size) - nsgtk_download_change_status(download, - NSGTK_DOWNLOAD_WORKING); + nsgtk_download_change_status(download, NSGTK_DOWNLOAD_WORKING); - if (nsgtk_downloads_num_active == 0) - g_timeout_add(UPDATE_RATE, (GSourceFunc)nsgtk_download_update, - FALSE); + if (nsgtk_downloads_num_active == 0) { + g_timeout_add(UPDATE_RATE, + (GSourceFunc) nsgtk_download_update, FALSE); + } + nsgtk_downloads_list = g_list_prepend(nsgtk_downloads_list, download); return download; } -void gui_download_window_data(struct gui_download_window *dw, const char *data, - unsigned int size) +nserror gui_download_window_data(struct gui_download_window *dw, + const char *data, unsigned int size) { g_io_channel_write_chars(dw->write, data, size, NULL, &dw->error); if (dw->error != NULL) { @@ -282,12 +303,14 @@ void gui_download_window_data(struct gui_download_window *dw, const char *data, nsgtk_download_change_status(dw, NSGTK_DOWNLOAD_ERROR); nsgtk_download_update(TRUE); - fetch_abort(dw->fetch); gtk_window_present(nsgtk_download_window); - return; + + return NSERROR_SAVE_FAILED; } dw->size_downloaded += size; + + return NSERROR_OK; } @@ -532,9 +555,11 @@ void nsgtk_download_store_clear_item (struct gui_download_window *dl) gtk_tree_row_reference_get_path(dl->row)); gtk_list_store_remove(nsgtk_download_store, &nsgtk_download_iter); - g_string_free(dl->name, TRUE); - g_string_free(dl->time_left, TRUE); - g_free(dl->filename); + + download_context_destroy(dl->ctx); + g_string_free(dl->name, TRUE); + g_string_free(dl->time_left, TRUE); + g_free(dl->filename); g_free(dl); nsgtk_download_sensitivity_evaluate(nsgtk_download_selection); @@ -551,9 +576,8 @@ void nsgtk_download_store_cancel_item (struct gui_download_window *dl) dl->time_remaining = -1; nsgtk_download_change_sensitivity(dl, NSGTK_DOWNLOAD_CLEAR); nsgtk_download_change_status(dl, NSGTK_DOWNLOAD_CANCELED); - - if (dl->fetch) - fetch_abort(dl->fetch); + + download_context_abort(dl->ctx); g_unlink(dl->filename); diff --git a/gtk/gtk_download.h b/gtk/gtk_download.h index a85980813..7e14600d4 100644 --- a/gtk/gtk_download.h +++ b/gtk/gtk_download.h @@ -21,6 +21,8 @@ #include +struct download_context; + enum { NSGTK_DOWNLOAD_PROGRESS, NSGTK_DOWNLOAD_INFO, @@ -49,7 +51,7 @@ typedef enum { } nsgtk_download_actions; struct gui_download_window { - struct fetch *fetch; + struct download_context *ctx; nsgtk_download_actions sensitivity; nsgtk_download_status status; -- cgit v1.2.3