From 9ff43430bef0a2f169f1447a0c8edf68f692543a Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 13 Mar 2013 08:39:41 -0400 Subject: [PATCH] Add e_book_client_view_ref_client(). Replaces e_book_client_view_get_client(). --- addressbook/libebook/e-book-client-view.c | 109 ++++++++++++++++++--- addressbook/libebook/e-book-client-view.h | 7 +- .../backends/contacts/e-cal-backend-contacts.c | 16 ++- .../addressbook/libebook/libebook-sections.txt | 4 +- tests/libebook/client/test-client-photo-is-uri.c | 3 +- tests/libebook/client/test-client-revision-view.c | 8 +- .../client/test-client-suppress-notifications.c | 8 +- tests/libebook/client/test-client-uid-only-view.c | 8 +- 8 files changed, 143 insertions(+), 20 deletions(-) diff --git a/addressbook/libebook/e-book-client-view.c b/addressbook/libebook/e-book-client-view.c index dd91607..a06fb4c 100644 --- a/addressbook/libebook/e-book-client-view.c +++ b/addressbook/libebook/e-book-client-view.c @@ -227,11 +227,17 @@ book_client_view_emit_objects_added (EBookClientView *client_view, GMainContext *main_context; SignalClosure *signal_closure; + client = e_book_client_view_ref_client (client_view); + + /* Suppress any further signal emissions if + * our EBookClient has already been finalized. */ + if (client == NULL) + return; + signal_closure = g_slice_new0 (SignalClosure); g_weak_ref_set (&signal_closure->client_view, client_view); signal_closure->object_list = object_list; /* takes ownership */ - client = e_book_client_view_get_client (client_view); main_context = e_client_ref_main_context (E_CLIENT (client)); idle_source = g_idle_source_new (); @@ -244,6 +250,8 @@ book_client_view_emit_objects_added (EBookClientView *client_view, g_source_unref (idle_source); g_main_context_unref (main_context); + + g_object_unref (client); } static void @@ -255,11 +263,17 @@ book_client_view_emit_objects_modified (EBookClientView *client_view, GMainContext *main_context; SignalClosure *signal_closure; + client = e_book_client_view_ref_client (client_view); + + /* Suppress any further signal emissions if + * our EBookClient has already been finalized. */ + if (client == NULL) + return; + signal_closure = g_slice_new0 (SignalClosure); g_weak_ref_set (&signal_closure->client_view, client_view); signal_closure->object_list = object_list; /* takes ownership */ - client = e_book_client_view_get_client (client_view); main_context = e_client_ref_main_context (E_CLIENT (client)); idle_source = g_idle_source_new (); @@ -469,6 +483,13 @@ book_client_view_objects_removed_cb (EGdbusBookView *object, if (!client_view->priv->running) return; + client = e_book_client_view_ref_client (client_view); + + /* Suppress any further signal emissions if + * our EBookClient has already been finalized. */ + if (client == NULL) + return; + for (ii = 0; ids[ii] != NULL; ii++) list = g_slist_prepend (list, g_strdup (ids[ii])); @@ -476,7 +497,6 @@ book_client_view_objects_removed_cb (EGdbusBookView *object, g_weak_ref_set (&signal_closure->client_view, client_view); signal_closure->string_list = g_slist_reverse (list); - client = e_book_client_view_get_client (client_view); main_context = e_client_ref_main_context (E_CLIENT (client)); idle_source = g_idle_source_new (); @@ -489,6 +509,8 @@ book_client_view_objects_removed_cb (EGdbusBookView *object, g_source_unref (idle_source); g_main_context_unref (main_context); + + g_object_unref (client); } static void @@ -505,12 +527,18 @@ book_client_view_progress_cb (EGdbusBookView *object, if (!client_view->priv->running) return; + client = e_book_client_view_ref_client (client_view); + + /* Suppress any further signal emissions if + * our EBookClient has already been finalized. */ + if (client == NULL) + return; + signal_closure = g_slice_new0 (SignalClosure); g_weak_ref_set (&signal_closure->client_view, client_view); signal_closure->message = g_strdup (message); signal_closure->percent = percent; - client = e_book_client_view_get_client (client_view); main_context = e_client_ref_main_context (E_CLIENT (client)); idle_source = g_idle_source_new (); @@ -523,6 +551,8 @@ book_client_view_progress_cb (EGdbusBookView *object, g_source_unref (idle_source); g_main_context_unref (main_context); + + g_object_unref (client); } static void @@ -538,11 +568,17 @@ book_client_view_complete_cb (EGdbusBookView *object, if (!client_view->priv->running) return; + client = e_book_client_view_ref_client (client_view); + + /* Suppress any further signal emissions if + * our EBookClient has already been finalized. */ + if (client == NULL) + return; + signal_closure = g_slice_new0 (SignalClosure); g_weak_ref_set (&signal_closure->client_view, client_view); e_gdbus_templates_decode_error (in_error_strv, &signal_closure->error); - client = e_book_client_view_get_client (client_view); main_context = e_client_ref_main_context (E_CLIENT (client)); idle_source = g_idle_source_new (); @@ -557,6 +593,8 @@ book_client_view_complete_cb (EGdbusBookView *object, g_main_context_unref (main_context); client_view->priv->complete = TRUE; + + g_object_unref (client); } static void @@ -659,9 +697,9 @@ book_client_view_get_property (GObject *object, { switch (property_id) { case PROP_CLIENT: - g_value_set_object ( + g_value_take_object ( value, - e_book_client_view_get_client ( + e_book_client_view_ref_client ( E_BOOK_CLIENT_VIEW (object))); return; @@ -931,12 +969,35 @@ e_book_client_view_init (EBookClientView *view) } /** + * e_book_client_view_ref_client: + * @view: an #EBookClientView + * + * Returns the #EBookClientView:client associated with @view. + * + * The returned #EBookClient is referenced for thread-safety. Unreference + * the #EBookClient with g_object_unref() when finished with it. + * + * Returns: an #EBookClient + * + * Since: 3.10 + **/ +EBookClient * +e_book_client_view_ref_client (EBookClientView *view) +{ + g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (view), NULL); + + return g_object_ref (view->priv->client); +} + +/** * e_book_client_view_get_client: * @view: an #EBookClientView * - * Returns the #EBookClient associated with @view. + * Returns the #EBookClientView:client associated with @view. * * Returns: (transfer none): an #EBookClient + * + * Deprecated: 3.10: Use e_book_client_view_ref_client() instead. **/ EBookClient * e_book_client_view_get_client (EBookClientView *view) @@ -993,11 +1054,15 @@ void e_book_client_view_start (EBookClientView *view, GError **error) { + EBookClient *client; gboolean success; GError *local_error = NULL; g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (view)); + client = e_book_client_view_ref_client (view); + g_return_if_fail (client != NULL); + view->priv->running = TRUE; success = e_gdbus_book_view_call_start_sync ( @@ -1006,7 +1071,9 @@ e_book_client_view_start (EBookClientView *view, view->priv->running = FALSE; e_client_unwrap_dbus_error ( - E_CLIENT (view->priv->client), local_error, error); + E_CLIENT (client), local_error, error); + + g_object_unref (client); } /** @@ -1020,17 +1087,23 @@ void e_book_client_view_stop (EBookClientView *view, GError **error) { + EBookClient *client; GError *local_error = NULL; g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (view)); + client = e_book_client_view_ref_client (view); + g_return_if_fail (client != NULL); + view->priv->running = FALSE; e_gdbus_book_view_call_stop_sync ( view->priv->dbus_proxy, NULL, &local_error); e_client_unwrap_dbus_error ( - E_CLIENT (view->priv->client), local_error, error); + E_CLIENT (client), local_error, error); + + g_object_unref (client); } /** @@ -1048,15 +1121,21 @@ e_book_client_view_set_flags (EBookClientView *view, EBookClientViewFlags flags, GError **error) { + EBookClient *client; GError *local_error = NULL; g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (view)); + client = e_book_client_view_ref_client (view); + g_return_if_fail (client != NULL); + e_gdbus_book_view_call_set_flags_sync ( view->priv->dbus_proxy, flags, NULL, &local_error); e_client_unwrap_dbus_error ( - E_CLIENT (view->priv->client), local_error, error); + E_CLIENT (client), local_error, error); + + g_object_unref (client); } /** @@ -1082,11 +1161,15 @@ e_book_client_view_set_fields_of_interest (EBookClientView *view, const GSList *fields_of_interest, GError **error) { + EBookClient *client; gchar **strv; GError *local_error = NULL; g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (view)); + client = e_book_client_view_ref_client (view); + g_return_if_fail (client != NULL); + /* When in direct read access mode, ensure that the * backend is configured to only send us UIDs for everything, * @@ -1108,6 +1191,8 @@ e_book_client_view_set_fields_of_interest (EBookClientView *view, g_strfreev (strv); e_client_unwrap_dbus_error ( - E_CLIENT (view->priv->client), local_error, error); + E_CLIENT (client), local_error, error); + + g_object_unref (client); } diff --git a/addressbook/libebook/e-book-client-view.h b/addressbook/libebook/e-book-client-view.h index ad45644..b2b0f88 100644 --- a/addressbook/libebook/e-book-client-view.h +++ b/addressbook/libebook/e-book-client-view.h @@ -87,7 +87,7 @@ struct _EBookClientViewClass { GType e_book_client_view_get_type (void) G_GNUC_CONST; struct _EBookClient * - e_book_client_view_get_client (EBookClientView *view); + e_book_client_view_ref_client (EBookClientView *view); GDBusConnection * e_book_client_view_get_connection (EBookClientView *view); @@ -106,6 +106,11 @@ void e_book_client_view_set_flags (EBookClientView *view, EBookClientViewFlags flags, GError **error); +#ifndef EDS_DISABLE_DEPRECATED +struct _EBookClient * + e_book_client_view_get_client (EBookClientView *view); +#endif /* EDS_DISABLE_DEPRECATED */ + G_END_DECLS #endif /* E_BOOK_CLIENT_VIEW_H */ diff --git a/calendar/backends/contacts/e-cal-backend-contacts.c b/calendar/backends/contacts/e-cal-backend-contacts.c index 5d14659..e17f4ac 100644 --- a/calendar/backends/contacts/e-cal-backend-contacts.c +++ b/calendar/backends/contacts/e-cal-backend-contacts.c @@ -538,9 +538,13 @@ contacts_modified_cb (EBookClientView *book_view, gpointer user_data) { ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data); - EBookClient *book_client = e_book_client_view_get_client (book_view); + EBookClient *book_client; const GSList *ii; + book_client = e_book_client_view_ref_client (book_view); + if (book_client == NULL) + return; + g_rec_mutex_lock (&cbc->priv->tracked_contacts_lock); for (ii = contacts; ii; ii = ii->next) { @@ -566,6 +570,8 @@ contacts_modified_cb (EBookClientView *book_view, } g_rec_mutex_unlock (&cbc->priv->tracked_contacts_lock); + + g_object_unref (book_client); } static void @@ -574,9 +580,13 @@ contacts_added_cb (EBookClientView *book_view, gpointer user_data) { ECalBackendContacts *cbc = E_CAL_BACKEND_CONTACTS (user_data); - EBookClient *book_client = e_book_client_view_get_client (book_view); + EBookClient *book_client; const GSList *ii; + book_client = e_book_client_view_ref_client (book_view); + if (book_client == NULL) + return; + g_rec_mutex_lock (&cbc->priv->tracked_contacts_lock); /* See if any new contacts have BIRTHDAY or ANNIVERSARY fields */ @@ -599,6 +609,8 @@ contacts_added_cb (EBookClientView *book_view, } g_rec_mutex_unlock (&cbc->priv->tracked_contacts_lock); + + g_object_unref (book_client); } static void diff --git a/docs/reference/addressbook/libebook/libebook-sections.txt b/docs/reference/addressbook/libebook/libebook-sections.txt index e8a9f59..9075713 100644 --- a/docs/reference/addressbook/libebook/libebook-sections.txt +++ b/docs/reference/addressbook/libebook/libebook-sections.txt @@ -174,7 +174,7 @@ e_book_client_error_quark e-book-client-view EBookClientView EBookClientView -e_book_client_view_get_client +e_book_client_view_ref_client e_book_client_view_get_connection e_book_client_view_get_object_path e_book_client_view_is_running @@ -182,6 +182,8 @@ e_book_client_view_set_fields_of_interest e_book_client_view_start e_book_client_view_stop e_book_client_view_set_flags + +e_book_client_view_get_client E_BOOK_CLIENT_VIEW E_IS_BOOK_CLIENT_VIEW diff --git a/tests/libebook/client/test-client-photo-is-uri.c b/tests/libebook/client/test-client-photo-is-uri.c index a310b2b..ff591d0 100644 --- a/tests/libebook/client/test-client-photo-is-uri.c +++ b/tests/libebook/client/test-client-photo-is-uri.c @@ -184,7 +184,7 @@ static void complete (EBookClientView *view, const GError *error) { - EBookClient *book = e_book_client_view_get_client (view); + EBookClient *book = e_book_client_view_ref_client (view); GError *local_error = NULL; g_print ("View complete, iteration %d\n", iteration); @@ -227,6 +227,7 @@ complete (EBookClientView *view, break; } + g_object_unref (book); } static void diff --git a/tests/libebook/client/test-client-revision-view.c b/tests/libebook/client/test-client-revision-view.c index f8f2979..370f15c 100644 --- a/tests/libebook/client/test-client-revision-view.c +++ b/tests/libebook/client/test-client-revision-view.c @@ -111,9 +111,15 @@ static void complete (EBookClientView *view, const GError *error) { + EBookClient *client; + + client = e_book_client_view_ref_client (view); + /* Now add a contact and assert that we received notification */ loading_view = FALSE; - add_contact (e_book_client_view_get_client (view)); + add_contact (client); + + g_object_unref (client); } static void diff --git a/tests/libebook/client/test-client-suppress-notifications.c b/tests/libebook/client/test-client-suppress-notifications.c index ea86fed..5fe0bea 100644 --- a/tests/libebook/client/test-client-suppress-notifications.c +++ b/tests/libebook/client/test-client-suppress-notifications.c @@ -77,9 +77,15 @@ static void complete (EBookClientView *view, const GError *error) { + EBookClient *client; + + client = e_book_client_view_ref_client (view); + /* Now add a contact and assert that we received notification */ loading_view = FALSE; - add_contact (e_book_client_view_get_client (view)); + add_contact (client); + + g_object_unref (client); } static void diff --git a/tests/libebook/client/test-client-uid-only-view.c b/tests/libebook/client/test-client-uid-only-view.c index aab3b4c..807669c 100644 --- a/tests/libebook/client/test-client-uid-only-view.c +++ b/tests/libebook/client/test-client-uid-only-view.c @@ -187,9 +187,15 @@ static void complete (EBookClientView *view, const GError *error) { + EBookClient *client; + + client = e_book_client_view_ref_client (view); + /* Now add a contact and assert that we received notification */ loading_view = FALSE; - add_contact (e_book_client_view_get_client (view)); + add_contact (client); + + g_object_unref (client); } static void -- 2.7.4