Added iq pubsub handler
authorMyhailo Danylenko <isbear@ukrpost.net>
Wed, 11 Nov 2009 17:05:05 +0200
changeset 6 f579d9637195
parent 5 1398cd8fc554
child 7 4b96709ac242
Added iq pubsub handler
pep.c
--- 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: */