[evolution-data-server/evolution-data-server-3-12] Bug 708166 - Update EClient properties on idle after GDBusProxy notify
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/evolution-data-server-3-12] Bug 708166 - Update EClient properties on idle after GDBusProxy notify
- Date: Mon, 20 Oct 2014 18:42:13 +0000 (UTC)
commit 20b0a18c1a48d072f3e0f25317fc620d403f5e67
Author: Milan Crha <mcrha redhat com>
Date: Mon Oct 20 20:41:47 2014 +0200
Bug 708166 - Update EClient properties on idle after GDBusProxy notify
addressbook/libebook/e-book-client.c | 106 ++++++++++++++++++++++------------
calendar/libecal/e-cal-client.c | 104 ++++++++++++++++++++++-----------
2 files changed, 139 insertions(+), 71 deletions(-)
---
diff --git a/addressbook/libebook/e-book-client.c b/addressbook/libebook/e-book-client.c
index b507c51..2ecf4f6 100644
--- a/addressbook/libebook/e-book-client.c
+++ b/addressbook/libebook/e-book-client.c
@@ -524,78 +524,91 @@ book_client_dbus_proxy_error_cb (EDBusAddressBook *dbus_proxy,
}
}
+typedef struct {
+ EClient *client;
+ EDBusAddressBook *dbus_proxy;
+ gchar *property_name;
+} IdleProxyNotifyData;
+
static void
-book_client_dbus_proxy_notify_cb (EDBusAddressBook *dbus_proxy,
- GParamSpec *pspec,
- GWeakRef *client_weak_ref)
+idle_proxy_notify_data_free (gpointer ptr)
{
- EClient *client;
+ IdleProxyNotifyData *ipn = ptr;
+
+ if (ipn) {
+ g_clear_object (&ipn->client);
+ g_clear_object (&ipn->dbus_proxy);
+ g_free (ipn->property_name);
+ g_free (ipn);
+ }
+}
+
+static gboolean
+book_client_dbus_proxy_notify_idle_cb (gpointer user_data)
+{
+ IdleProxyNotifyData *ipn = user_data;
const gchar *backend_prop_name = NULL;
- client = g_weak_ref_get (client_weak_ref);
- if (client == NULL)
- return;
+ g_return_val_if_fail (ipn != NULL, FALSE);
- if (g_str_equal (pspec->name, "cache-dir")) {
+ if (g_str_equal (ipn->property_name, "cache-dir")) {
backend_prop_name = CLIENT_BACKEND_PROPERTY_CACHE_DIR;
}
- if (g_str_equal (pspec->name, "capabilities")) {
+ if (g_str_equal (ipn->property_name, "capabilities")) {
gchar **strv;
gchar *csv = NULL;
backend_prop_name = CLIENT_BACKEND_PROPERTY_CAPABILITIES;
- strv = e_dbus_address_book_dup_capabilities (dbus_proxy);
+ strv = e_dbus_address_book_dup_capabilities (ipn->dbus_proxy);
if (strv != NULL) {
csv = g_strjoinv (",", strv);
g_strfreev (strv);
}
- e_client_set_capabilities (client, csv);
+ e_client_set_capabilities (ipn->client, csv);
g_free (csv);
}
- if (g_str_equal (pspec->name, "online")) {
+ if (g_str_equal (ipn->property_name, "online")) {
gboolean online;
backend_prop_name = CLIENT_BACKEND_PROPERTY_ONLINE;
- online = e_dbus_address_book_get_online (dbus_proxy);
- e_client_set_online (client, online);
+ online = e_dbus_address_book_get_online (ipn->dbus_proxy);
+ e_client_set_online (ipn->client, online);
}
- if (g_str_equal (pspec->name, "required-fields")) {
+ if (g_str_equal (ipn->property_name, "required-fields")) {
backend_prop_name = BOOK_BACKEND_PROPERTY_REQUIRED_FIELDS;
}
- if (g_str_equal (pspec->name, "revision")) {
+ if (g_str_equal (ipn->property_name, "revision")) {
backend_prop_name = CLIENT_BACKEND_PROPERTY_REVISION;
}
- if (g_str_equal (pspec->name, "supported-fields")) {
+ if (g_str_equal (ipn->property_name, "supported-fields")) {
backend_prop_name = BOOK_BACKEND_PROPERTY_SUPPORTED_FIELDS;
}
- if (g_str_equal (pspec->name, "writable")) {
+ if (g_str_equal (ipn->property_name, "writable")) {
gboolean writable;
backend_prop_name = CLIENT_BACKEND_PROPERTY_READONLY;
- writable = e_dbus_address_book_get_writable (dbus_proxy);
- e_client_set_readonly (client, !writable);
+ writable = e_dbus_address_book_get_writable (ipn->dbus_proxy);
+ e_client_set_readonly (ipn->client, !writable);
}
- if (g_str_equal (pspec->name, "locale")) {
+ if (g_str_equal (ipn->property_name, "locale")) {
backend_prop_name = "locale";
}
if (backend_prop_name != NULL) {
- GSource *idle_source;
- GMainContext *main_context;
SignalClosure *signal_closure;
signal_closure = g_slice_new0 (SignalClosure);
- g_weak_ref_init (&signal_closure->client, client);
+ g_weak_ref_init (&signal_closure->client, ipn->client);
signal_closure->property_name = g_strdup (backend_prop_name);
/* The 'locale' is not an EClient property, so just transport
@@ -603,22 +616,43 @@ book_client_dbus_proxy_notify_cb (EDBusAddressBook *dbus_proxy,
*/
if (g_str_equal (backend_prop_name, "locale"))
signal_closure->property_value =
- e_dbus_address_book_dup_locale (dbus_proxy);
+ e_dbus_address_book_dup_locale (ipn->dbus_proxy);
- main_context = e_client_ref_main_context (client);
+ book_client_emit_backend_property_changed_idle_cb (signal_closure);
+ signal_closure_free (signal_closure);
+ }
- idle_source = g_idle_source_new ();
- g_source_set_callback (
- idle_source,
- book_client_emit_backend_property_changed_idle_cb,
- signal_closure,
- (GDestroyNotify) signal_closure_free);
- g_source_attach (idle_source, main_context);
- g_source_unref (idle_source);
+ return FALSE;
+}
- g_main_context_unref (main_context);
- }
+static void
+book_client_dbus_proxy_notify_cb (EDBusAddressBook *dbus_proxy,
+ GParamSpec *pspec,
+ GWeakRef *client_weak_ref)
+{
+ EClient *client;
+ GSource *idle_source;
+ GMainContext *main_context;
+ IdleProxyNotifyData *ipn;
+
+ client = g_weak_ref_get (client_weak_ref);
+ if (client == NULL)
+ return;
+
+ ipn = g_new0 (IdleProxyNotifyData, 1);
+ ipn->client = g_object_ref (client);
+ ipn->dbus_proxy = g_object_ref (dbus_proxy);
+ ipn->property_name = g_strdup (pspec->name);
+ main_context = e_client_ref_main_context (client);
+
+ idle_source = g_idle_source_new ();
+ g_source_set_callback (idle_source, book_client_dbus_proxy_notify_idle_cb,
+ ipn, idle_proxy_notify_data_free);
+ g_source_attach (idle_source, main_context);
+ g_source_unref (idle_source);
+
+ g_main_context_unref (main_context);
g_object_unref (client);
}
diff --git a/calendar/libecal/e-cal-client.c b/calendar/libecal/e-cal-client.c
index 29ddb3d..6b42f3f 100644
--- a/calendar/libecal/e-cal-client.c
+++ b/calendar/libecal/e-cal-client.c
@@ -574,94 +574,128 @@ cal_client_dbus_proxy_error_cb (EDBusCalendar *dbus_proxy,
}
}
+typedef struct {
+ EClient *client;
+ EDBusCalendar *dbus_proxy;
+ gchar *property_name;
+} IdleProxyNotifyData;
+
static void
-cal_client_dbus_proxy_notify_cb (EDBusCalendar *dbus_proxy,
- GParamSpec *pspec,
- GWeakRef *client_weak_ref)
+idle_proxy_notify_data_free (gpointer ptr)
{
- EClient *client;
+ IdleProxyNotifyData *ipn = ptr;
+
+ if (ipn) {
+ g_clear_object (&ipn->client);
+ g_clear_object (&ipn->dbus_proxy);
+ g_free (ipn->property_name);
+ g_free (ipn);
+ }
+}
+
+static gboolean
+cal_client_dbus_proxy_notify_idle_cb (gpointer user_data)
+{
+ IdleProxyNotifyData *ipn = user_data;
const gchar *backend_prop_name = NULL;
- client = g_weak_ref_get (client_weak_ref);
- if (client == NULL)
- return;
+ g_return_val_if_fail (ipn != NULL, FALSE);
- if (g_str_equal (pspec->name, "alarm-email-address")) {
+ if (g_str_equal (ipn->property_name, "alarm-email-address")) {
backend_prop_name = CAL_BACKEND_PROPERTY_ALARM_EMAIL_ADDRESS;
}
- if (g_str_equal (pspec->name, "cache-dir")) {
+ if (g_str_equal (ipn->property_name, "cache-dir")) {
backend_prop_name = CLIENT_BACKEND_PROPERTY_CACHE_DIR;
}
- if (g_str_equal (pspec->name, "cal-email-address")) {
+ if (g_str_equal (ipn->property_name, "cal-email-address")) {
backend_prop_name = CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS;
}
- if (g_str_equal (pspec->name, "capabilities")) {
+ if (g_str_equal (ipn->property_name, "capabilities")) {
gchar **strv;
gchar *csv = NULL;
backend_prop_name = CLIENT_BACKEND_PROPERTY_CAPABILITIES;
- strv = e_dbus_calendar_dup_capabilities (dbus_proxy);
+ strv = e_dbus_calendar_dup_capabilities (ipn->dbus_proxy);
if (strv != NULL) {
csv = g_strjoinv (",", strv);
g_strfreev (strv);
}
- e_client_set_capabilities (client, csv);
+ e_client_set_capabilities (ipn->client, csv);
g_free (csv);
}
- if (g_str_equal (pspec->name, "default-object")) {
+ if (g_str_equal (ipn->property_name, "default-object")) {
backend_prop_name = CAL_BACKEND_PROPERTY_DEFAULT_OBJECT;
}
- if (g_str_equal (pspec->name, "online")) {
+ if (g_str_equal (ipn->property_name, "online")) {
gboolean online;
backend_prop_name = CLIENT_BACKEND_PROPERTY_ONLINE;
- online = e_dbus_calendar_get_online (dbus_proxy);
- e_client_set_online (client, online);
+ online = e_dbus_calendar_get_online (ipn->dbus_proxy);
+ e_client_set_online (ipn->client, online);
}
- if (g_str_equal (pspec->name, "revision")) {
+ if (g_str_equal (ipn->property_name, "revision")) {
backend_prop_name = CLIENT_BACKEND_PROPERTY_REVISION;
}
- if (g_str_equal (pspec->name, "writable")) {
+ if (g_str_equal (ipn->property_name, "writable")) {
gboolean writable;
backend_prop_name = CLIENT_BACKEND_PROPERTY_READONLY;
- writable = e_dbus_calendar_get_writable (dbus_proxy);
- e_client_set_readonly (client, !writable);
+ writable = e_dbus_calendar_get_writable (ipn->dbus_proxy);
+ e_client_set_readonly (ipn->client, !writable);
}
if (backend_prop_name != NULL) {
- GSource *idle_source;
- GMainContext *main_context;
SignalClosure *signal_closure;
signal_closure = g_slice_new0 (SignalClosure);
- g_weak_ref_init (&signal_closure->client, client);
+ g_weak_ref_init (&signal_closure->client, ipn->client);
signal_closure->property_name = g_strdup (backend_prop_name);
- main_context = e_client_ref_main_context (client);
+ cal_client_emit_backend_property_changed_idle_cb (signal_closure);
+ signal_closure_free (signal_closure);
+ }
- idle_source = g_idle_source_new ();
- g_source_set_callback (
- idle_source,
- cal_client_emit_backend_property_changed_idle_cb,
- signal_closure,
- (GDestroyNotify) signal_closure_free);
- g_source_attach (idle_source, main_context);
- g_source_unref (idle_source);
+ return FALSE;
+}
- g_main_context_unref (main_context);
- }
+static void
+cal_client_dbus_proxy_notify_cb (EDBusCalendar *dbus_proxy,
+ GParamSpec *pspec,
+ GWeakRef *client_weak_ref)
+{
+ EClient *client;
+ GSource *idle_source;
+ GMainContext *main_context;
+ IdleProxyNotifyData *ipn;
+ client = g_weak_ref_get (client_weak_ref);
+ if (client == NULL)
+ return;
+
+ ipn = g_new0 (IdleProxyNotifyData, 1);
+ ipn->client = g_object_ref (client);
+ ipn->dbus_proxy = g_object_ref (dbus_proxy);
+ ipn->property_name = g_strdup (pspec->name);
+
+ main_context = e_client_ref_main_context (client);
+
+ idle_source = g_idle_source_new ();
+ g_source_set_callback (idle_source, cal_client_dbus_proxy_notify_idle_cb,
+ ipn, idle_proxy_notify_data_free);
+ g_source_attach (idle_source, main_context);
+ g_source_unref (idle_source);
+
+ g_main_context_unref (main_context);
g_object_unref (client);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]