From bb5133759bc92716c24770e46fc95ad7d8073980 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Fri, 27 Sep 2013 12:25:34 +0200 Subject: Prepare TpAccount if needed Make sure that the TpAccount we receive from public API is prepared as more and more API are relying on it. https://bugs.freedesktop.org/show_bug.cgi?id=69814 --- telepathy-logger/log-manager.c | 60 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'telepathy-logger') diff --git a/telepathy-logger/log-manager.c b/telepathy-logger/log-manager.c index 944b741..64ffca7 100644 --- a/telepathy-logger/log-manager.c +++ b/telepathy-logger/log-manager.c @@ -870,13 +870,71 @@ _get_dates_async_thread (GSimpleAsyncResult *simple, _list_of_date_free); } +typedef struct +{ + GSimpleAsyncResult *result; + GSimpleAsyncThreadFunc func; +} AsyncOpData; + +static AsyncOpData * +async_op_data_new (GSimpleAsyncResult *result, + GSimpleAsyncThreadFunc func) +{ + AsyncOpData *data = g_slice_new (AsyncOpData); + + data->result = g_object_ref (result); + data->func = func; + return data; +} + +static void +async_op_data_free (AsyncOpData *data) +{ + g_object_unref (data->result); + g_slice_free (AsyncOpData, data); +} + +static void +account_prepared_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + AsyncOpData *data = user_data; + GError *error = NULL; + + if (!tp_proxy_prepare_finish (source, result, &error)) + { + g_simple_async_result_take_error (data->result, error); + g_simple_async_result_complete (data->result); + } + else + { + g_simple_async_result_run_in_thread (data->result, data->func, 0, NULL); + } + + async_op_data_free (data); +} static void start_async_op_in_thread (TpAccount *account, GSimpleAsyncResult *result, GSimpleAsyncThreadFunc func) { - g_simple_async_result_run_in_thread (result, func, 0, NULL); + if (account != NULL) + { + GQuark features[] = { TP_ACCOUNT_FEATURE_CORE, 0 }; + + /* Most APIs rely on TpAccount being prepared, so make sure + * it is. telepathy-glib is not thread-safe, so we must do + * this in the main thread, before starting the actual + * operation in the other thread. */ + tp_proxy_prepare_async (account, features, account_prepared_cb, + async_op_data_new (result, func)); + } + else + { + g_simple_async_result_run_in_thread (result, func, 0, NULL); + } } /** -- cgit v1.2.1