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

📄 sync.c

📁 AnyQ服务端源代码(2004/10/28)源码
💻 C
字号:
/* -------------------------------------------------------------------------- * * License * * The contents of this file are subject to the Jabber Open Source License * Version 1.0 (the "License").  You may not copy or use this file, in either * source code or executable form, except in compliance with the License.  You * may obtain a copy of the License at http://www.jabber.com/license/ or at * http://www.opensource.org/. * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License * for the specific language governing rights and limitations under the * License. * * Copyright (c) 2000-2001 Schuyler Heath <sheath@jabber.org> * * Acknowledgements * * Special thanks to the Jabber Open Source Contributors for their * suggestions and support of Jabber. * * -------------------------------------------------------------------------- */#include "session.h"result mt_sync_chg(mpacket mp, void *arg){    session s = (session) arg;    char *cmd;    cmd = mt_packet_data(mp,0);    if (j_strcmp(cmd,"CHG") == 0)    {        mtq_send(s->q,s->p,&mt_session_connected,(void *) s);        return r_DONE;    }    if (j_strcmp(cmd,"ILN") == 0)    {        mt_user_update(s,mt_packet_data(mp,3),                       mt_packet_data(mp,2),                       mt_packet_data(mp,4));        return r_PASS;    }    return r_ERR;}void mt_user_sync_walk(xht h, const char *key, void *data, void *arg){    xmlnode roster = (xmlnode) arg;    muser u = (muser) data;    session s = (session) xmlnode_get_vattrib(roster,"s");    xmlnode x;    int chg = 0;    if (!(u->list_old & LIST_FL))    {        if (u->list & LIST_FL)        {            chg = 1;            x = jutil_presnew(JPACKET__SUBSCRIBED,jid_full(s->id),NULL);            xmlnode_put_attrib(x,"from",mt_mid2jid_full(x->p,u->mid,s->host));            mt_deliver(s->ti,x);        }    }    else    {        if (!(u->list & LIST_FL))        {            chg = 1;            x = jutil_presnew(JPACKET__UNSUBSCRIBED,jid_full(s->id),NULL);            xmlnode_put_attrib(x,"from",mt_mid2jid_full(x->p,u->mid,s->host));            mt_deliver(s->ti,x);        }    }    if (!(u->list_old & LIST_RL))    {        if (u->list & LIST_RL)        {            chg = 1;            if ((u->list & LIST_BL) == 0)            {                x = jutil_presnew(JPACKET__SUBSCRIBE,jid_full(s->id),NULL);                xmlnode_put_attrib(x,"from",mt_mid2jid_full(x->p,u->mid,s->host));                mt_deliver(s->ti,x);            }        }    }    else    {        if (!(u->list & LIST_RL))        {            chg = 1;            x = jutil_presnew(JPACKET__UNSUBSCRIBE,jid_full(s->id),NULL);            xmlnode_put_attrib(x,"from",mt_mid2jid_full(x->p,u->mid,s->host));            mt_deliver(s->ti,x);        }    }    if (chg)    {        xmlnode item = xmlnode_get_tag(roster,spools(roster->p,"?jid=",u->mid,roster->p));        if ((u->list & LIST_FL) || (u->list & LIST_RL))        {            if (item == NULL)            {                item = xmlnode_insert_tag(roster,"item");                xmlnode_put_attrib(item,"jid",u->mid);            }            if (u->list & LIST_RL)            {                if (u->list & LIST_FL)                    xmlnode_put_attrib(item,"subscription","both");                else                    xmlnode_put_attrib(item,"subscription","from");            }            else                xmlnode_put_attrib(item,"subscription","to");        }        else if (item)            xmlnode_hide(item);    }    u->list_old = 0;}void mt_user_sync_final(void *arg){    session s = (session) arg;    mti ti = s->ti;    xmlnode roster, cur;    muser u;    jid xid;    char *id, *s10n;    s->currentcontact = 0;    s->numcontacts = 0;    xid = mt_xdb_id(s->p,s->id,s->host);    roster = xdb_get(ti->xc,xid,NS_ROSTER);    if (roster == NULL)    {        roster = xmlnode_new_tag("query");        xmlnode_put_attrib(roster,"xmlns",NS_ROSTER);    }    for_each_node(cur,roster)    {        if ((id = xmlnode_get_attrib(cur,"jid")) == NULL ||            (s10n = xmlnode_get_attrib(cur,"subscription")) == NULL)            continue;        u = mt_user(s,id);        if (strcmp(s10n,"to") == 0)            u->list_old = LIST_FL;        else if (strcmp(s10n,"from") == 0)            u->list_old = LIST_RL;        else if (strcmp(s10n,"both") == 0)            u->list_old = (LIST_RL | LIST_FL);    }    xmlnode_put_vattrib(roster,"s",(void *) s);    xhash_walk(s->users,&mt_user_sync_walk,(void *) roster);    xmlnode_hide_attrib(roster,"s");    xdb_set(ti->xc,xid,NS_ROSTER,roster);    xmlnode_free(roster);    if (s->exit_flag == 0)    {        /* send our initial status */        mt_stream_register(s->st,&mt_sync_chg,(void *) s);//        log_debug(ZONE,"Sending nickname & status for session %s ---- %s",s->user,s->status_msg);        mt_cmd_chg(s->st,mt_state2char(s->state));        mt_cmd_rea(s->st,s->user,s->nick);//        if(s->status_msg != 0)//            mt_cmd_rea(s->st,s->user,s->status_msg);    }}result mt_user_lst(session s, mpacket mp){		int i = 0;		s->currentcontact++;// Example packet// LST ag_1987@hotmail.com Master%20Bob 11 0		if(mp->count > 4)		{			muser u = mt_user(s, mt_packet_data(mp,1));			char *h = mt_packet_data(mp,2);			switch(j_atoi(mt_packet_data(mp, 3), 0))			{					/*						The lists have these values							AL 2							BL 4							FL 1							RL 8					*/				case 15:					u->list |= LIST_FL;					u->list |= LIST_AL;					u->list |= LIST_BL;					u->list |= LIST_RL;					break;				case 11:					u->list |= LIST_FL;					u->list |= LIST_AL;					//u->list |= LIST_BL;					u->list |= LIST_RL;					break;				case 3:						u->list |= LIST_FL;						u->list |= LIST_AL;						//u->list |= LIST_BL;						//u->list |= LIST_RL;						break;				case 10:						//u->list |= LIST_FL;						u->list |= LIST_AL;						//u->list |= LIST_BL;						u->list |= LIST_RL;						break;				case 13:						u->list |= LIST_FL;						//u->list |= LIST_AL;						u->list |= LIST_BL;						u->list |= LIST_RL;						break;				case 12:						//u->list |= LIST_FL;						//u->list |= LIST_AL;						u->list |= LIST_BL;						u->list |= LIST_RL;						break;				case 5:						u->list |= LIST_FL;						//u->list |= LIST_AL;						u->list |= LIST_BL;						//u->list |= LIST_RL;						break;				case 2:						//u->list |= LIST_FL;						u->list |= LIST_AL;						//u->list |= LIST_BL;						//u->list |= LIST_RL;						break;				case 4:						//u->list |= LIST_FL;						//u->list |= LIST_AL;						u->list |= LIST_BL;						//u->list |= LIST_RL;						break;				default:					log_debug(ZONE,"User %s recieved unknown value for LST: %d",s->user, j_atoi(mt_packet_data(mp, 3), 0));			}			if (strcmp(h,u->handle))			{					mt_free(u->handle);					u->handle = mt_strdup(h);			}		}		if(s->numcontacts == s->currentcontact && s->numcontacts > 0) {			// all the lists have been received			mtq_send(s->q,s->p,&mt_user_sync_final,(void *) s);		}    return r_DONE;}result mt_user_syn(mpacket mp, void *arg){    session s = (session) arg;    char *cmd;    cmd = mt_packet_data(mp,0);    if (j_strcmp(cmd,"LST") == 0)    {        return mt_user_lst(s,mp);    }    else if (j_strcmp(cmd,"SYN") == 0)    {        // Set the number of contacts        s->currentcontact = 0;        if(mp->count > 3)          s->numcontacts = j_atoi(mt_packet_data(mp, 3), 1);        if (j_atoi(mt_packet_data(mp,2),-1) == 0)        {            // No LST commands will be received because the Seq number is zero            mt_stream_register(s->st,&mt_sync_chg,(void *) s);//            log_debug(ZONE,"Sending nickname & status for session %s ---- %s",s->user,s->status_msg);            mt_cmd_chg(s->st,mt_state2char(s->state));//            if(s->status_msg != 0)//                mt_cmd_rea(s->st,s->user,s->status_msg);            return r_DONE;        }    }    else if (j_strcmp(cmd,"GTC") && j_strcmp(cmd,"BLP"))        return r_ERR;    return r_PASS;}void mt_user_sync(session s){    if (s->users == NULL)        s->users = xhash_new(25);    s->currentcontact = 0;    s->numcontacts = 0;    mt_stream_register(s->st,&mt_user_syn,(void *) s);    mt_cmd_syn(s->st);}

⌨️ 快捷键说明

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