summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2013-09-27 12:25:34 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2013-09-27 13:42:56 +0200
commitbb5133759bc92716c24770e46fc95ad7d8073980 (patch)
tree10f563ae7a679ca71912960b6b3e4a25eada5dc9
parent9acc98e7c25b1b9bb7f779c595e05a9d88035c48 (diff)
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
-rw-r--r--telepathy-logger/log-manager.c60
-rw-r--r--tests/dbus/test-log-manager.c45
2 files changed, 104 insertions, 1 deletions
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);
+ }
}
/**
diff --git a/tests/dbus/test-log-manager.c b/tests/dbus/test-log-manager.c
index a6e9f5f..5441b87 100644
--- a/tests/dbus/test-log-manager.c
+++ b/tests/dbus/test-log-manager.c
@@ -387,6 +387,47 @@ test_get_events_for_date (TestCaseFixture *fixture,
g_list_free (fixture->ret);
}
+static void
+test_get_events_for_date_account_unprepared (TestCaseFixture *fixture,
+ gconstpointer user_data)
+{
+ GHashTable *params = (GHashTable *) user_data;
+ TplEntity *entity;
+ GDate *date;
+ TpAccount *account;
+ const gchar *account_path;
+
+ g_clear_object (&fixture->account);
+
+ account_path = g_value_get_string (
+ (const GValue *) g_hash_table_lookup (params, "account-path"));
+
+ account = tp_simple_client_factory_ensure_account (fixture->factory,
+ account_path, NULL, NULL);
+ g_assert (!tp_proxy_is_prepared (account, TP_ACCOUNT_FEATURE_CORE));
+
+ entity = tpl_entity_new (ID, TPL_ENTITY_CONTACT, NULL, NULL);
+ date = g_date_new_dmy (13, 1, 2010);
+
+ tpl_log_manager_get_events_for_date_async (fixture->manager,
+ account,
+ entity,
+ TPL_EVENT_MASK_TEXT,
+ date,
+ get_events_for_date_cb,
+ fixture);
+ g_main_loop_run (fixture->main_loop);
+
+ g_object_unref (entity);
+ g_date_free (date);
+
+ /* We got 6 events in old Empathy and 6 in new TpLogger storage */
+ g_assert_cmpint (g_list_length (fixture->ret), ==, 12);
+
+ g_list_foreach (fixture->ret, (GFunc) g_object_unref, NULL);
+ g_list_free (fixture->ret);
+ g_object_unref (account);
+}
static void
get_filtered_events_cb (GObject *object,
@@ -738,6 +779,10 @@ main (int argc, char **argv)
TestCaseFixture, params,
setup, test_get_events_for_date, teardown);
+ g_test_add ("/log-manager/get-events-for-date-account-unprepared",
+ TestCaseFixture, params,
+ setup, test_get_events_for_date_account_unprepared, teardown);
+
g_test_add ("/log-manager/get-filtered-events",
TestCaseFixture, params,
setup, test_get_filtered_events, teardown);