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

📄 pres.c

📁 AnyQ服务端源代码(2004/10/28)源码
💻 C
字号:
/* * Jabber AIM-Transport libfaim interface **/#include "aimtrans.h"int at_server_pres(ati ti, jpacket jp){    xmlnode x;    switch(jpacket_subtype(jp))    {        case JPACKET__AVAILABLE:            if(jp->to->user != NULL)            {                return at_buddy_add(ti, jp);            } else {                log_debug(ZONE, "[AT] Starting a new session!\n");                return at_auth_user(ti, jp);            }        case JPACKET__PROBE:            if(jp->to->user != NULL)                return at_buddy_add(ti, jp);            else {                xmlnode_free(jp->x);                return 1;            }        case JPACKET__UNAVAILABLE:            log_debug(ZONE, "[AT] Unavailable sent to server");            xmlnode_free(jp->x);            return 1;        default:            jutil_error(jp->x, TERROR_NOTACCEPTABLE);            at_deliver(ti,jp->x);            return 1;    }    xmlnode_free(jp->x);    return 0;}int at_session_pres(at_session s, jpacket jp){    ati ti;    xmlnode pres;    xmlnode show;    xmlnode x;    jid j;    pool p;    char profile[] = "";    char *show_data;    char *status_data;    ti = s->ti;    if(s->exit_flag)    {        xmlnode_free(jp->x);        return 1;    }    switch(jpacket_subtype(jp))    {        case JPACKET__PROBE:            log_debug(ZONE, "[AT] Probed, no logical way to handle");            xmlnode_free(jp->x);            return 1;        case JPACKET__UNAVAILABLE:            log_debug(ZONE, "[AT] Unavailabe sent to session");            /* insert into ppdb, check to see if we should go offline */            s->at_PPDB=ppdb_insert(s->at_PPDB,jp->from,jp->x);            log_debug(ZONE, "[AT] Checking at_PPDB for %s", jid_full(s->cur));            p = pool_new();            j = jid_new(p, jid_full(s->cur));            jid_set(j, NULL, JID_RESOURCE);            x=ppdb_primary(s->at_PPDB,j);            pool_free(p);            if(x!=NULL)            {                /* not last resource, don't go offline yet */                s->cur = jid_new(s->p,xmlnode_get_attrib(x, "from"));                log_debug(ZONE,"[AT] active resources(%s), not ending session", jid_full(s->cur));                xmlnode_free(jp->x);                return 1;            }			log_debug(ZONE, "[AT] Telling the session to end!");            s->exit_flag = 1;            xmlnode_free(jp->x);            return 1;		case JPACKET__AVAILABLE:				if(jp->to->user != NULL)				{					return at_buddy_add(ti, jp);                }                /* If we're not logged in they haven't recved initial pres */                if (!s->loggedin)                {                    return 0;                }                s->at_PPDB=ppdb_insert(s->at_PPDB,jp->from,jp->x);                pres = ppdb_primary(s->at_PPDB, s->cur);                s->cur = jid_new(s->p, xmlnode_get_attrib(pres, "from"));                show_data = xmlnode_get_tag_data(pres, "show");                status_data = xmlnode_get_tag_data(pres, "status");                if(s->status != NULL)                {                    free(s->status);                    s->status = NULL;                }                if(status_data == NULL)                {                    s->status = strdup(profile);                } else {                    s->status = strdup(status_data);                }                if(show_data == NULL || j_strcmp(show_data, "chat") == 0)                {                    char *convstr = malloc(8192);                    if(!s->icq)                        msgconv_plain2aim(s->status, convstr, 8192);                    else                        strcpy(convstr, s->status);                    s->away = 0;                    aim_bos_setprofile(s->ass,                         aim_getconn_type(s->ass, AIM_CONN_TYPE_BOS),                        profile, "", AIM_CAPS_CHAT);                    x = jutil_presnew(JPACKET__AVAILABLE, jid_full(s->cur), "Online");                    xmlnode_put_attrib(x, "from", jid_full(s->from));                    at_deliver(ti,x);                    xmlnode_free(jp->x);                    if(s->icq) {                        if(j_strcmp(show_data, "chat") == 0) {                          aim_setextstatus(s->ass, aim_getconn_type(s->ass,                                           AIM_CONN_TYPE_BOS),AIM_ICQ_STATE_CHAT);                        }                        else {                          aim_setextstatus(s->ass, aim_getconn_type(s->ass,                                     AIM_CONN_TYPE_BOS),AIM_ICQ_STATE_ONLINE);                        }                    }                    free(convstr);                    return 1;                } else {                    char *convstr = malloc(8192);                    if(!s->icq)                        msgconv_plain2aim(s->status, convstr, 8192);                    else                        strcpy(convstr, s->status);                    log_debug(ZONE, "[AT] Setting user away");                    s->away = 1;		    s->awaysetat = time(NULL);  /*each away msg has a unique timestamp  */                    aim_bos_setprofile(s->ass,                             aim_getconn_type(s->ass, AIM_CONN_TYPE_BOS),                            profile, convstr, AIM_CAPS_CHAT);                    x = jutil_presnew(JPACKET__AVAILABLE, jid_full(s->cur), s->status);                    if(s->icq) {                    aim_setextstatus(s->ass, aim_getconn_type(s->ass,                                     AIM_CONN_TYPE_BOS),AIM_FLAG_AWAY);                    }                    show = xmlnode_insert_tag(x, "show");                    if(s->icq) {                        xmlnode_insert_cdata(show, show_data, -1);                    }                    else {                        xmlnode_insert_cdata(show, "away", -1);                    }                    xmlnode_put_attrib(x, "from", jid_full(s->from));                    log_debug(ZONE, "[AT] Pres Send: %s", xmlnode2str(x));                    at_deliver(ti,x);                    xmlnode_free(jp->x);                    if(s->icq) {                    if(j_strcmp(show_data, "away") == 0)                          aim_setextstatus(s->ass, aim_getconn_type(s->ass,                                           AIM_CONN_TYPE_BOS),AIM_ICQ_STATE_AWAY);                    else if(j_strcmp(show_data, "dnd") == 0)                          aim_setextstatus(s->ass, aim_getconn_type(s->ass,                                           AIM_CONN_TYPE_BOS),AIM_ICQ_STATE_DND);                    else if(j_strcmp(show_data, "xa") == 0)                          aim_setextstatus(s->ass, aim_getconn_type(s->ass,                                           AIM_CONN_TYPE_BOS),AIM_ICQ_STATE_NA);                    }                    free(convstr);                    return 1;                }                xmlnode_free(jp->x);                return 1;        default:            xmlnode_free(jp->x);            return 1;    }    return 0;}

⌨️ 快捷键说明

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