From 28ffb1e81e22421674091f6ad73613684bad12de Mon Sep 17 00:00:00 2001 From: Nickolay V. Shmyrev Date: Sun, 03 May 2009 08:21:17 +0000 Subject: [ui] Escape URIs for display Uses uri escaping function to make more sensible URI's to display them. Fixes GNOME bug #581064. --- 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 #include "ev-window-title.h" #include "ev-backends-manager.h" +#include "ev-utils.h" #include #include @@ -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; } -- cgit v0.9.1