[evince] [ui] Escape URIs for display



commit 28ffb1e81e22421674091f6ad73613684bad12de
Author: Nickolay V. Shmyrev <nshmyrev yandex ru>
Date:   Sun May 3 12:21:17 2009 +0400

    [ui] Escape URIs for display
    
    Uses uri escaping function to make more sensible URI's to display them.
    Fixes GNOME bug #581064.
---
 shell/ev-utils.c        |   40 ++++++++++++++++++++++++++++++++++++++++
 shell/ev-utils.h        |    1 +
 shell/ev-window-title.c |   11 ++++++-----
 shell/ev-window.c       |   11 ++++++++---
 4 files changed, 55 insertions(+), 8 deletions(-)

diff --git a/shell/ev-utils.c b/shell/ev-utils.c
index 13f1459..540836f 100644
--- a/shell/ev-utils.c
+++ b/shell/ev-utils.c
@@ -400,3 +400,43 @@ get_gdk_pixbuf_format_by_extension (gchar *uri)
 	return NULL;
 }
 
+#define XDIGIT(c) ((c) <= '9' ? (c) - '0' : ((c) & 0x4F) - 'A' + 10)
+#define HEXCHAR(s) ((XDIGIT (s[1]) << 4) + XDIGIT (s[2]))
+
+static char *
+uri_decoded_copy (const char *part, int length)
+{
+	unsigned char *s, *d;
+	char *decoded = g_strndup (part, length);
+
+	s = d = (unsigned char *)decoded;
+	do {
+		if (*s == '%') {
+			if (!g_ascii_isxdigit (s[1]) ||
+			    !g_ascii_isxdigit (s[2])) {
+				g_free (decoded);
+				return NULL;
+			}
+			*d++ = HEXCHAR (s);
+			s += 2;
+		} else
+			*d++ = *s;
+	} while (*s++);
+
+	return decoded;
+}
+
+char* escape_uri_for_display (const char *uri)
+{
+	GFile *file;
+	char *disp;
+	char *filename;
+
+	file = g_file_new_for_uri (uri);
+	filename = g_file_get_parse_name (file);
+	disp = uri_decoded_copy (filename, strlen (filename));
+	g_free (filename);
+	g_object_unref (file);
+
+	return disp;
+}
diff --git a/shell/ev-utils.h b/shell/ev-utils.h
index f7c58a7..ac89b1e 100644
--- a/shell/ev-utils.h
+++ b/shell/ev-utils.h
@@ -44,6 +44,7 @@ gdouble 		get_screen_dpi (GtkWindow * window);
 void           		file_chooser_dialog_add_writable_pixbuf_formats (GtkFileChooser *chooser);
 GdkPixbufFormat* 	get_gdk_pixbuf_format_by_extension (gchar *uri);
 
+char*			escape_uri_for_display (const char *uri);
 G_END_DECLS
 
 #endif /* __EV_VIEW_H__ */
diff --git a/shell/ev-window-title.c b/shell/ev-window-title.c
index 9cfd865..baafa74 100644
--- a/shell/ev-window-title.c
+++ b/shell/ev-window-title.c
@@ -20,6 +20,7 @@
 #include <config.h>
 #include "ev-window-title.h"
 #include "ev-backends-manager.h"
+#include "ev-utils.h"
 
 #include <string.h>
 #include <gio/gio.h>
@@ -71,14 +72,14 @@ ev_window_title_new (EvWindow *window)
 static char *
 get_filename_from_uri (const char *uri)
 {
-	GFile *file;
 	char *filename;
+	char *basename;
 	
-	file = g_file_new_for_uri (uri);
-	filename = g_file_get_basename (file);
-	g_object_unref (file);
+	filename = escape_uri_for_display (uri);
+	basename = g_path_get_basename (filename);
+	g_free(filename);
 
-	return filename;
+	return basename;
 }
 
 /* Some docs report titles with confusing extensions (ex. .doc for pdf).
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 92f5089..5d99f66 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1586,12 +1586,15 @@ show_loading_progress (EvWindow *ev_window)
 {
 	GtkWidget *area;
 	gchar     *text;
+	gchar 	  *display_name;
 	
 	if (ev_window->priv->message_area)
 		return FALSE;
-	
-	text = g_strdup_printf (_("Loading document from %s"),
-				ev_window->priv->uri);
+
+	display_name = escape_uri_for_display (ev_window->priv->uri);
+	text = g_strdup_printf (_("Loading document from â??%sâ??"),
+				display_name);
+
 	area = ev_progress_message_area_new (GTK_STOCK_OPEN,
 					     text,
 					     GTK_STOCK_CLOSE,
@@ -1604,7 +1607,9 @@ show_loading_progress (EvWindow *ev_window)
 			  ev_window);
 	gtk_widget_show (area);
 	ev_window_set_message_area (ev_window, area);
+
 	g_free (text);
+	g_free (display_name);
 
 	return FALSE;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]