#include "jsm.h"
#define NS_DISCO_INFO "http://jabber.org/protocol/disco#info"
mreturn mod_disco_server_info(mapi m, void *arg)
{
xmlnode query, identity, disco;
if((xmlnode_get_attrib(m->packet->x,"node")) != NULL) return M_PASS;
log_debug("mod_disco","handling disco#info query");
disco = js_config(m->si,"disco");
query = xmlnode_insert_tag(jutil_iqresult(m->packet->x),"query");
xmlnode_put_attrib(query,"xmlns",NS_DISCO_INFO);
identity = NULL;
if (disco != NULL)
identity = xmlnode_get_tag(disco,"identity");
if (disco == NULL || identity == NULL){
identity = xmlnode_insert_tag(query,"identity");
xmlnode_put_attrib(identity,"category","services");
xmlnode_put_attrib(identity,"type","jabber");
xmlnode_put_attrib(identity,"name",
xmlnode_get_data(js_config(m->si,"vCard/FN")));
}
if (disco != NULL)
xmlnode_insert_node(query, xmlnode_get_firstchild(disco));
jpacket_reset(m->packet);
js_deliver(m->si,m->packet);
return M_HANDLED;
}
#define NS_DISCO_ITEMS "http://jabber.org/protocol/disco#items"
mreturn mod_disco_server_items(mapi m, void *arg)
{
xmlnode browse, query, cur;
if((xmlnode_get_attrib(m->packet->x,"node")) != NULL) return M_PASS;
if((browse = js_config(m->si,"browse")) == NULL)
return M_PASS;
log_debug("mod_disco","handling disco#items query");
query = xmlnode_insert_tag(jutil_iqresult(m->packet->x),"query");
xmlnode_put_attrib(query,"xmlns",NS_DISCO_ITEMS);
for(cur = xmlnode_get_firstchild(browse);
cur != NULL;
cur = xmlnode_get_nextsibling(cur)){
xmlnode item;
const char *jid,*name;
jid = xmlnode_get_attrib(cur,"jid");
if (!jid) continue;
item = xmlnode_insert_tag(query,"item");
xmlnode_put_attrib(item,"jid",jid);
name = xmlnode_get_attrib(cur,"name");
if (name) xmlnode_put_attrib(item,"name",name);
}
jpacket_reset(m->packet);
js_deliver(m->si,m->packet);
return M_HANDLED;
}
mreturn mod_disco_server(mapi m, void *arg)
{
if (m->packet->type != JPACKET_IQ) return M_IGNORE;
if (jpacket_subtype(m->packet) != JPACKET__GET) return M_PASS;
if (m->packet->to->resource != NULL) return M_PASS;
if (NSCHECK(m->packet->iq,NS_DISCO_ITEMS)) return mod_disco_server_items(m,arg);
if (NSCHECK(m->packet->iq,NS_DISCO_INFO)) return mod_disco_server_info(m,arg);
return M_PASS;
}
void mod_disco(jsmi si)
{
js_mapi_register(si,e_SERVER,mod_disco_server,NULL);
}