[evolution] Add e_mail_session_append_to_local_folder().



commit cbf51737faf61d88c3b7c5349b5db635b892c2c1
Author: Matthew Barnes <mbarnes redhat com>
Date:   Tue Aug 14 18:20:48 2012 -0400

    Add e_mail_session_append_to_local_folder().
    
    Asynchronous + synchronous convenience functions.
    
    Uses the EMailLocalFolder enumeration to specify a well-known folder.

 libemail-engine/e-mail-session-utils.c |  120 ++++++++++++++++++++++++++++++++
 libemail-engine/e-mail-session-utils.h |   22 ++++++
 mail/em-composer-utils.c               |   20 ++----
 modules/mdn/evolution-mdn.c            |   31 +++++----
 plugins/templates/templates.c          |   16 ++---
 5 files changed, 172 insertions(+), 37 deletions(-)
---
diff --git a/libemail-engine/e-mail-session-utils.c b/libemail-engine/e-mail-session-utils.c
index 0694ea6..f9ddcb2 100644
--- a/libemail-engine/e-mail-session-utils.c
+++ b/libemail-engine/e-mail-session-utils.c
@@ -56,6 +56,8 @@ struct _AsyncContext {
 
 	GPtrArray *post_to_uris;
 
+	EMailLocalFolder local_id;
+
 	gchar *folder_uri;
 	gchar *message_uid;
 	gchar *transport_uid;
@@ -119,6 +121,124 @@ e_mail_error_quark (void)
 }
 
 static void
+mail_session_append_to_local_folder_thread (GSimpleAsyncResult *simple,
+                                            GObject *object,
+                                            GCancellable *cancellable)
+{
+	AsyncContext *context;
+	GError *error = NULL;
+
+	context = g_simple_async_result_get_op_res_gpointer (simple);
+
+	e_mail_session_append_to_local_folder_sync (
+		E_MAIL_SESSION (object),
+		context->local_id, context->message,
+		context->info, &context->message_uid,
+		cancellable, &error);
+
+	if (error != NULL)
+		g_simple_async_result_take_error (simple, error);
+}
+
+gboolean
+e_mail_session_append_to_local_folder_sync (EMailSession *session,
+                                            EMailLocalFolder local_id,
+                                            CamelMimeMessage *message,
+                                            CamelMessageInfo *info,
+                                            gchar **appended_uid,
+                                            GCancellable *cancellable,
+                                            GError **error)
+{
+	CamelFolder *folder;
+	const gchar *folder_uri;
+	gboolean success = FALSE;
+
+	g_return_val_if_fail (E_IS_MAIL_SESSION (session), FALSE);
+	g_return_val_if_fail (CAMEL_IS_MIME_MESSAGE (message), FALSE);
+
+	folder_uri = e_mail_session_get_local_folder_uri (session, local_id);
+	g_return_val_if_fail (folder_uri != NULL, FALSE);
+
+	folder = e_mail_session_uri_to_folder_sync (
+		session, folder_uri, CAMEL_STORE_FOLDER_CREATE,
+		cancellable, error);
+
+	if (folder != NULL) {
+		success = e_mail_folder_append_message_sync (
+			folder, message, info, appended_uid,
+			cancellable, error);
+		g_object_unref (folder);
+	}
+
+	return success;
+}
+
+void
+e_mail_session_append_to_local_folder (EMailSession *session,
+                                       EMailLocalFolder local_id,
+                                       CamelMimeMessage *message,
+                                       CamelMessageInfo *info,
+                                       gint io_priority,
+                                       GCancellable *cancellable,
+                                       GAsyncReadyCallback callback,
+                                       gpointer user_data)
+{
+	GSimpleAsyncResult *simple;
+	AsyncContext *context;
+
+	g_return_if_fail (E_IS_MAIL_SESSION (session));
+	g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message));
+
+	context = g_slice_new0 (AsyncContext);
+	context->local_id = local_id;
+	context->message = g_object_ref (message);
+
+	if (info != NULL)
+		context->info = camel_message_info_ref (info);
+
+	simple = g_simple_async_result_new (
+		G_OBJECT (session), callback, user_data,
+		e_mail_session_append_to_local_folder);
+
+	g_simple_async_result_set_check_cancellable (simple, cancellable);
+
+	g_simple_async_result_set_op_res_gpointer (
+		simple, context, (GDestroyNotify) async_context_free);
+
+	g_simple_async_result_run_in_thread (
+		simple, mail_session_append_to_local_folder_thread,
+		io_priority, cancellable);
+
+	g_object_unref (simple);
+}
+
+gboolean
+e_mail_session_append_to_local_folder_finish (EMailSession *session,
+                                              GAsyncResult *result,
+                                              gchar **appended_uid,
+                                              GError **error)
+{
+	GSimpleAsyncResult *simple;
+	AsyncContext *context;
+
+	g_return_val_if_fail (
+		g_simple_async_result_is_valid (
+		result, G_OBJECT (session),
+		e_mail_session_append_to_local_folder), FALSE);
+
+	simple = G_SIMPLE_ASYNC_RESULT (result);
+	context = g_simple_async_result_get_op_res_gpointer (simple);
+
+	if (appended_uid != NULL) {
+		*appended_uid = context->message_uid;
+		context->message_uid = NULL;
+	}
+
+	/* Assume success unless a GError is set. */
+	return !g_simple_async_result_propagate_error (simple, error);
+}
+
+static void
 mail_session_handle_draft_headers_thread (GSimpleAsyncResult *simple,
                                           EMailSession *session,
                                           GCancellable *cancellable)
