[evolution-data-server] CamelTransport: Remove all asynchronous class methods.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] CamelTransport: Remove all asynchronous class methods.
- Date: Fri, 29 Nov 2013 20:16:09 +0000 (UTC)
commit 08453df898706c725045ce0c5c370ae4148329bb
Author: Matthew Barnes <mbarnes redhat com>
Date: Thu Nov 28 08:35:00 2013 -0500
CamelTransport: Remove all asynchronous class methods.
Rationale:
When I originally added Camel's asynchronous API, I thought providers
could choose to override the synchronous or asynchronous class methods.
Years later, turns out the asynchronous methods were never overridden,
and it wouldn't have worked anyway. The asynchronous methods by default
invoke an associated synchronous function from a worker thread, but many
of Camel's synchronous functions do extra processing around invoking the
synchronous class method. camel_store_get_folder_sync() is an example.
If a provider tried to implement synchronous methods in terms of the
asynchronous methods, then that extra processing in the synchronous
functions could potentially get skipped.
Removing the asynchronous class methods should help clarify how Camel
providers are intended to be written.
The removal should have no impact on existing Camel providers, all of
which implement only the synchronous class methods. I've even padded
the CamelTransportClass struct to keep the binary interface intact.
camel/camel-transport.c | 129 +++++++++++++++++------------------------------
camel/camel-transport.h | 14 +----
2 files changed, 48 insertions(+), 95 deletions(-)
---
diff --git a/camel/camel-transport.c b/camel/camel-transport.c
index 66dd0b0..ef9cd9b 100644
--- a/camel/camel-transport.c
+++ b/camel/camel-transport.c
@@ -80,74 +80,6 @@ transport_finalize (GObject *object)
}
static void
-transport_send_to_thread (GSimpleAsyncResult *simple,
- GObject *object,
- GCancellable *cancellable)
-{
- AsyncContext *async_context;
- GError *error = NULL;
-
- async_context = g_simple_async_result_get_op_res_gpointer (simple);
-
- camel_transport_send_to_sync (
- CAMEL_TRANSPORT (object), async_context->message,
- async_context->from, async_context->recipients,
- cancellable, &error);
-
- if (error != NULL)
- g_simple_async_result_take_error (simple, error);
-}
-
-static void
-transport_send_to (CamelTransport *transport,
- CamelMimeMessage *message,
- CamelAddress *from,
- CamelAddress *recipients,
- gint io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
-{
- GSimpleAsyncResult *simple;
- AsyncContext *async_context;
-
- async_context = g_slice_new0 (AsyncContext);
- async_context->from = g_object_ref (from);
- async_context->recipients = g_object_ref (recipients);
- async_context->message = g_object_ref (message);
-
- simple = g_simple_async_result_new (
- G_OBJECT (transport), callback, user_data, transport_send_to);
-
- g_simple_async_result_set_check_cancellable (simple, cancellable);
-
- g_simple_async_result_set_op_res_gpointer (
- simple, async_context, (GDestroyNotify) async_context_free);
-
- g_simple_async_result_run_in_thread (
- simple, transport_send_to_thread, io_priority, cancellable);
-
- g_object_unref (simple);
-}
-
-static gboolean
-transport_send_to_finish (CamelTransport *transport,
- GAsyncResult *result,
- GError **error)
-{
- GSimpleAsyncResult *simple;
-
- g_return_val_if_fail (
- g_simple_async_result_is_valid (
- result, G_OBJECT (transport), transport_send_to), FALSE);
-
- simple = G_SIMPLE_ASYNC_RESULT (result);
-
- /* Assume success unless a GError is set. */
- return !g_simple_async_result_propagate_error (simple, error);
-}
-
-static void
camel_transport_class_init (CamelTransportClass *class)
{
GObjectClass *object_class;
@@ -156,9 +88,6 @@ camel_transport_class_init (CamelTransportClass *class)
object_class = G_OBJECT_CLASS (class);
object_class->finalize = transport_finalize;
-
- class->send_to = transport_send_to;
- class->send_to_finish = transport_send_to_finish;
}
static void
@@ -222,6 +151,26 @@ camel_transport_send_to_sync (CamelTransport *transport,
return success;
}
+/* Helper for camel_transport_send_to() */
+static void
+transport_send_to_thread (GSimpleAsyncResult *simple,
+ GObject *object,
+ GCancellable *cancellable)
+{
+ AsyncContext *async_context;
+ GError *error = NULL;
+
+ async_context = g_simple_async_result_get_op_res_gpointer (simple);
+
+ camel_transport_send_to_sync (
+ CAMEL_TRANSPORT (object), async_context->message,
+ async_context->from, async_context->recipients,
+ cancellable, &error);
+
+ if (error != NULL)
+ g_simple_async_result_take_error (simple, error);
+}
+
/**
* camel_transport_send_to:
* @transport: a #CamelTransport
@@ -252,19 +201,32 @@ camel_transport_send_to (CamelTransport *transport,
GAsyncReadyCallback callback,
gpointer user_data)
{
- CamelTransportClass *class;
+ GSimpleAsyncResult *simple;
+ AsyncContext *async_context;
g_return_if_fail (CAMEL_IS_TRANSPORT (transport));
g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message));
g_return_if_fail (CAMEL_IS_ADDRESS (from));
g_return_if_fail (CAMEL_IS_ADDRESS (recipients));
- class = CAMEL_TRANSPORT_GET_CLASS (transport);
- g_return_if_fail (class->send_to != NULL);
+ async_context = g_slice_new0 (AsyncContext);
+ async_context->from = g_object_ref (from);
+ async_context->recipients = g_object_ref (recipients);
+ async_context->message = g_object_ref (message);
+
+ simple = g_simple_async_result_new (
+ G_OBJECT (transport), callback, user_data,
+ camel_transport_send_to);
- class->send_to (
- transport, message, from, recipients, io_priority,
- cancellable, callback, user_data);
+ g_simple_async_result_set_check_cancellable (simple, cancellable);
+
+ g_simple_async_result_set_op_res_gpointer (
+ simple, async_context, (GDestroyNotify) async_context_free);
+
+ g_simple_async_result_run_in_thread (
+ simple, transport_send_to_thread, io_priority, cancellable);
+
+ g_object_unref (simple);
}
/**
@@ -284,13 +246,14 @@ camel_transport_send_to_finish (CamelTransport *transport,
GAsyncResult *result,
GError **error)
{
- CamelTransportClass *class;
+ GSimpleAsyncResult *simple;
- g_return_val_if_fail (CAMEL_IS_TRANSPORT (transport), FALSE);
- g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
+ g_return_val_if_fail (
+ g_simple_async_result_is_valid (
+ result, G_OBJECT (transport), camel_transport_send_to), FALSE);
- class = CAMEL_TRANSPORT_GET_CLASS (transport);
- g_return_val_if_fail (class->send_to_finish != NULL, FALSE);
+ simple = G_SIMPLE_ASYNC_RESULT (result);
- return class->send_to_finish (transport, result, error);
+ /* Assume success unless a GError is set. */
+ return !g_simple_async_result_propagate_error (simple, error);
}
diff --git a/camel/camel-transport.h b/camel/camel-transport.h
index b5801f5..712d5f5 100644
--- a/camel/camel-transport.h
+++ b/camel/camel-transport.h
@@ -75,18 +75,8 @@ struct _CamelTransportClass {
GCancellable *cancellable,
GError **error);
- /* Asynchronous I/O Methods (all have defaults) */
- void (*send_to) (CamelTransport *transport,
- CamelMimeMessage *message,
- CamelAddress *from,
- CamelAddress *recipients,
- gint io_priority,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
- gboolean (*send_to_finish) (CamelTransport *transport,
- GAsyncResult *result,
- GError **error);
+ /* Reserved slots. */
+ gpointer reserved[2];
};
GType camel_transport_get_type (void);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]