[epiphany] Automatically append (n) to duplicated downloads
- From: Diego Escalante Urrelo <diegoe src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [epiphany] Automatically append (n) to duplicated downloads
- Date: Wed, 9 Sep 2009 22:59:31 +0000 (UTC)
commit 11f91ceca1f1185fbf523c24e7b5f8d63e041da4
Author: Diego Escalante Urrelo <diegoe gnome org>
Date: Fri Sep 4 19:51:32 2009 -0500
Automatically append (n) to duplicated downloads
Bug 585499 - [Webkit] Automatic downloading into ~/Downloads fails if file
already exists
embed/ephy-embed.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 81 insertions(+), 4 deletions(-)
---
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c
index dec2a32..a773596 100644
--- a/embed/ephy-embed.c
+++ b/embed/ephy-embed.c
@@ -504,12 +504,60 @@ request_destination_uri (WebKitWebView *web_view,
gtk_widget_show_all (GTK_WIDGET (dialog));
}
+/* From the old embed/mozilla/MozDownload.cpp */
+static const char*
+file_is_compressed (const char *filename)
+{
+ int i;
+ static const char * const compression[] = {".gz", ".bz2", ".Z", ".lz", NULL};
+
+ for (i = 0; compression[i] != NULL; i++) {
+ if (g_str_has_suffix (filename, compression[i]))
+ return compression[i];
+ }
+
+ return NULL;
+}
+
+static const char*
+parse_extension (const char *filename)
+{
+ const char *compression;
+
+ compression = file_is_compressed (filename);
+
+ /* if the file is compressed we might have a double extension */
+ if (compression != NULL) {
+ int i;
+ static const char * const extensions[] = {"tar", "ps", "xcf", "dvi", "txt", "text", NULL};
+
+ for (i = 0; extensions[i] != NULL; i++) {
+ char *suffix;
+ suffix = g_strdup_printf (".%s%s", extensions[i], compression);
+
+ if (g_str_has_suffix (filename, suffix)) {
+ char *p;
+
+ p = g_strrstr (filename, suffix);
+ g_free (suffix);
+
+ return p;
+ }
+
+ g_free (suffix);
+ }
+ }
+
+ /* no compression, just look for the last dot in the filename */
+ return g_strrstr (filename, ".");
+}
+
static gboolean
define_destination_uri (WebKitDownload *download,
gboolean temporary)
{
char *tmp_dir;
- char *tmp_filename;
+ char *destination_filename;
char *destination_uri;
const char *suggested_filename;
@@ -532,13 +580,42 @@ define_destination_uri (WebKitDownload *download,
return FALSE;
}
- tmp_filename = g_build_filename (tmp_dir, suggested_filename, NULL);
- destination_uri = g_strconcat ("file://", tmp_filename, NULL);
+ destination_filename = g_build_filename (tmp_dir, suggested_filename, NULL);
+
+ if (g_file_test (destination_filename, G_FILE_TEST_EXISTS)) {
+ int i = 1;
+ const char *dot_pos;
+ gssize position;
+ char *serial = NULL;
+ GString *tmp_filename;
+
+ dot_pos = parse_extension (destination_filename);
+ if (dot_pos)
+ position = dot_pos - destination_filename;
+ else
+ position = strlen (destination_filename);
+
+ tmp_filename = g_string_new (NULL);
+
+ do {
+ serial = g_strdup_printf ("(%d)", i++);
+
+ g_string_assign (tmp_filename, destination_filename);
+ g_string_insert (tmp_filename, position, serial);
+
+ g_free (serial);
+ } while (g_file_test (tmp_filename->str, G_FILE_TEST_EXISTS));
+
+ destination_filename = g_strdup (tmp_filename->str);
+ g_string_free (tmp_filename, TRUE);
+ }
+
+ destination_uri = g_strconcat ("file://", destination_filename, NULL);
webkit_download_set_destination_uri (download, destination_uri);
g_free (tmp_dir);
- g_free (tmp_filename);
+ g_free (destination_filename);
g_free (destination_uri);
return TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]