diff --git a/libemail-engine/e-mail-session-utils.h b/libemail-engine/e-mail-session-utils.h
index aec6a50..0c7cff3 100644
--- a/libemail-engine/e-mail-session-utils.h
+++ b/libemail-engine/e-mail-session-utils.h
@@ -32,6 +32,28 @@ typedef enum {
 } EMailError;
 
 GQuark		e_mail_error_quark		(void) G_GNUC_CONST;
+gboolean	e_mail_session_append_to_local_folder_sync
+						(EMailSession *session,
+						 EMailLocalFolder local_id,
+						 CamelMimeMessage *message,
+						 CamelMessageInfo *info,
+						 gchar **appended_uid,
+						 GCancellable *cancellable,
+						 GError **error);
+void		e_mail_session_append_to_local_folder
+						(EMailSession *session,
+						 EMailLocalFolder local_id,
+						 CamelMimeMessage *message,
+						 CamelMessageInfo *info,
+						 gint io_priority,
+						 GCancellable *cancellable,
+						 GAsyncReadyCallback callback,
+						 gpointer user_data);
+gboolean	e_mail_session_append_to_local_folder_finish
+						(EMailSession *session,
+						 GAsyncResult *result,
+						 gchar **appended_uid,
+						 GError **error);
 gboolean	e_mail_session_handle_draft_headers_sync
 						(EMailSession *session,
 						 CamelMimeMessage *message,
diff --git a/mail/em-composer-utils.c b/mail/em-composer-utils.c
index b107745..c01ec85 100644
--- a/mail/em-composer-utils.c
+++ b/mail/em-composer-utils.c
@@ -874,7 +874,7 @@ em_utils_composer_save_to_drafts_cb (EMsgComposer *composer,
 }
 
 static void
-composer_save_to_outbox_completed (CamelFolder *outbox_folder,
+composer_save_to_outbox_completed (EMailSession *session,
                                    GAsyncResult *result,
                                    AsyncContext *context)
 {
@@ -883,8 +883,8 @@ composer_save_to_outbox_completed (CamelFolder *outbox_folder,
 
 	alert_sink = e_activity_get_alert_sink (context->activity);
 
-	e_mail_folder_append_message_finish (
-		outbox_folder, result, NULL, &error);
+	e_mail_session_append_to_local_folder_finish (
+		session, result, NULL, &error);
 
 	if (e_activity_handle_cancellation (context->activity, error)) {
 		g_error_free (error);
@@ -901,7 +901,7 @@ composer_save_to_outbox_completed (CamelFolder *outbox_folder,
 
 	/* special processing for Outbox folder */
 	manage_x_evolution_replace_outbox (
-		context->composer, context->session, context->message,
+		context->composer, session, context->message,
 		e_activity_get_cancellable (context->activity));
 
 	e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
@@ -923,28 +923,22 @@ em_utils_composer_save_to_outbox_cb (EMsgComposer *composer,
                                      EMailSession *session)
 {
 	AsyncContext *context;
-	CamelFolder *outbox_folder;
 	CamelMessageInfo *info;
 	GCancellable *cancellable;
 
 	context = g_slice_new0 (AsyncContext);
 	context->message = g_object_ref (message);
-	context->session = g_object_ref (session);
 	context->composer = g_object_ref (composer);
 	context->activity = g_object_ref (activity);
 
 	cancellable = e_activity_get_cancellable (activity);
 
-	outbox_folder =
-		e_mail_session_get_local_folder (
-		session, E_MAIL_LOCAL_FOLDER_OUTBOX);
-
 	info = camel_message_info_new (NULL);
 	camel_message_info_set_flags (info, CAMEL_MESSAGE_SEEN, ~0);
 
-	e_mail_folder_append_message (
-		outbox_folder, message, info,
-		G_PRIORITY_DEFAULT, cancellable,
+	e_mail_session_append_to_local_folder (
+		session, E_MAIL_LOCAL_FOLDER_OUTBOX,
+		message, info, G_PRIORITY_DEFAULT, cancellable,
 		(GAsyncReadyCallback) composer_save_to_outbox_completed,
 		context);
 
diff --git a/modules/mdn/evolution-mdn.c b/modules/mdn/evolution-mdn.c
index cd6d3ed..03abc00 100644
--- a/modules/mdn/evolution-mdn.c
+++ b/modules/mdn/evolution-mdn.c
@@ -24,8 +24,7 @@
 
 #include <libevolution-utils/e-alert-dialog.h>
 
-#include <libemail-engine/e-mail-folder-utils.h>
-#include <libemail-engine/e-mail-session.h>
+#include <libemail-engine/e-mail-session-utils.h>
 
 #include <mail/em-utils.h>
 #include <mail/e-mail-reader.h>
@@ -187,15 +186,22 @@ mdn_get_disposition (MdnActionMode action_mode,
 }
 
 static void
-mdn_receipt_done (CamelFolder *folder,
+mdn_receipt_done (EMailSession *session,
                   GAsyncResult *result,
-                  EMailSession *session)
+                  gpointer user_data)
 {
-	/* FIXME Poor error handling. */
-	if (e_mail_folder_append_message_finish (folder, result, NULL, NULL))
-		mail_send (session);
+	GError *error = NULL;
+
+	e_mail_session_append_to_local_folder_finish (
+		session, result, NULL, &error);
 
-	g_object_unref (session);
+	if (error == NULL) {
+		mail_send (session);
+	} else {
+		/* FIXME Poor error handling. */
+		g_warning ("%s: %s", G_STRFUNC, error->message);
+		g_error_free (error);
+	}
 }
 
 static void
@@ -218,7 +224,6 @@ mdn_notify_sender (ESource *source,
 	CamelContentType *type;
 	CamelInternetAddress *address;
 	CamelStream *stream;
-	CamelFolder *out_folder;
 	CamelMessageInfo *receipt_info;
 	EMailBackend *backend;
 	EMailSession *session;
@@ -420,15 +425,13 @@ mdn_notify_sender (ESource *source,
 
 	/* Send the receipt. */
 	receipt_info = camel_message_info_new (NULL);
-	out_folder =
-		e_mail_session_get_local_folder (
-		session, E_MAIL_LOCAL_FOLDER_OUTBOX);
 	camel_message_info_set_flags (
 		receipt_info, CAMEL_MESSAGE_SEEN, CAMEL_MESSAGE_SEEN);
 
 	/* FIXME Pass a GCancellable. */
-	e_mail_folder_append_message (
-		out_folder, receipt, receipt_info, G_PRIORITY_DEFAULT,
+	e_mail_session_append_to_local_folder (
+		session, E_MAIL_LOCAL_FOLDER_OUTBOX,
+		receipt, receipt_info, G_PRIORITY_DEFAULT,
 		NULL, (GAsyncReadyCallback) mdn_receipt_done,
 		g_object_ref (session));
 
diff --git a/plugins/templates/templates.c b/plugins/templates/templates.c
index 4359af0..f218bce 100644
--- a/plugins/templates/templates.c
+++ b/plugins/templates/templates.c
@@ -37,8 +37,7 @@
 
 #include <shell/e-shell-view.h>
 
-#include <libemail-engine/e-mail-folder-utils.h>
-#include <libemail-engine/e-mail-session.h>
+#include <libemail-engine/e-mail-session-utils.h>
 #include <libemail-engine/mail-ops.h>
 
 #include <mail/e-mail-reader.h>
@@ -1157,7 +1156,6 @@ got_message_draft_cb (EMsgComposer *composer,
 	EMailSession *session;
 	CamelMimeMessage *message;
 	CamelMessageInfo *info;
-	CamelFolder *folder;
 	GError *error = NULL;
 
 	message = e_msg_composer_get_message_draft_finish (
@@ -1188,10 +1186,6 @@ got_message_draft_cb (EMsgComposer *composer,
 	backend = E_MAIL_BACKEND (shell_backend);
 	session = e_mail_backend_get_session (backend);
 
-	/* Get the templates folder and all UIDs of the messages there. */
-	folder = e_mail_session_get_local_folder (
-		session, E_MAIL_LOCAL_FOLDER_TEMPLATES);
-
 	info = camel_message_info_new (NULL);
 
 	/* The last argument is a bit mask which tells the function
@@ -1200,9 +1194,11 @@ got_message_draft_cb (EMsgComposer *composer,
 	camel_message_info_set_flags (
 		info, CAMEL_MESSAGE_SEEN | CAMEL_MESSAGE_DRAFT, ~0);
 
-	/* FIXME No async callback, so... hope for the best? */
-	e_mail_folder_append_message (
-		folder, message, info, G_PRIORITY_DEFAULT,
+	/* FIXME Should submit an EActivity for this
+	 *       operation, same as saving to Outbox. */
+	e_mail_session_append_to_local_folder (
+		session, E_MAIL_LOCAL_FOLDER_TEMPLATES,
+		message, info, G_PRIORITY_DEFAULT,
 		NULL, (GAsyncReadyCallback) NULL, NULL);
 
 	g_object_unref (message);



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