[evolution] EMailRequest: Use EPhotoCache to obtain contact photos.



commit c9a20f545f422a08c764686f3d04755005937afe
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Feb 26 17:24:14 2013 -0500

    EMailRequest: Use EPhotoCache to obtain contact photos.

 mail/e-mail-request.c |  107 ++++++++++++++++++------------------------------
 1 files changed, 40 insertions(+), 67 deletions(-)
---
diff --git a/mail/e-mail-request.c b/mail/e-mail-request.c
index 324c7bb..e00cc4d 100644
--- a/mail/e-mail-request.c
+++ b/mail/e-mail-request.c
@@ -36,6 +36,8 @@
 #include "em-format/e-mail-formatter-utils.h"
 #include "em-format/e-mail-formatter-print.h"
 
+#include "e-mail-ui-session.h"
+
 #define d(x)
 #define dd(x)
 
@@ -221,90 +223,61 @@ handle_contact_photo_request (GSimpleAsyncResult *res,
                               GCancellable *cancellable)
 {
        EMailRequest *request = E_MAIL_REQUEST (object);
-       const gchar *email;
-       gchar *photo_name;
-       gboolean only_local_photo;
-       CamelMimePart *photopart;
        EShell *shell;
-       ESourceRegistry *registry;
+       EShellBackend *shell_backend;
+       EMailBackend *mail_backend;
+       EMailSession *mail_session;
+       EPhotoCache *photo_cache;
        CamelInternetAddress *cia;
-       CamelDataWrapper *dw;
-       GByteArray *ba;
        GInputStream *stream = NULL;
+       const gchar *email_address;
+       const gchar *escaped_string;
+       gchar *unescaped_string;
+       GError *error = NULL;
 
+       /* XXX Is this really the only way to obtain
+        *     the mail session instance from here? */
        shell = e_shell_get_default ();
-       registry = e_shell_get_registry (shell);
+       shell_backend = e_shell_get_backend_by_name (shell, "mail");
+       mail_backend = E_MAIL_BACKEND (shell_backend);
+       mail_session = e_mail_backend_get_session (mail_backend);
+
+       photo_cache = e_mail_ui_session_get_photo_cache (
+               E_MAIL_UI_SESSION (mail_session));
 
        request->priv->mime_type = g_strdup ("image/*");
 
-       email = g_hash_table_lookup (
-                       request->priv->uri_query, "mailaddr");
-       if (!email || !*email) {
-               gsize len;
+       escaped_string = g_hash_table_lookup (
+               request->priv->uri_query, "mailaddr");
+       if (escaped_string == NULL || *escaped_string == '\0')
+               goto exit;
 
-               stream = get_empty_image_stream (&len);
-               request->priv->content_length = len;
+       cia = camel_internet_address_new ();
 
-               g_simple_async_result_set_op_res_gpointer (res, stream, NULL);
-               return;
-       }
+       unescaped_string = g_uri_unescape_string (escaped_string, NULL);
+       camel_address_decode (CAMEL_ADDRESS (cia), unescaped_string);
+       g_free (unescaped_string);
 
-       photo_name = g_uri_unescape_string (email, NULL);
-       only_local_photo = g_hash_table_lookup_extended (
-                               request->priv->uri_query, "only-local-photo",
-                               NULL, NULL);
+       if (camel_internet_address_get (cia, 0, NULL, &email_address))
+               e_photo_cache_get_photo_sync (
+                       photo_cache, email_address,
+                       cancellable, &stream, &error);
 
-       cia = camel_internet_address_new ();
-       camel_address_decode ((CamelAddress *) cia, (const gchar *) photo_name);
-       photopart = em_utils_contact_photo (
-                       registry, cia, only_local_photo, cancellable);
        g_object_unref (cia);
-       if (!photopart) {
-               gsize len;
-
-               stream = get_empty_image_stream (&len);
-               request->priv->content_length = len;
-
-               g_simple_async_result_set_op_res_gpointer (res, stream, NULL);
-               g_free (photo_name);
-               return;
-       }
 
-       ba = NULL;
-       dw = camel_medium_get_content (CAMEL_MEDIUM (photopart));
-       if (dw) {
-               ba = camel_data_wrapper_get_byte_array (dw);
+       /* Ignore cancellations. */
+       if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+               g_clear_error (&error);
+       } else if (error != NULL) {
+               g_warning ("%s: %s", G_STRFUNC, error->message);
+               g_clear_error (&error);
        }
 
-       if (!ba || ba->len == 0) {
-
-               const gchar *filename = camel_mime_part_get_filename (photopart);
-
-               if (filename && *filename &&
-                   g_file_test (filename, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
-                       gchar *data;
-                       gsize len;
-
-                       if (!g_file_get_contents (filename, &data, &len, NULL)) {
-                               stream = get_empty_image_stream (&len);
-                       } else {
-                               stream = g_memory_input_stream_new_from_data (
-                                       (gchar *) data, len, g_free);
-                       }
-
-                       request->priv->content_length = len;
-               }
-
-       } else {
-
-               stream = g_memory_input_stream_new_from_data (
-                               (gchar *) ba->data, ba->len, NULL);
-
-               request->priv->content_length = ba->len;
-
-       }
+exit:
+       if (stream == NULL)
+               stream = get_empty_image_stream (
+                       (gsize *) &request->priv->content_length);
 
-       g_free (photo_name);
        g_simple_async_result_set_op_res_gpointer (res, stream, NULL);
 }
 


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