diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2013-07-27 13:49:59 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2013-07-28 03:27:09 +0800 |
commit | 69837f33cc6701043c9bbef2005c3c8281d5980e (patch) | |
tree | 7027303ba875f204a526b4e87702e036b8272662 /e-util | |
parent | 51b74eee72ecf1323105f9c12942f2fe303ec7e1 (diff) | |
download | gsoc2013-evolution-69837f33cc6701043c9bbef2005c3c8281d5980e.tar.gz gsoc2013-evolution-69837f33cc6701043c9bbef2005c3c8281d5980e.tar.zst gsoc2013-evolution-69837f33cc6701043c9bbef2005c3c8281d5980e.zip |
Add e_web_view_suggest_filename().
Attempts to derive a suggested filename from the given URI for use in a
"Save As" dialog.
By default the suggested filename is the last path segment of the given
URI (the unless the given URI looks like a query), but subclasses can use
other mechanisms for custom URI schemes. For example, "cid:" URIs in an
email message may refer to a MIME part with a suggested filename in its
Content-Disposition header.
Diffstat (limited to 'e-util')
-rw-r--r-- | e-util/e-web-view.c | 61 | ||||
-rw-r--r-- | e-util/e-web-view.h | 4 |
2 files changed, 65 insertions, 0 deletions
diff --git a/e-util/e-web-view.c b/e-util/e-web-view.c index 68ca266ca1..936781a8c1 100644 --- a/e-util/e-web-view.c +++ b/e-util/e-web-view.c @@ -1087,6 +1087,25 @@ web_view_redirect_uri (EWebView *web_view, return g_strdup (uri); } +static gchar * +web_view_suggest_filename (EWebView *web_view, + const gchar *uri) +{ + const gchar *cp; + + /* Try to derive a filename from the last path segment. */ + + cp = strrchr (uri, '/'); + if (cp != NULL) { + if (strchr (cp, '?') == NULL) + cp++; + else + cp = NULL; + } + + return g_strdup (cp); +} + static gboolean web_view_popup_event (EWebView *web_view, const gchar *uri) @@ -1375,6 +1394,7 @@ e_web_view_class_init (EWebViewClass *class) class->load_string = web_view_load_string; class->load_uri = web_view_load_uri; class->redirect_uri = web_view_redirect_uri; + class->suggest_filename = web_view_suggest_filename; class->popup_event = web_view_popup_event; class->stop_loading = web_view_stop_loading; class->update_actions = web_view_update_actions; @@ -1850,6 +1870,47 @@ e_web_view_redirect_uri (EWebView *web_view, return class->redirect_uri (web_view, uri); } +/** + * e_web_view_suggest_filename: + * @web_view: an #EWebView + * @uri: a URI string + * + * Attempts to derive a suggested filename from the @uri for use in a + * "Save As" dialog. + * + * By default the suggested filename is the last path segment of the @uri + * (unless @uri looks like a query), but subclasses can use other mechanisms + * for custom URI schemes. For example, "cid:" URIs in an email message may + * refer to a MIME part with a suggested filename in its Content-Disposition + * header. + * + * The returned string should be freed with g_free() when finished with it, + * but callers should also be prepared for the function to return %NULL if + * a filename cannot be determined. + * + * Returns: a suggested filename, or %NULL + **/ +gchar * +e_web_view_suggest_filename (EWebView *web_view, + const gchar *uri) +{ + EWebViewClass *class; + gchar *filename; + + g_return_val_if_fail (E_IS_WEB_VIEW (web_view), NULL); + g_return_val_if_fail (uri != NULL, NULL); + + class = E_WEB_VIEW_GET_CLASS (web_view); + g_return_val_if_fail (class->suggest_filename != NULL, NULL); + + filename = class->suggest_filename (web_view, uri); + + if (filename != NULL) + e_filename_make_safe (filename); + + return filename; +} + void e_web_view_reload (EWebView *web_view) { diff --git a/e-util/e-web-view.h b/e-util/e-web-view.h index d4b1db650d..df338abd71 100644 --- a/e-util/e-web-view.h +++ b/e-util/e-web-view.h @@ -82,6 +82,8 @@ struct _EWebViewClass { const gchar *load_uri); gchar * (*redirect_uri) (EWebView *web_view, const gchar *uri); + gchar * (*suggest_filename) (EWebView *web_view, + const gchar *uri); void (*set_fonts) (EWebView *web_view, PangoFontDescription **monospace, PangoFontDescription **variable_width); @@ -106,6 +108,8 @@ void e_web_view_load_uri (EWebView *web_view, const gchar *uri); gchar * e_web_view_redirect_uri (EWebView *web_view, const gchar *uri); +gchar * e_web_view_suggest_filename (EWebView *web_view, + const gchar *uri); void e_web_view_reload (EWebView *web_view); gchar * e_web_view_get_html (EWebView *web_view); gboolean e_web_view_get_caret_mode (EWebView *web_view); |