From b632849aefb2292231765c0218db36b4a6842e9a Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 17 Aug 2009 14:15:38 -0500 Subject: Pushing in Pidgin code, doesn't compile. --- src/status-provider-pidgin.c | 118 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 4 deletions(-) (limited to 'src/status-provider-pidgin.c') diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index aaa8732..ab71755 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -100,6 +100,25 @@ status_provider_pidgin_class_init (StatusProviderPidginClass *klass) return; } +static void +changed_status (DBusGProxy * proxy, gint savedstatus, GError ** error, StatusProviderPidgin * spp) +{ + + return; +} + +static void +proxy_destroy (DBusGProxy * proxy, StatusProviderPidgin * spp) +{ + StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(spp); + + priv->proxy = NULL; + priv->pg_status = PG_STATUS_OFFLINE; + + g_signal_emit(G_OBJECT(spp), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, pg_to_sp_map[priv->pg_status], TRUE); + return; +} + static void status_provider_pidgin_init (StatusProviderPidgin *self) { @@ -121,6 +140,30 @@ status_provider_pidgin_init (StatusProviderPidgin *self) if (error != NULL) { g_debug("Unable to get Pidgin proxy: %s", error->message); g_error_free(error); + return; + } + + if (priv->proxy != NULL) { + g_object_add_weak_pointer (G_OBJECT(priv->proxy), (gpointer *)&priv->proxy); + g_signal_connect(G_OBJECT(priv->proxy), "destroy", + G_CALLBACK(proxy_destroy), self); + + g_debug("Adding Pidgin Signals"); + dbus_g_object_register_marshaller(_status_provider_pidgin_marshal_VOID__INT_INT, + G_TYPE_NONE, + G_TYPE_INT, + G_TYPE_INT, + G_TYPE_INVALID); + dbus_g_proxy_add_signal (priv->proxy, + "SavedstatusChanged", + G_TYPE_INT, + G_TYPE_INT, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal(priv->proxy, + "SavedstatusChanged", + G_CALLBACK(changed_status), + (void *)self, + NULL); } return; @@ -167,12 +210,79 @@ status_provider_pidgin_new (void) static void set_status (StatusProvider * sp, StatusProviderStatus status) { - g_debug("\tSetting Pidgin Status: %d", status); + gchar * message = ""; + g_return_if_fail(IS_STATUS_PROVIDER_PIDGIN(sp)); StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(sp); - pg_status_t pg_status = sp_to_pg_map[status]; - priv->pg_status = pg_status; - g_signal_emit(G_OBJECT(sp), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, pg_to_sp_map[priv->pg_status], TRUE); + + g_debug("\tPidgin set status to %d", status); + if (priv->proxy == NULL) { + return; + } + + priv->pg_status = sp_to_pg_map[status]; + gint status_val = 0; + gboolean ret = FALSE; + GError * error = NULL; + + ret = dbus_g_proxy_call(priv->proxy, + "PurpleSavedstatusFindTransientByTypeAndMessage", &error, + G_TYPE_INT, priv->pg_status, + G_TYPE_STRING, message, + G_TYPE_INVALID, + G_TYPE_INT, &status_val, + G_TYPE_INVALID); + + if (!ret) { + if (error != NULL) { + g_error_free(error); + } + error = NULL; + status_val = 0; + g_debug("No Pidgin saved status to apply"); + } + + if (status_val == 0) { + ret = dbus_g_proxy_call(priv->proxy, + "PurpleSavedstatusNew", &error, + G_TYPE_STRING, message, + G_TYPE_INT, priv->pg_status, + G_TYPE_INVALID, + G_TYPE_INT, &status_val, + G_TYPE_INVALID); + + if (!ret) { + status_val = 0; + if (error != NULL) { + g_warning("Unable to create Pidgin status for %d: %s", status, error->message); + g_error_free(error); + } else { + g_warning("Unable to create Pidgin status for %d", status); + } + error = NULL; + } + } + + if (status_val == 0) { + return; + } + + ret = dbus_g_proxy_call(priv->proxy, + "PurpleSavedstatusActivate", &error, + G_TYPE_INT, status_val, + G_TYPE_INVALID, + G_TYPE_INVALID); + + if (!ret) { + if (error != NULL) { + g_warning("Pidgin unable to change to status: %s", error->message); + g_error_free(error); + } else { + g_warning("Pidgin unable to change to status"); + } + error = NULL; + } + return; } -- cgit v1.2.3 From a2f9b2b061063f4878573705ddf356b7b5cbd4cb Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 17 Aug 2009 14:22:11 -0500 Subject: Setting up a list of marshallers for the pidgin functionality --- src/status-provider-pidgin.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/status-provider-pidgin.c') diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index ab71755..1d09ec8 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -26,6 +26,7 @@ with this program. If not, see . #include "status-provider.h" #include "status-provider-pidgin.h" +#include "status-provider-pidgin-marshal.h" #include -- cgit v1.2.3 From 2c69e50476ce831a8b878c76f3534263926be575 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 17 Aug 2009 16:29:54 -0500 Subject: Now we can set the value in Pidgin and have it come back over the wire --- src/status-provider-pidgin.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'src/status-provider-pidgin.c') diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index 1d09ec8..342cddc 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -102,12 +102,46 @@ status_provider_pidgin_class_init (StatusProviderPidginClass *klass) } static void -changed_status (DBusGProxy * proxy, gint savedstatus, GError ** error, StatusProviderPidgin * spp) +type_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) +{ + GError * error = NULL; + gint status = 0; + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_INT, &status, G_TYPE_INVALID)) { + g_warning("Unable to get type from Pidgin: %s", error->message); + g_error_free(error); + return; + } + + StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(userdata); + if (status != priv->pg_status) { + priv->pg_status = status; + + g_signal_emit(G_OBJECT(userdata), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, pg_to_sp_map[priv->pg_status], TRUE); + } + + return; +} + +static void +saved_status_to_type (StatusProviderPidgin * spp, gint savedstatus) { + StatusProviderPidginPrivate * priv = STATUS_PROVIDER_PIDGIN_GET_PRIVATE(spp); + + g_debug("Pidgin figuring out type for %d", savedstatus); + dbus_g_proxy_begin_call(priv->proxy, + "PurpleSavedstatusGetType", type_cb, spp, NULL, + G_TYPE_INT, savedstatus, G_TYPE_INVALID); return; } +static void +changed_status (DBusGProxy * proxy, gint savedstatus, GError ** error, StatusProviderPidgin * spp) +{ + saved_status_to_type(spp, savedstatus); + return; +} + static void proxy_destroy (DBusGProxy * proxy, StatusProviderPidgin * spp) { -- cgit v1.2.3 From 7917b6f262b675546cd878925c5601ba6b9da116 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 17 Aug 2009 16:31:38 -0500 Subject: Should update for local changes as well. --- src/status-provider-pidgin.c | 1 + 1 file changed, 1 insertion(+) (limited to 'src/status-provider-pidgin.c') diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index 342cddc..53b8e6d 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -318,6 +318,7 @@ set_status (StatusProvider * sp, StatusProviderStatus status) error = NULL; } + g_signal_emit(G_OBJECT(sp), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, pg_to_sp_map[priv->pg_status], TRUE); return; } -- cgit v1.2.3 From d539c58cdce66db1be5cd49181d47cbf64731c49 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 17 Aug 2009 16:52:43 -0500 Subject: Initially querying the status so that when we start, we get the right value. --- src/status-provider-pidgin.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/status-provider-pidgin.c') diff --git a/src/status-provider-pidgin.c b/src/status-provider-pidgin.c index 53b8e6d..052ce12 100644 --- a/src/status-provider-pidgin.c +++ b/src/status-provider-pidgin.c @@ -135,6 +135,22 @@ saved_status_to_type (StatusProviderPidgin * spp, gint savedstatus) return; } +static void +savedstatus_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) +{ + GError * error = NULL; + gint status = 0; + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_INT, &status, G_TYPE_INVALID)) { + g_warning("Unable to get saved status from Pidgin: %s", error->message); + g_error_free(error); + return; + } + + saved_status_to_type(STATUS_PROVIDER_PIDGIN(userdata), status); + return; +} + + static void changed_status (DBusGProxy * proxy, gint savedstatus, GError ** error, StatusProviderPidgin * spp) { @@ -199,6 +215,13 @@ status_provider_pidgin_init (StatusProviderPidgin *self) G_CALLBACK(changed_status), (void *)self, NULL); + + dbus_g_proxy_begin_call(priv->proxy, + "PurpleSavedstatusGetCurrent", + savedstatus_cb, + self, + NULL, + G_TYPE_INVALID); } return; -- cgit v1.2.3