diff -r 1398cd8fc554 -r f579d9637195 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: */