您的位置:首页 > 其它

XMPP客户端关于用户组和好友列表的管理的一个实现方法

2011-09-30 09:05 621 查看



groupmanagement

由于XMPP协议并没有很好的支持group,也就是说,client没有办法从server得到空的grouplist。为了解决这个问题,用户在client创建一个group,我们会将grouplist存到server的storage:groups中。group存放的格式如下:

<storagexmlns='http://jabber.com/jabber/storage:groups'>
<group>Team</group>
<group>TestUsers</group>
<group>US</group>
<group>HF</group>
<group>HZ</group>
<group>SZ</group>
</storage>

[/code]
client每次loginserver时,首先会从storage:groups拿到一个grouplist,然后再去拿buddylist,得到buddylist以后,再将从storage:groups拿到的grouplist和buddylist中含有的grouplist做一个合并,得到一个完整的grouplist。

contactmanagement

参考RFC3921chapter7关于roster的管理部分。

<iqto='juliet@example.com/balcony'type='result'id='roster_1'>
<queryxmlns='jabber:iq:roster'>
<itemjid='romeo@example.net'
name='Romeo'
subscription='both'>
<group>Friends</group>
</item>
<itemjid='mercutio@example.org'
name='Mercutio'
subscription='from'>
<group>Friends</group>
</item>
<itemjid='benvolio@example.org'
name='Benvolio'
subscription='both'>
<group>Friends</group>
</item>
</query>
</iq>

[/code]
这里介绍几个概念,每个item表示一个contact(XMPP协议称为roster),nameattribute表示这个contact的friendlyname,subscription表示用户和contact之间的一个关系,RFC3921chapter8详细介绍了subscription的内容。item/group说明了这个contact归属于哪一个/几个group中,如果这个用户属于多个group,在item下就会有多个grouptag。

subscriptionstatus

Thestateofthepresencesubscriptioninrelationtoarosteritemiscapturedinthe'subscription'attribute
ofthe<item/>element.Allowablevaluesforthisattributeare:


"none"--theuserdoesnothaveasubscriptiontothecontact'spresenceinformation,andthecontactdoesnot
haveasubscriptiontotheuser'spresenceinformation

"to"--theuserhasasubscriptiontothecontact'spresenceinformation,butthecontactdoesnothavea
subscriptiontotheuser'spresenceinformation

"from"--thecontacthasasubscriptiontotheuser'spresenceinformation,buttheuserdoesnothavea
subscriptiontothecontact'spresenceinformation

"both"--boththeuserandthecontacthavesubscriptionstoeachother'spresenceinformation


上面的定义来自RFC3921chapter8,这里简单解释一下上面几个值得含义:

none表示用户和contact之前没有任何的关系(虽然在server的buddylist中存在);

to表示用户能看到contact的presence,但是contact看不到用户的Presence;

from和to的含义相反,指用户看不到contact的presence,但是contact可以看到;

both表示相关之间都能看到对方的presence。

除了上面定义的subscription之外,还有一个相关的状态:subscriptionrequest;outsubscriptionrequest可以在contact的item中体现出来,ask='subscribe'表示用户给这个contact发送了一个subscriptionrequest;insubscriptionrequest只能在用户收到的presence中体现出来(type为subscribe)。将subscriptionrequest和上述定义的subscription
value组合起来,就会得到一个完整的subscription的状态表。

下面的enum来之.h文件的定义

//IamA,thebuddyisB
typedefenumtagConSubscriptionType
{
ConSubscription_None=0,
ConSubscription_NoneOut,//AaddB,Bhasnoresponse,SO:Bisinoutstandinginvitationgroup
ConSubscription_NoneIn,//BaddA,Ahasnoresponse,SO:Awillseerequestdialog
ConSubscription_NoneOutIn,//AaddBandBaddA,neitherresponse,SO:Awillseerequestdialog,Bisinoutstdgroup
ConSubscription_To,//AcanseeB'spresence,BcannotseeA,SO:Bisinnormalgroup
ConSubscription_ToIn,//AcanseeB'spresence,BaddA,Anoresponse,SO:Awillseerequestdialog
ConSubscription_From,//BcanseeA'spresence,SO:Bisinobservergroup
ConSubscription_FromOut,//BcanseeA'spresence,AaddB,Bnoresponse,SO:Bisinobservergroupandoutstdgroup
ConSubscription_Both,//AandBcanseeeachother'spresence,SO:Bisinnormalgroup
}ConSubscriptionType;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