[telepathy-gabble/master] wocky-pep-service: fire 'changed' signal when an event is received

Guillaume Desmottes guillaume.desmottes at collabora.co.uk
Mon Sep 21 05:24:59 PDT 2009


---
 src/wocky-pep-service.c |   64 +++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/src/wocky-pep-service.c b/src/wocky-pep-service.c
index 1df10a1..21716b0 100644
--- a/src/wocky-pep-service.c
+++ b/src/wocky-pep-service.c
@@ -21,18 +21,20 @@
 
 #include <wocky/wocky-porter.h>
 #include <wocky/wocky-utils.h>
+#include <wocky/wocky-namespaces.h>
+
+#include "gabble-signals-marshal.h"
 
 G_DEFINE_TYPE (WockyPepService, wocky_pep_service, G_TYPE_OBJECT)
 
 /* signal enum */
 enum
 {
+  CHANGED,
   LAST_SIGNAL,
 };
 
-/*
 static guint signals[LAST_SIGNAL] = {0};
-*/
 
 enum
 {
@@ -47,9 +49,11 @@ struct _WockyPepServicePrivate
 {
   WockySession *session;
   WockyPorter *porter;
+  WockyContactFactory *contact_factory;
 
   gchar *node;
   gboolean subscribe;
+  guint handler_id;
 
   gboolean dispose_has_run;
 };
@@ -125,9 +129,18 @@ wocky_pep_service_dispose (GObject *object)
 
   priv->dispose_has_run = TRUE;
 
+  if (priv->handler_id != 0)
+    {
+      wocky_porter_unregister_handler (priv->porter, priv->handler_id);
+      priv->handler_id = 0;
+    }
+
   if (priv->porter != NULL)
     g_object_unref (priv->porter);
 
+  if (priv->contact_factory != NULL)
+    g_object_unref (priv->contact_factory);
+
   if (G_OBJECT_CLASS (wocky_pep_service_parent_class)->dispose)
     G_OBJECT_CLASS (wocky_pep_service_parent_class)->dispose (object);
 }
@@ -178,6 +191,14 @@ wocky_pep_service_class_init (WockyPepServiceClass *wocky_pep_service_class)
       FALSE,
       G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
   g_object_class_install_property (object_class, PROP_SUBSCRIBE, param_spec);
+
+  signals[CHANGED] = g_signal_new ("changed",
+      G_OBJECT_CLASS_TYPE (wocky_pep_service_class),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
+      0,
+      NULL, NULL,
+      gabble_marshal_VOID__OBJECT_OBJECT,
+      G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_OBJECT);
 }
 
 WockyPepService *
@@ -190,6 +211,29 @@ wocky_pep_service_new (const gchar *node,
       NULL);
 }
 
+static gboolean
+msg_event_cb (WockyPorter *porter,
+    WockyXmppStanza *stanza,
+    gpointer user_data)
+{
+  WockyPepService *self = WOCKY_PEP_SERVICE (user_data);
+  WockyPepServicePrivate *priv = WOCKY_PEP_SERVICE_GET_PRIVATE (self);
+  const gchar *from;
+  WockyBareContact *contact;
+
+  from = wocky_xmpp_node_get_attribute (stanza->node, "from");
+  if (from == NULL)
+    return FALSE;
+
+  contact = wocky_contact_factory_ensure_bare_contact (
+      priv->contact_factory, from);
+
+  g_signal_emit (G_OBJECT (self), signals[CHANGED], 0, contact, stanza);
+
+  g_object_unref (contact);
+  return TRUE;
+}
+
 void
 wocky_pep_service_start (WockyPepService *self,
     WockySession *session)
@@ -201,4 +245,20 @@ wocky_pep_service_start (WockyPepService *self,
 
   priv->porter = wocky_session_get_porter (priv->session);
   g_object_ref (priv->porter);
+
+  priv->contact_factory = wocky_session_get_contact_factory (priv->session);
+  g_object_ref (priv->contact_factory);
+
+  /* Register event handler */
+  priv->handler_id = wocky_porter_register_handler (priv->porter,
+      WOCKY_STANZA_TYPE_MESSAGE, WOCKY_STANZA_SUB_TYPE_NONE, NULL,
+      WOCKY_PORTER_HANDLER_PRIORITY_MAX,
+      msg_event_cb, self,
+      WOCKY_NODE, "event",
+        WOCKY_NODE_XMLNS, WOCKY_XMPP_NS_PUBSUB_EVENT,
+        WOCKY_NODE, "items",
+        WOCKY_NODE_ATTRIBUTE, "node", priv->node,
+        WOCKY_NODE_END,
+      WOCKY_NODE_END,
+      WOCKY_STANZA_END);
 }
-- 
1.5.6.5




More information about the telepathy-commits mailing list