diff options
author | Diego Escalante Urrelo <descalante@igalia.com> | 2011-10-11 08:46:17 +0800 |
---|---|---|
committer | Diego Escalante Urrelo <descalante@igalia.com> | 2011-12-21 02:22:20 +0800 |
commit | 89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2 (patch) | |
tree | 33edc5ea2ef7b60b2119f064ec913bc0d9bd9344 /embed | |
parent | 05f455ac484e75dd8596425276ccf190acfc1578 (diff) | |
download | gsoc2013-epiphany-89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2.tar gsoc2013-epiphany-89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2.tar.gz gsoc2013-epiphany-89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2.tar.bz2 gsoc2013-epiphany-89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2.tar.lz gsoc2013-epiphany-89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2.tar.xz gsoc2013-epiphany-89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2.tar.zst gsoc2013-epiphany-89c1e042193df2a76eb9aecb2c6b5b25e6e6e1a2.zip |
e-download: add ephy_download_get_content_type
This new API gets the content-type of a download using GIO, or Soup if
GIO is still not available for the download.
GIO is our first option since its local guesses are more reliable. Soup
can be cheated by servers or confused by still too incomplete downloads.
Bug #662059
Diffstat (limited to 'embed')
-rw-r--r-- | embed/ephy-download.c | 50 | ||||
-rw-r--r-- | embed/ephy-download.h | 2 |
2 files changed, 49 insertions, 3 deletions
diff --git a/embed/ephy-download.c b/embed/ephy-download.c index aa506ef77..81a04461f 100644 --- a/embed/ephy-download.c +++ b/embed/ephy-download.c @@ -140,6 +140,50 @@ ephy_download_set_property (GObject *object, } } +char * +ephy_download_get_content_type (EphyDownload *download) +{ + WebKitNetworkResponse *response; + SoupMessage *message; + char *content_type = NULL; + + GFile *destination; + GFileInfo *info; + GError *error = NULL; + + destination = g_file_new_for_uri (download->priv->destination); + info = g_file_query_info (destination, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, + G_FILE_QUERY_INFO_NONE, NULL, &error); + + if (error) { + LOG ("ephy_download_get_content_type: error getting file " + "content-type: %s", error->message); + g_error_free (error); + + /* Fallback to Soup */ + response = webkit_download_get_network_response (download->priv->download); + message = webkit_network_response_get_message (response); + + if (message != NULL) + content_type = g_strdup (soup_message_headers_get_content_type (message->response_headers, NULL)); + + LOG ("ephy_download_get_content_type: Soup: %s", content_type); + } else { + content_type = g_strdup (g_file_info_get_content_type (info)); + LOG ("ephy_download_get_content_type: GIO: %s", content_type); + } + + if (info) + g_object_unref (info); + + if (destination) + g_object_unref (destination); + + LOG ("ephy_download_get_content_type: %s", content_type); + + return content_type; +} + static EphyDownloadActionType decide_action_from_mime (EphyDownload *ephy_download) { @@ -156,7 +200,7 @@ decide_action_from_mime (EphyDownload *ephy_download) message = webkit_network_response_get_message (response); if (message) { - const char *content_type = soup_message_headers_get_content_type (message->response_headers, NULL); + char *content_type = ephy_download_get_content_type (ephy_download); if (content_type) { mime_description = g_content_type_get_description (content_type); @@ -164,7 +208,9 @@ decide_action_from_mime (EphyDownload *ephy_download) if (helper_app) action = EPHY_DOWNLOAD_ACTION_OPEN; - } + + g_free (content_type); + } } if (mime_description == NULL) { diff --git a/embed/ephy-download.h b/embed/ephy-download.h index 8c84bbe05..466da4006 100644 --- a/embed/ephy-download.h +++ b/embed/ephy-download.h @@ -92,7 +92,7 @@ WebKitDownload *ephy_download_get_webkit_download (EphyDownload *download); const char *ephy_download_get_destination_uri (EphyDownload *download); const char *ephy_download_get_source_uri (EphyDownload *download); - +char *ephy_download_get_content_type (EphyDownload *download); guint32 ephy_download_get_start_time (EphyDownload *download); |