[evolution/gnome-3-6] EMailDisplay lefts opened file handles to downloaded images



commit c7f5afb6d91791c637c12083b9ef54d80283495e
Author: Milan Crha <mcrha redhat com>
Date:   Thu Nov 22 19:33:31 2012 +0100

    EMailDisplay lefts opened file handles to downloaded images
    
    This fixes three things:
    a) mail_display_resource_requested() was leaking file handles on downloaded images
    b) it's not necessary to open files, it's enough to test whether file exists
    c) mail_display_button_press_event() used incorrect key for "http" cache

 mail/e-mail-display.c |   48 ++++++++++++++++++++++++++----------------------
 1 files changed, 26 insertions(+), 22 deletions(-)
---
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index a544518..9cbc983 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -85,7 +85,7 @@ enum {
 	PROP_HEADERS_COLLAPSED,
 };
 
-static CamelDataCache *emd_global_http_cache = 0;
+static CamelDataCache *emd_global_http_cache = NULL;
 
 static const gchar *ui =
 "<ui>"
@@ -179,6 +179,25 @@ formatter_image_loading_policy_changed_cb (GObject *object,
 		e_mail_display_reload (display);
 }
 
+static gboolean
+mail_display_image_exists_in_cache (const gchar *image_uri)
+{
+	gchar *image_filename, *uri_md5;
+	gboolean exists;
+
+	g_return_val_if_fail (emd_global_http_cache != NULL, FALSE);
+
+	uri_md5 = g_compute_checksum_for_string (G_CHECKSUM_MD5, image_uri, -1);
+	image_filename = camel_data_cache_get_filename (emd_global_http_cache, "http", uri_md5);
+
+	exists = image_filename && g_file_test (image_filename, G_FILE_TEST_EXISTS);
+
+	g_free (uri_md5);
+	g_free (image_filename);
+
+	return exists;
+}
+
 static void
 mail_display_update_formatter_colors (EMailDisplay *display)
 {
@@ -360,23 +379,18 @@ mail_display_resource_requested (WebKitWebView *web_view,
 		gchar *new_uri, *mail_uri, *enc;
 		SoupURI *soup_uri;
 		GHashTable *query;
-		gchar *uri_md5;
-		CamelStream *stream;
+		gboolean image_exists;
 		EMailImageLoadingPolicy image_policy;
 
-		/* Open Evolution's cache */
-		uri_md5 = g_compute_checksum_for_string (
-			G_CHECKSUM_MD5, uri, -1);
-		stream = camel_data_cache_get (
-			emd_global_http_cache, "http", uri_md5, NULL);
-		g_free (uri_md5);
+		/* Check Evolution's cache */
+		image_exists = mail_display_image_exists_in_cache (uri);
 
 		/* If the URI is not cached and we are not allowed to load it
 		 * then redirect to invalid URI, so that webkit would display
 		 * a native placeholder for it. */
 		image_policy = e_mail_formatter_get_image_loading_policy (
 			display->priv->formatter);
-		if (!stream && !display->priv->force_image_load &&
+		if (!image_exists && !display->priv->force_image_load &&
 		    (image_policy == E_MAIL_IMAGE_LOADING_POLICY_NEVER)) {
 			webkit_network_request_set_uri (request, "about:blank");
 			return;
@@ -1386,18 +1400,8 @@ mail_display_button_press_event (GtkWidget *widget,
 
 	if ((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)) {
 		visible = image_src && g_str_has_prefix (image_src, "cid:");
-		if (!visible && image_src) {
-			CamelStream *image_stream;
-
-			image_stream = camel_data_cache_get (
-				emd_global_http_cache, "http",
-				image_src, NULL);
-
-			visible = (image_stream != NULL);
-
-			if (image_stream != NULL)
-				g_object_unref (image_stream);
-		}
+		if (!visible && image_src)
+			visible = mail_display_image_exists_in_cache (image_src);
 
 		if (image_src != NULL)
 			g_free (image_src);



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