⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_agents.c

📁 AnyQ服务端源代码(2004/10/28)源码
💻 C
字号:
/* -------------------------------------------------------------------------- * * License * * The contents of this file are subject to the Jabber Open Source License * Version 1.0 (the "JOSL").  You may not copy or use this file, in either * source code or executable form, except in compliance with the JOSL. You * may obtain a copy of the JOSL at http://www.jabber.org/ or at * http://www.opensource.org/.   * * Software distributed under the JOSL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the JOSL * for the specific language governing rights and limitations under the * JOSL. * * Copyrights *  * Portions created by or assigned to Jabber.com, Inc. are  * Copyright (c) 1999-2002 Jabber.com, Inc.  All Rights Reserved.  Contact * information for Jabber.com, Inc. is available at http://www.jabber.com/. * * Portions Copyright (c) 1998-1999 Jeremie Miller. *  * Acknowledgements *  * Special thanks to the Jabber Open Source Contributors for their * suggestions and support of Jabber. *  * Alternatively, the contents of this file may be used under the terms of the * GNU General Public License Version 2 or later (the "GPL"), in which case * the provisions of the GPL are applicable instead of those above.  If you * wish to allow use of your version of this file only under the terms of the * GPL and not to allow others to use your version of this file under the JOSL, * indicate your decision by deleting the provisions above and replace them * with the notice and other provisions required by the GPL.  If you do not * delete the provisions above, a recipient may use your version of this file * under either the JOSL or the GPL.  *  *  * --------------------------------------------------------------------------*/#include "jsm.h"mreturn mod_agents_agents(mapi m){    xmlnode ret, retq, agents, cur, a, cur2;    /* get data from the config file */    agents = js_config(m->si,"browse");    /* if we don't have anything to say, bounce */    if(agents == NULL)        return M_PASS;    log_debug("mod_agents","handling agents query");    /* build the result IQ */    ret = jutil_iqresult(m->packet->x);    retq = xmlnode_insert_tag(ret,"query");    xmlnode_put_attrib(retq,"xmlns",NS_AGENTS);    /* parse the new browse data into old agents format */    for(cur = xmlnode_get_firstchild(agents); cur != NULL; cur = xmlnode_get_nextsibling(cur))    {        if(xmlnode_get_type(cur) != NTYPE_TAG) continue;        /* generic <agent> part */        a = xmlnode_insert_tag(retq,"agent");        xmlnode_put_attrib(a, "jid", xmlnode_get_attrib(cur,"jid"));        xmlnode_insert_cdata(xmlnode_insert_tag(a,"name"), xmlnode_get_attrib(cur,"name"), -1);        xmlnode_insert_cdata(xmlnode_insert_tag(a,"service"), xmlnode_get_attrib(cur,"type"), -1);        if(j_strcmp(xmlnode_get_name(cur),"conference") == 0)            xmlnode_insert_tag(a,"groupchat");        /* map the included <ns>'s in browse to the old agent flags */        for(cur2 = xmlnode_get_firstchild(cur); cur2 != NULL; cur2 = xmlnode_get_nextsibling(cur2))        {            if(j_strcmp(xmlnode_get_name(cur2),"ns") != 0) continue;            if(j_strcmp(xmlnode_get_data(cur2),"jabber:iq:register") == 0)                xmlnode_insert_tag(a,"register");            if(j_strcmp(xmlnode_get_data(cur2),"jabber:iq:search") == 0)                xmlnode_insert_tag(a,"search");            if(j_strcmp(xmlnode_get_data(cur2),"jabber:iq:gateway") == 0)                xmlnode_insert_cdata(xmlnode_insert_tag(a,"transport"),"Enter ID", -1);        }    }    jpacket_reset(m->packet);    if(m->s != NULL) /* XXX null session hack! */    {        xmlnode_put_attrib(m->packet->x,"from",m->packet->from->server);        js_session_to(m->s,m->packet);    }else{        js_deliver(m->si,m->packet);    }    return M_HANDLED;}mreturn mod_agents_agent(mapi m){    xmlnode ret, retq, info, agents, reg;    /* get data from the config file */    info = js_config(m->si,"vCard");    agents = js_config(m->si,"agents");    reg = js_config(m->si,"register");    /* if we don't have anything to say, bounce */    if(info == NULL && agents == NULL && reg == NULL)        return M_PASS;    log_debug("mod_agent","handling agent query");    /* build the result IQ */    ret = jutil_iqresult(m->packet->x);    retq = xmlnode_insert_tag(ret,"query");    xmlnode_put_attrib(retq,"xmlns",NS_AGENT);    /* copy in the vCard info */    xmlnode_insert_cdata(xmlnode_insert_tag(retq,"name"),xmlnode_get_tag_data(info,"FN"),-1);    xmlnode_insert_cdata(xmlnode_insert_tag(retq,"url"),xmlnode_get_tag_data(info,"URL"),-1);    xmlnode_insert_cdata(xmlnode_insert_tag(retq,"service"),"jabber",6);    /* set the flags */    if(agents != NULL)        xmlnode_insert_tag(retq,"agents");    if(reg != NULL)        xmlnode_insert_tag(retq,"register");    jpacket_reset(m->packet);    if(m->s != NULL) /* XXX null session hack! */    {        xmlnode_put_attrib(m->packet->x,"from",m->packet->from->server);        js_session_to(m->s,m->packet);    }else{        js_deliver(m->si,m->packet);    }    return M_HANDLED;}mreturn mod_agents_handler(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->s != NULL && (m->packet->to != NULL && j_strcmp(jid_full(m->packet->to),m->packet->from->server) != 0)) return M_PASS; /* for session calls, only answer to=NULL or to=server */    if(NSCHECK(m->packet->iq,NS_AGENT)) return mod_agents_agent(m);    if(NSCHECK(m->packet->iq,NS_AGENTS)) return mod_agents_agents(m);    return M_PASS;}/* XXX supid null to workaround! */mreturn mod_agents_shack(mapi m, void *arg){    js_mapi_session(es_OUT,m->s,mod_agents_handler,NULL);    return M_PASS;}void mod_agents(jsmi si){    log_debug("mod_agents","init");    js_mapi_register(si,e_SERVER, mod_agents_handler, NULL);    js_mapi_register(si,e_SESSION, mod_agents_shack, NULL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -