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') 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/Makefile.am | 21 ++++++++++++++++++--- src/status-provider-pidgin.c | 1 + src/status-provider-pidgin.list | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 src/status-provider-pidgin.list (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index bc3c9d9..736fd61 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -28,7 +28,9 @@ indicator_status_service_SOURCES = \ status-provider.h \ status-provider.c \ status-provider-pidgin.h \ - status-provider-pidgin.c + status-provider-pidgin.c \ + status-provider-pidgin-marshal.h \ + status-provider-pidgin-marshal.c indicator_status_service_CFLAGS = $(STATUSSERVICE_CFLAGS) -Wall -Werror indicator_status_service_LDADD = $(STATUSSERVICE_LIBS) @@ -46,6 +48,16 @@ status-service-server.h: $(srcdir)/status-service.xml --output=status-service-server.h \ $(srcdir)/status-service.xml +status-provider-pidgin-marshal.h: $(srcdir)/status-provider-pidgin.list + glib-genmarshal --header \ + --prefix=_status_provider_pidgin_marshal $(srcdir)/status-provider-pidgin.list \ + > status-provider-pidgin-marshal.h + +status-provider-pidgin-marshal.c: $(srcdir)/status-provider-pidgin.list + glib-genmarshal --body \ + --prefix=_status_provider_pidgin_marshal $(srcdir)/status-provider-pidgin.list \ + > status-provider-pidgin-marshal.c + ############### # Users Stuff ############### @@ -68,10 +80,13 @@ indicator_session_service_LDADD = $(SESSIONSERVICE_LIBS) BUILT_SOURCES = \ status-service-client.h \ - status-service-server.h + status-service-server.h \ + status-provider-pidgin-marshal.h \ + status-provider-pidgin-marshal.c EXTRA_DIST = \ - status-service.xml + status-service.xml \ + status-provider-pidgin.list CLEANFILES = \ $(BUILT_SOURCES) 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 diff --git a/src/status-provider-pidgin.list b/src/status-provider-pidgin.list new file mode 100644 index 0000000..1f953dd --- /dev/null +++ b/src/status-provider-pidgin.list @@ -0,0 +1 @@ +VOID:INT,INT -- 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') 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') 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') 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 From a52eb4af8fd90ae883ad511fbce0bc9297dbaca5 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 17 Aug 2009 17:07:07 -0500 Subject: Some marshallers for the Telepathy status stuff. --- src/Makefile.am | 21 ++++++++++++++++++--- src/status-provider-telepathy.list | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 src/status-provider-telepathy.list (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index 736fd61..a014128 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -30,7 +30,9 @@ indicator_status_service_SOURCES = \ status-provider-pidgin.h \ status-provider-pidgin.c \ status-provider-pidgin-marshal.h \ - status-provider-pidgin-marshal.c + status-provider-pidgin-marshal.c \ + status-provider-telepathy-marshal.h \ + status-provider-telepathy-marshal.c indicator_status_service_CFLAGS = $(STATUSSERVICE_CFLAGS) -Wall -Werror indicator_status_service_LDADD = $(STATUSSERVICE_LIBS) @@ -58,6 +60,16 @@ status-provider-pidgin-marshal.c: $(srcdir)/status-provider-pidgin.list --prefix=_status_provider_pidgin_marshal $(srcdir)/status-provider-pidgin.list \ > status-provider-pidgin-marshal.c +status-provider-telepathy-marshal.h: $(srcdir)/status-provider-telepathy.list + glib-genmarshal --header \ + --prefix=_status_provider_telepathy_marshal $(srcdir)/status-provider-telepathy.list \ + > status-provider-telepathy-marshal.h + +status-provider-telepathy-marshal.c: $(srcdir)/status-provider-telepathy.list + glib-genmarshal --body \ + --prefix=_status_provider_telepathy_marshal $(srcdir)/status-provider-telepathy.list \ + > status-provider-telepathy-marshal.c + ############### # Users Stuff ############### @@ -82,11 +94,14 @@ BUILT_SOURCES = \ status-service-client.h \ status-service-server.h \ status-provider-pidgin-marshal.h \ - status-provider-pidgin-marshal.c + status-provider-pidgin-marshal.c \ + status-provider-telepathy-marshal.h \ + status-provider-telepathy-marshal.c EXTRA_DIST = \ status-service.xml \ - status-provider-pidgin.list + status-provider-pidgin.list \ + status-provider-telepathy.list CLEANFILES = \ $(BUILT_SOURCES) diff --git a/src/status-provider-telepathy.list b/src/status-provider-telepathy.list new file mode 100644 index 0000000..5ab45bf --- /dev/null +++ b/src/status-provider-telepathy.list @@ -0,0 +1 @@ +VOID:UINT,STRING -- cgit v1.2.3 From f022d796081febf634787868ddd93d5e19431786 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 17 Aug 2009 17:20:45 -0500 Subject: Getting more of a basis for Telepathy stuff --- src/Makefile.am | 2 + src/status-provider-telepathy.c | 113 ++++++++++++++++++++++++++++++++++++++++ src/status-provider-telepathy.h | 56 ++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 src/status-provider-telepathy.c create mode 100644 src/status-provider-telepathy.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index a014128..dbe6d0f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,6 +31,8 @@ indicator_status_service_SOURCES = \ status-provider-pidgin.c \ status-provider-pidgin-marshal.h \ status-provider-pidgin-marshal.c \ + status-provider-telepathy.h \ + status-provider-telepathy.c \ status-provider-telepathy-marshal.h \ status-provider-telepathy-marshal.c indicator_status_service_CFLAGS = $(STATUSSERVICE_CFLAGS) -Wall -Werror diff --git a/src/status-provider-telepathy.c b/src/status-provider-telepathy.c new file mode 100644 index 0000000..339ede3 --- /dev/null +++ b/src/status-provider-telepathy.c @@ -0,0 +1,113 @@ +/* +A small wrapper utility to load indicators and put them as menu items +into the gnome-panel using it's applet interface. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "status-provider.h" +#include "status-provider-telepathy.h" +#include "status-provider-telepathy-marshal.h" + +#include + + +typedef struct _StatusProviderTelepathyPrivate StatusProviderTelepathyPrivate; +struct _StatusProviderTelepathyPrivate { + DBusGProxy * proxy; +}; + +#define STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(o) \ +(G_TYPE_INSTANCE_GET_PRIVATE ((o), STATUS_PROVIDER_TELEPATHY_TYPE, StatusProviderTelepathyPrivate)) + +/* Prototypes */ +/* GObject stuff */ +static void status_provider_telepathy_class_init (StatusProviderTelepathyClass *klass); +static void status_provider_telepathy_init (StatusProviderTelepathy *self); +static void status_provider_telepathy_dispose (GObject *object); +static void status_provider_telepathy_finalize (GObject *object); + +G_DEFINE_TYPE (StatusProviderTelepathy, status_provider_telepathy, STATUS_PROVIDER_TYPE); + +static void +status_provider_telepathy_class_init (StatusProviderTelepathyClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (StatusProviderTelepathyPrivate)); + + object_class->dispose = status_provider_telepathy_dispose; + object_class->finalize = status_provider_telepathy_finalize; + + //StatusProviderClass * spclass = STATUS_PROVIDER_CLASS(klass); + + //spclass->set_status = set_status; + //spclass->get_status = get_status; + + return; +} + + +static void +status_provider_telepathy_init (StatusProviderTelepathy *self) +{ + //StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(self); + + return; +} + +static void +status_provider_telepathy_dispose (GObject *object) +{ + StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(object); + + if (priv->proxy != NULL) { + g_object_unref(priv->proxy); + priv->proxy = NULL; + } + + G_OBJECT_CLASS (status_provider_telepathy_parent_class)->dispose (object); + return; +} + +static void +status_provider_telepathy_finalize (GObject *object) +{ + + G_OBJECT_CLASS (status_provider_telepathy_parent_class)->finalize (object); + return; +} + +/** + status_provider_telepathy_new: + + Creates a new #StatusProviderTelepathy object. No parameters or anything + like that. Just a convience function. + + Return value: A new instance of #StatusProviderTelepathy +*/ +StatusProvider * +status_provider_telepathy_new (void) +{ + return STATUS_PROVIDER(g_object_new(STATUS_PROVIDER_TELEPATHY_TYPE, NULL)); +} + diff --git a/src/status-provider-telepathy.h b/src/status-provider-telepathy.h new file mode 100644 index 0000000..a67ee40 --- /dev/null +++ b/src/status-provider-telepathy.h @@ -0,0 +1,56 @@ +/* +A small wrapper utility to load indicators and put them as menu items +into the gnome-panel using it's applet interface. + +Copyright 2009 Canonical Ltd. + +Authors: + Ted Gould + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + +#ifndef __STATUS_PROVIDER_TELEPATHY_H__ +#define __STATUS_PROVIDER_TELEPATHY_H__ + +#include +#include + +#include "status-provider.h" + +G_BEGIN_DECLS + +#define STATUS_PROVIDER_TELEPATHY_TYPE (status_provider_telepathy_get_type ()) +#define STATUS_PROVIDER_TELEPATHY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STATUS_PROVIDER_TELEPATHY_TYPE, StatusProviderTelepathy)) +#define STATUS_PROVIDER_TELEPATHY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STATUS_PROVIDER_TELEPATHY_TYPE, StatusProviderTelepathyClass)) +#define IS_STATUS_PROVIDER_TELEPATHY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STATUS_PROVIDER_TELEPATHY_TYPE)) +#define IS_STATUS_PROVIDER_TELEPATHY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STATUS_PROVIDER_TELEPATHY_TYPE)) +#define STATUS_PROVIDER_TELEPATHY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STATUS_PROVIDER_TELEPATHY_TYPE, StatusProviderTelepathyClass)) + + +typedef struct _StatusProviderTelepathyClass StatusProviderTelepathyClass; +struct _StatusProviderTelepathyClass { + StatusProviderClass parent_class; +}; + +typedef struct _StatusProviderTelepathy StatusProviderTelepathy; +struct _StatusProviderTelepathy { + StatusProvider parent; +}; + +GType status_provider_telepathy_get_type (void); +StatusProvider * status_provider_telepathy_new (void); + +G_END_DECLS + +#endif -- cgit v1.2.3 From c8a0f5e7e5e674e8c20c9a1fe20d16fa436d9513 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 24 Aug 2009 17:20:16 -0500 Subject: Adding the basic status enums and maps in. --- src/status-provider-telepathy.c | 55 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/status-provider-telepathy.c b/src/status-provider-telepathy.c index 339ede3..60f34ef 100644 --- a/src/status-provider-telepathy.c +++ b/src/status-provider-telepathy.c @@ -30,10 +30,38 @@ with this program. If not, see . #include +typedef enum { + MC_STATUS_UNSET, + MC_STATUS_OFFLINE, + MC_STATUS_AVAILABLE, + MC_STATUS_AWAY, + MC_STATUS_EXTENDED_AWAY, + MC_STATUS_HIDDEN, + MC_STATUS_DND +} mc_status_t; + +static StatusProviderStatus mc_to_sp_map[] = { + /* MC_STATUS_UNSET, */ STATUS_PROVIDER_STATUS_OFFLINE, + /* MC_STATUS_OFFLINE, */ STATUS_PROVIDER_STATUS_OFFLINE, + /* MC_STATUS_AVAILABLE, */ STATUS_PROVIDER_STATUS_ONLINE, + /* MC_STATUS_AWAY, */ STATUS_PROVIDER_STATUS_AWAY, + /* MC_STATUS_EXTENDED_AWAY, */ STATUS_PROVIDER_STATUS_AWAY, + /* MC_STATUS_HIDDEN, */ STATUS_PROVIDER_STATUS_INVISIBLE, + /* MC_STATUS_DND */ STATUS_PROVIDER_STATUS_DND +}; + +static mc_status_t sp_to_mc_map[] = { + /* STATUS_PROVIDER_STATUS_ONLINE, */ MC_STATUS_AVAILABLE, + /* STATUS_PROVIDER_STATUS_AWAY, */ MC_STATUS_AWAY, + /* STATUS_PROVIDER_STATUS_DND */ MC_STATUS_DND, + /* STATUS_PROVIDER_STATUS_INVISIBLE*/ MC_STATUS_HIDDEN, + /* STATUS_PROVIDER_STATUS_OFFLINE */ MC_STATUS_OFFLINE +}; typedef struct _StatusProviderTelepathyPrivate StatusProviderTelepathyPrivate; struct _StatusProviderTelepathyPrivate { DBusGProxy * proxy; + mc_status_t mc_status; }; #define STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(o) \ @@ -45,6 +73,9 @@ static void status_provider_telepathy_class_init (StatusProviderTelepathyClass * static void status_provider_telepathy_init (StatusProviderTelepathy *self); static void status_provider_telepathy_dispose (GObject *object); static void status_provider_telepathy_finalize (GObject *object); +/* Internal Funcs */ +static void set_status (StatusProvider * sp, StatusProviderStatus status); +static StatusProviderStatus get_status (StatusProvider * sp); G_DEFINE_TYPE (StatusProviderTelepathy, status_provider_telepathy, STATUS_PROVIDER_TYPE); @@ -58,10 +89,10 @@ status_provider_telepathy_class_init (StatusProviderTelepathyClass *klass) object_class->dispose = status_provider_telepathy_dispose; object_class->finalize = status_provider_telepathy_finalize; - //StatusProviderClass * spclass = STATUS_PROVIDER_CLASS(klass); + StatusProviderClass * spclass = STATUS_PROVIDER_CLASS(klass); - //spclass->set_status = set_status; - //spclass->get_status = get_status; + spclass->set_status = set_status; + spclass->get_status = get_status; return; } @@ -70,7 +101,10 @@ status_provider_telepathy_class_init (StatusProviderTelepathyClass *klass) static void status_provider_telepathy_init (StatusProviderTelepathy *self) { - //StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(self); + StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(self); + + priv->proxy = NULL; + priv->mc_status = MC_STATUS_OFFLINE; return; } @@ -111,3 +145,16 @@ status_provider_telepathy_new (void) return STATUS_PROVIDER(g_object_new(STATUS_PROVIDER_TELEPATHY_TYPE, NULL)); } +static void +set_status (StatusProvider * sp, StatusProviderStatus status) +{ + StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(sp); + priv->mc_status = sp_to_mc_map[status]; + return; +} +static StatusProviderStatus +get_status (StatusProvider * sp) +{ + StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(sp); + return mc_to_sp_map[priv->mc_status]; +} -- cgit v1.2.3 From fd8f49b1170f7e17aa050ad620296bb5315a8146 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 24 Aug 2009 20:10:19 -0500 Subject: Building up the proxy. We need one, it's important. --- src/status-provider-telepathy.c | 60 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'src') diff --git a/src/status-provider-telepathy.c b/src/status-provider-telepathy.c index 60f34ef..334126b 100644 --- a/src/status-provider-telepathy.c +++ b/src/status-provider-telepathy.c @@ -76,6 +76,8 @@ static void status_provider_telepathy_finalize (GObject *object); /* Internal Funcs */ static void set_status (StatusProvider * sp, StatusProviderStatus status); static StatusProviderStatus get_status (StatusProvider * sp); +static void changed_status (DBusGProxy * proxy, guint status, gchar * message, StatusProvider * sp); +static void proxy_destroy (DBusGProxy * proxy, StatusProvider * sp); G_DEFINE_TYPE (StatusProviderTelepathy, status_provider_telepathy, STATUS_PROVIDER_TYPE); @@ -106,6 +108,44 @@ status_provider_telepathy_init (StatusProviderTelepathy *self) priv->proxy = NULL; priv->mc_status = MC_STATUS_OFFLINE; + GError * error = NULL; + + DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + + priv->proxy = NULL; + priv->proxy = dbus_g_proxy_new_for_name_owner(session_bus, + "org.freedesktop.Telepathy.MissionControl", + "/org/freedesktop/Telepathy/MissionControl", + "org.freedesktop.Telepathy.MissionControl", + &error); + + 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); + + dbus_g_object_register_marshaller(_status_provider_telepathy_marshal_VOID__UINT_STRING, + G_TYPE_NONE, + G_TYPE_UINT, + G_TYPE_STRING, + G_TYPE_INVALID); + dbus_g_proxy_add_signal (priv->proxy, + "PresenceChanged", + G_TYPE_UINT, + G_TYPE_STRING, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal(priv->proxy, + "PresenceChanged", + G_CALLBACK(changed_status), + (void *)self, + NULL); + } else { + g_warning("Unable to connect to Mission Control"); + if (error != NULL) { + g_error_free(error); + } + } + return; } @@ -156,5 +196,25 @@ static StatusProviderStatus get_status (StatusProvider * sp) { StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(sp); + + if (priv->proxy == NULL) { + return mc_to_sp_map[MC_STATUS_OFFLINE]; + } + return mc_to_sp_map[priv->mc_status]; } + +static void +changed_status (DBusGProxy * proxy, guint status, gchar * message, StatusProvider * sp) +{ + g_signal_emit(G_OBJECT(sp), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, STATUS_PROVIDER_STATUS_OFFLINE, TRUE); +} + +static void +proxy_destroy (DBusGProxy * proxy, StatusProvider * sp) +{ + g_debug("Signal: Mission Control proxy destroyed"); + g_signal_emit(G_OBJECT(sp), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, STATUS_PROVIDER_STATUS_OFFLINE, TRUE); + return; +} + -- cgit v1.2.3 From 95190bc550383beb535ce52d66d3d0d7f46c0021 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 24 Aug 2009 20:48:41 -0500 Subject: Connecting the telepathy stuff into the overall status service --- src/status-service.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/status-service.c b/src/status-service.c index 5a9d9b5..5a60fa6 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -39,11 +39,13 @@ with this program. If not, see . #include "status-provider.h" #include "status-provider-pidgin.h" +#include "status-provider-telepathy.h" typedef StatusProvider * (*newfunc) (void); -#define STATUS_PROVIDER_CNT 1 +#define STATUS_PROVIDER_CNT 2 static newfunc status_provider_newfuncs[STATUS_PROVIDER_CNT] = { - status_provider_pidgin_new + status_provider_pidgin_new, + status_provider_telepathy_new }; static StatusProvider * status_providers[STATUS_PROVIDER_CNT] = { 0 }; -- cgit v1.2.3 From ce1f33170639cdc65e5655643a2d466123706f12 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 24 Aug 2009 21:52:26 -0500 Subject: Support for setting status stollen from FUSA status manager (written by me) and signal handling --- src/status-provider-telepathy.c | 53 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/status-provider-telepathy.c b/src/status-provider-telepathy.c index 334126b..2c6453f 100644 --- a/src/status-provider-telepathy.c +++ b/src/status-provider-telepathy.c @@ -189,9 +189,58 @@ static void set_status (StatusProvider * sp, StatusProviderStatus status) { StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(sp); + if (priv->proxy == NULL) { + priv->mc_status = MC_STATUS_OFFLINE; + return; + } + priv->mc_status = sp_to_mc_map[status]; + + guint mcstatus = MC_STATUS_UNSET; + gboolean ret = FALSE; + GError * error = NULL; + + ret = dbus_g_proxy_call(priv->proxy, + "GetPresence", &error, + G_TYPE_INVALID, + G_TYPE_UINT, &priv->mc_status, + G_TYPE_INVALID); + + /* If we can't get the get call to work, let's not set */ + if (!ret) { + if (error != NULL) { + g_error_free(error); + } + return; + } + + /* If the get call doesn't return a status, that means that there + are no clients connected. We don't want to connect them by telling + MC that we're going online -- we'd like to be more passive than that. */ + if (mcstatus == MC_STATUS_UNSET) { + return; + } + + ret = dbus_g_proxy_call(priv->proxy, + "SetPresence", &error, + G_TYPE_UINT, priv->mc_status, + G_TYPE_STRING, "", + G_TYPE_INVALID, + G_TYPE_INVALID); + + if (!ret) { + if (error != NULL) { + g_warning("Unable to set Mission Control Presence: %s", error->message); + g_error_free(error); + } else { + g_warning("Unable to set Mission Control Presence"); + } + return; + } + return; } + static StatusProviderStatus get_status (StatusProvider * sp) { @@ -207,7 +256,9 @@ get_status (StatusProvider * sp) static void changed_status (DBusGProxy * proxy, guint status, gchar * message, StatusProvider * sp) { - g_signal_emit(G_OBJECT(sp), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, STATUS_PROVIDER_STATUS_OFFLINE, TRUE); + StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(sp); + priv->mc_status = status; + g_signal_emit(G_OBJECT(sp), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, mc_to_sp_map[priv->mc_status], TRUE); } static void -- cgit v1.2.3 From 51a1209a398df17727d6bb79bad11480af173970 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 24 Aug 2009 22:41:56 -0500 Subject: At start up if we've got a proxy, let's start everything and get an initial status. --- src/status-provider-telepathy.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/status-provider-telepathy.c b/src/status-provider-telepathy.c index 2c6453f..bed962f 100644 --- a/src/status-provider-telepathy.c +++ b/src/status-provider-telepathy.c @@ -78,6 +78,7 @@ static void set_status (StatusProvider * sp, StatusProviderStatus status); static StatusProviderStatus get_status (StatusProvider * sp); static void changed_status (DBusGProxy * proxy, guint status, gchar * message, StatusProvider * sp); static void proxy_destroy (DBusGProxy * proxy, StatusProvider * sp); +static void get_status_async (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata); G_DEFINE_TYPE (StatusProviderTelepathy, status_provider_telepathy, STATUS_PROVIDER_TYPE); @@ -117,7 +118,7 @@ status_provider_telepathy_init (StatusProviderTelepathy *self) "org.freedesktop.Telepathy.MissionControl", "/org/freedesktop/Telepathy/MissionControl", "org.freedesktop.Telepathy.MissionControl", - &error); + &error); if (priv->proxy != NULL) { g_object_add_weak_pointer (G_OBJECT(priv->proxy), (gpointer *)&priv->proxy); @@ -139,6 +140,14 @@ status_provider_telepathy_init (StatusProviderTelepathy *self) G_CALLBACK(changed_status), (void *)self, NULL); + + /* Do a get here, to init the status */ + dbus_g_proxy_begin_call(priv->proxy, + "GetStatus", + get_status_async, + self, + NULL, + G_TYPE_INVALID); } else { g_warning("Unable to connect to Mission Control"); if (error != NULL) { @@ -269,3 +278,29 @@ proxy_destroy (DBusGProxy * proxy, StatusProvider * sp) return; } +static void +get_status_async (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata) +{ + GError * error = NULL; + guint status = 0; + if (!dbus_g_proxy_end_call(proxy, call, &error, G_TYPE_UINT, &status, G_TYPE_INVALID)) { + g_warning("Unable to get type from Mission Control: %s", error->message); + g_error_free(error); + return; + } + + StatusProviderTelepathyPrivate * priv = STATUS_PROVIDER_TELEPATHY_GET_PRIVATE(userdata); + + gboolean changed = FALSE; + if (status != priv->mc_status) { + changed = TRUE; + } + + priv->mc_status = status; + + if (changed) { + g_signal_emit(G_OBJECT(userdata), STATUS_PROVIDER_SIGNAL_STATUS_CHANGED_ID, 0, mc_to_sp_map[priv->mc_status], TRUE); + } + + return; +} -- cgit v1.2.3 From 1246414b8b64eed892222e3b0b2e27cb77e40ddf Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 24 Aug 2009 23:43:50 -0500 Subject: Didn't need that function. --- src/status-provider.c | 7 ------- src/status-provider.h | 2 -- 2 files changed, 9 deletions(-) (limited to 'src') diff --git a/src/status-provider.c b/src/status-provider.c index 83d44ac..1139e54 100644 --- a/src/status-provider.c +++ b/src/status-provider.c @@ -99,10 +99,3 @@ status_provider_get_status (StatusProvider * sp) return class->get_status(sp); } -void -status_provider_emit_status_changed (StatusProvider * sp, StatusProviderStatus newstatus) -{ - g_return_if_fail(IS_STATUS_PROVIDER(sp)); - g_signal_emit(sp, signals[STATUS_CHANGED], 0, newstatus, TRUE); - return; -} diff --git a/src/status-provider.h b/src/status-provider.h index 9cc9885..522e61b 100644 --- a/src/status-provider.h +++ b/src/status-provider.h @@ -72,8 +72,6 @@ GType status_provider_get_type (void); void status_provider_set_status (StatusProvider * sp, StatusProviderStatus status); StatusProviderStatus status_provider_get_status (StatusProvider * sp); -void status_provider_emit_status_changed (StatusProvider * sp, StatusProviderStatus newstatus); - G_END_DECLS #endif -- cgit v1.2.3 From f820b8313eb697cc96ffd4f258d1dcc82ab4f56e Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Mon, 24 Aug 2009 23:46:22 -0500 Subject: Should be starting with the least available and getting more so, instead of the other way around. --- src/status-service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/status-service.c b/src/status-service.c index 5a60fa6..14d8a34 100644 --- a/src/status-service.c +++ b/src/status-service.c @@ -75,12 +75,12 @@ static StatusProviderStatus global_status = STATUS_PROVIDER_STATUS_OFFLINE; static void status_update (void) { StatusProviderStatus oldglobal = global_status; - global_status = STATUS_PROVIDER_STATUS_ONLINE; + global_status = STATUS_PROVIDER_STATUS_OFFLINE; int i; for (i = 0; i < STATUS_PROVIDER_CNT; i++) { StatusProviderStatus localstatus = status_provider_get_status(status_providers[i]); - if (localstatus > global_status) { + if (localstatus < global_status) { global_status = localstatus; } } -- cgit v1.2.3 From 2ca0db49f3d75fe732885cbad2ba89c4c71beb93 Mon Sep 17 00:00:00 2001 From: Ted Gould Date: Tue, 25 Aug 2009 15:59:07 -0500 Subject: Handling a missing session bus by displaying an error. --- src/status-provider-telepathy.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/status-provider-telepathy.c b/src/status-provider-telepathy.c index bed962f..e22c27d 100644 --- a/src/status-provider-telepathy.c +++ b/src/status-provider-telepathy.c @@ -112,6 +112,11 @@ status_provider_telepathy_init (StatusProviderTelepathy *self) GError * error = NULL; DBusGConnection * session_bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error); + if (session_bus == NULL) { + g_warning("Unable to connect to Session Bus: %s", error == NULL ? "No message" : error->message); + g_error_free(error); + return; + } priv->proxy = NULL; priv->proxy = dbus_g_proxy_new_for_name_owner(session_bus, -- cgit v1.2.3