--- a/pep.c Wed Nov 11 17:04:53 2009 +0200
+++ b/pep.c Wed Nov 11 17:05:05 2009 +0200
@@ -31,6 +31,7 @@
static GSList *pep_xmlns_handlers = NULL;
static LmMessageHandler *pep_message_handler = NULL;
+static LmMessageHandler *pep_iq_handler = NULL;
static pep_handler_t *pep_find_handler (const gchar *xmlns)
{
@@ -46,27 +47,12 @@
return NULL;
}
-static LmHandlerResult pep_handler (LmMessageHandler *handler, LmConnection *connection, LmMessage *message, gpointer udata)
-{ // it is MESSAGE!
- LmMessageNode *m = lm_message_get_node (message);
+static LmHandlerResult pep_handler (const gchar *from, LmMessageNode *mnode)
+{
+ LmMessageNode *node = lm_message_node_get_child (mnode, "items");
- LmMessageNode *node = lm_message_node_get_child (m, "event");
- if (!node)
- return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
-
- {
- const gchar *xmlns = lm_message_node_get_attribute (node, "xmlns");
- if (strcmp (xmlns, NS_PUBSUB_EVENT))
- return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
- }
-
- node = lm_message_node_get_child (node, "items");
- if (!node)
- return LM_HANDLER_RESULT_REMOVE_MESSAGE; // XXX
-
- {
+ if (node) {
LmMessageNode *item;
- const gchar *from = lm_message_node_get_attribute (m, "from");
const gchar *inode = lm_message_node_get_attribute (node, "node");
for (item = node->children; item; item = item->next) {
@@ -84,11 +70,43 @@
}
}
}
- }
+ } // XXX else
return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
+static LmHandlerResult pep_iq_pubsub_handler (LmMessageHandler *handler, LmConnection *connectio, LmMessage *message, gpointer udata)
+{
+ LmMessageNode *node = lm_message_get_node (message);
+ const gchar *from = lm_message_node_get_attribute (node, "from");
+
+ node = lm_message_node_get_child (node, "pubsub");
+ if (node) {
+ const gchar *xmlns = lm_message_node_get_attribute (node, "xmlns");
+
+ if (!strcmp (xmlns, NS_PUBSUB))
+ return pep_handler (from, node);
+ }
+
+ return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+}
+
+static LmHandlerResult pep_message_event_handler (LmMessageHandler *handler, LmConnection *connectio, LmMessage *message, gpointer udata)
+{
+ LmMessageNode *node = lm_message_get_node (message);
+ const gchar *from = lm_message_node_get_attribute (node, "from");
+
+ node = lm_message_node_get_child (node, "event");
+ if (node) {
+ const gchar *xmlns = lm_message_node_get_attribute (node, "xmlns");
+
+ if (!strcmp (xmlns, NS_PUBSUB_EVENT))
+ return pep_handler (from, node);
+ }
+
+ return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+}
+
void pep_register_xmlns_handler (const gchar *xmlns, void (*handler) (const gchar *from, const gchar *node, LmMessageNode *n, const gchar *id, gpointer udata), gpointer udata, void (*data_destroy) (pep_handler_t *handler))
{
pep_handler_t *h = g_new (pep_handler_t, 1);
@@ -116,18 +134,18 @@
static void pep_register_handlers (void)
{
- if (!pep_message_handler)
- pep_message_handler = lm_message_handler_new (pep_handler, NULL, NULL);
- else if (lconnection) // XXX
- lm_connection_unregister_message_handler (lconnection, pep_message_handler, LM_MESSAGE_TYPE_MESSAGE);
- if (lconnection) // XXX
+ if (lconnection) { // XXX
lm_connection_register_message_handler (lconnection, pep_message_handler, LM_MESSAGE_TYPE_MESSAGE, LM_HANDLER_PRIORITY_FIRST);
+ lm_connection_register_message_handler (lconnection, pep_iq_handler, LM_MESSAGE_TYPE_IQ, LM_HANDLER_PRIORITY_FIRST);
+ }
}
static void pep_unregister_handlers (void)
{
- if (pep_message_handler)
+ if (lconnection) { // XXX
lm_connection_unregister_message_handler (lconnection, pep_message_handler, LM_MESSAGE_TYPE_MESSAGE);
+ lm_connection_unregister_message_handler (lconnection, pep_iq_handler, LM_MESSAGE_TYPE_IQ);
+ }
}
// release handlers before reconnect
@@ -148,9 +166,14 @@
const gchar *g_module_check_init (GModule *module)
{
+ // create handlers
+ pep_message_handler = lm_message_handler_new (pep_message_event_handler, NULL, NULL);
+ pep_iq_handler = lm_message_handler_new (pep_iq_pubsub_handler, NULL, NULL);
+
// register hook handler
hk_add_handler (pep_hh, HOOK_INTERNAL, NULL);
+ // register handlers to connection
pep_register_handlers ();
return NULL;
@@ -161,12 +184,14 @@
// release handlers
pep_unregister_handlers ();
- if (pep_message_handler)
- lm_message_handler_unref (pep_message_handler);
- pep_message_handler = NULL;
-
// remove hook
hk_del_handler (pep_hh, NULL);
+
+ // destroy handlers (invalidate it just to be sure, though this should not happen :)
+ lm_message_handler_invalidate (pep_message_handler);
+ lm_message_handler_invalidate (pep_iq_handler);
+ lm_message_handler_unref (pep_message_handler);
+ lm_message_handler_unref (pep_iq_handler);
}
/* vim: se ts=4 sw=4: */