diff options
Diffstat (limited to 'src/rexmpp_pubsub.c')
-rw-r--r-- | src/rexmpp_pubsub.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/rexmpp_pubsub.c b/src/rexmpp_pubsub.c new file mode 100644 index 0000000..6ed3f75 --- /dev/null +++ b/src/rexmpp_pubsub.c @@ -0,0 +1,87 @@ +/** + @file rexmpp_pubsub.c + @brief XEP-0060 helper functions + @author defanor <defanor@uberspace.net> + @date 2021 + @copyright MIT license. +*/ + +#include "rexmpp.h" + +void +rexmpp_pubsub_iq (rexmpp_t *s, + const char *iq_type, + const char *pubsub_namespace, + const char *service_jid, + xmlNodePtr payload, + rexmpp_iq_callback_t callback) +{ + xmlNodePtr pubsub = xmlNewNode(NULL, "pubsub"); + if (pubsub_namespace == NULL) { + xmlNewNs(pubsub, "http://jabber.org/protocol/pubsub", NULL); + } else { + xmlNewNs(pubsub, pubsub_namespace, NULL); + } + + xmlAddChild(pubsub, payload); + + rexmpp_iq_new(s, iq_type, service_jid, pubsub, callback); +} + +void +rexmpp_pubsub_item_publish (rexmpp_t *s, + const char *service_jid, + const char *node, + const char *item_id, + xmlNodePtr payload, + rexmpp_iq_callback_t callback) +{ + xmlNodePtr item = xmlNewNode(NULL, "item"); + xmlNewNs(item, "http://jabber.org/protocol/pubsub", NULL); + if (item_id != NULL) { + xmlNewProp(item, "id", item_id); + } + xmlAddChild(item, payload); + + xmlNodePtr publish = xmlNewNode(NULL, "publish"); + xmlNewNs(publish, "http://jabber.org/protocol/pubsub", NULL); + xmlNewProp(publish, "node", node); + xmlAddChild(publish, item); + + rexmpp_pubsub_iq(s, "set", NULL, service_jid, publish, callback); +} + +void +rexmpp_pubsub_item_retract (rexmpp_t *s, + const char *service_jid, + const char *node, + const char *item_id, + rexmpp_iq_callback_t callback) +{ + xmlNodePtr item = xmlNewNode(NULL, "item"); + xmlNewNs(item, "http://jabber.org/protocol/pubsub", NULL); + if (item_id != NULL) { + xmlNewProp(item, "id", item_id); + } + + xmlNodePtr retract = xmlNewNode(NULL, "retract"); + xmlNewNs(retract, "http://jabber.org/protocol/pubsub", NULL); + xmlNewProp(retract, "node", node); + xmlAddChild(retract, item); + + rexmpp_pubsub_iq(s, "set", NULL, service_jid, retract, callback); +} + +void +rexmpp_pubsub_node_delete (rexmpp_t *s, + const char *service_jid, + const char *node, + rexmpp_iq_callback_t callback) +{ + xmlNodePtr delete = xmlNewNode(NULL, "delete"); + xmlNewNs(delete, "http://jabber.org/protocol/pubsub#owner", NULL); + xmlNewProp(delete, "node", node); + + rexmpp_pubsub_iq(s, "set", "http://jabber.org/protocol/pubsub#owner", + service_jid, delete, callback); +} |