From e0c021de3d93d016dc1e55475f0ff889b8aba732 Mon Sep 17 00:00:00 2001 From: Martin Natano Date: Tue, 10 Apr 2012 20:54:03 +0200 Subject: [PATCH] Replace illegal characters in filenames Fixes: https://bugs.launchpad.net/midori/+bug/972931 --- midori/midori-browser.c | 11 +++++++---- midori/midori-view.c | 6 ++++-- midori/sokoke.c | 15 +++++++++++++++ midori/sokoke.h | 3 +++ panels/midori-transfers.c | 6 ++++-- toolbars/midori-transferbar.c | 7 +++++-- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/midori/midori-browser.c b/midori/midori-browser.c index ae3fae0d..e5450f7d 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -1417,7 +1417,7 @@ static gchar* midori_browser_download_prepare_destination_uri (WebKitDownload* download, const gchar* folder) { - const gchar* suggested_filename; + gchar* suggested_filename; GFile* file_source; gchar* file_basename; gchar* download_dir = NULL; @@ -1425,8 +1425,9 @@ midori_browser_download_prepare_destination_uri (WebKitDownload* download, gchar* destination_filename; gchar* midori_tmp_dir; - suggested_filename = webkit_download_get_suggested_filename (download); + suggested_filename = sokoke_get_download_filename (download); file_source = g_file_new_for_uri (suggested_filename); + g_free (suggested_filename); file_basename = g_file_get_basename (file_source); if (folder == NULL) { @@ -1472,6 +1473,7 @@ midori_view_download_requested_cb (GtkWidget* view, if (g_object_get_data (G_OBJECT (download), "save-as-download")) { static GtkWidget* dialog = NULL; + gchar* filename; if (!dialog) { @@ -1490,8 +1492,9 @@ midori_view_download_requested_cb (GtkWidget* view, G_CALLBACK (midori_view_download_save_as_response_cb), browser); } g_object_set_data (G_OBJECT (dialog), "download", download); - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), - webkit_download_get_suggested_filename (download)); + filename = sokoke_get_download_filename (download); + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), filename); + g_free (filename); gtk_widget_show (dialog); } else diff --git a/midori/midori-view.c b/midori/midori-view.c index 65d53f25..14b583fa 100644 --- a/midori/midori-view.c +++ b/midori/midori-view.c @@ -2845,6 +2845,7 @@ webkit_web_view_mime_type_decision_cb (GtkWidget* web_view, gchar* content_type; gchar* description; gchar* file_type; + gchar* name; gchar* file_name; WebKitDownload *download; WebKitWebDataSource* datasource; @@ -2908,8 +2909,9 @@ webkit_web_view_mime_type_decision_cb (GtkWidget* web_view, g_free (description); download = webkit_download_new (request); - file_name = g_strdup_printf (_("File Name: %s"), - webkit_download_get_suggested_filename (download)); + name = sokoke_get_download_filename (download); + file_name = g_strdup_printf (_("File Name: %s"), name); + g_free (name); g_object_unref (download); /* Link Fingerprint */ diff --git a/midori/sokoke.c b/midori/sokoke.c index fa8f9dfd..e4a0a444 100644 --- a/midori/sokoke.c +++ b/midori/sokoke.c @@ -31,6 +31,7 @@ #include #include #include +#include #ifdef HAVE_HILDON_FM #include @@ -1732,3 +1733,17 @@ sokoke_entry_set_clear_button_visible (GtkEntry* entry, } } +gchar* +sokoke_get_download_filename (WebKitDownload* download) +{ + /* https://bugs.webkit.org/show_bug.cgi?id=83161 */ + /* https://d19vezwu8eufl6.cloudfront.net/nlp/slides%2F03-01-FormalizingNB.pdf */ + gchar* filename = g_strdup (webkit_download_get_suggested_filename (download)); + #ifdef G_OS_WIN32 + g_strdelimit (filename, "/\\<>:\"|?*", '_'); + #else + g_strdelimit (filename, "/", '_'); + #endif + return filename; +} + diff --git a/midori/sokoke.h b/midori/sokoke.h index a92c6a77..a714cd98 100644 --- a/midori/sokoke.h +++ b/midori/sokoke.h @@ -14,6 +14,7 @@ #define __SOKOKE_H__ 1 #include +#include #include #include @@ -175,6 +176,8 @@ sokoke_accept_languages (const gchar* const * lang_names); gboolean sokoke_recursive_fork_protection (const gchar* uri, gboolean set_uri); +gchar* +sokoke_get_download_filename (WebKitDownload* download); typedef struct { diff --git a/panels/midori-transfers.c b/panels/midori-transfers.c index d24577e0..1c8ca470 100644 --- a/panels/midori-transfers.c +++ b/panels/midori-transfers.c @@ -257,6 +257,7 @@ midori_transfers_treeview_render_text_cb (GtkTreeViewColumn* column, gchar* total; gchar* size_text; gchar* text; + gchar* filename; gdouble progress; gtk_tree_model_get (model, iter, 1, &download, -1); @@ -267,8 +268,9 @@ midori_transfers_treeview_render_text_cb (GtkTreeViewColumn* column, size_text = g_strdup_printf (_("%s of %s"), current, total); g_free (current); g_free (total); - text = g_strdup_printf ("%s\n%s", - webkit_download_get_suggested_filename (download), size_text); + filename = sokoke_get_download_filename (download); + text = g_strdup_printf ("%s\n%s", filename, size_text); + g_free (filename); g_free (size_text); /* Avoid a bug in WebKit */ if (webkit_download_get_status (download) != WEBKIT_DOWNLOAD_STATUS_CREATED) diff --git a/toolbars/midori-transferbar.c b/toolbars/midori-transferbar.c index c86e5323..de2b96e9 100644 --- a/toolbars/midori-transferbar.c +++ b/toolbars/midori-transferbar.c @@ -262,8 +262,11 @@ midori_transferbar_add_download_item (MidoriTransferbar* transferbar, g_free (path); } else - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress), - webkit_download_get_suggested_filename (download)); + { + gchar* filename = sokoke_get_download_filename (download); + gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress), filename); + g_free (filename); + } sokoke_widget_get_text_size (progress, "M", &width, NULL); gtk_widget_set_size_request (progress, width * 10, 1); /* Avoid a bug in WebKit */