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


group management

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

<storage xmlns='http://jabber.com/jabber/storage:groups'>
  <group>Team</group>
  <group>Test Users</group>
  <group>US</group>
  <group>HF</group>
  <group>HZ</group>
  <group>SZ</group>
</storage>

client每次login server时,首先会从storage:groups拿到一个group list,然后再去拿buddy list,得到buddy list以后,再将从storage:groups拿到的group list和buddy list中含有的group list做一个合并,得到一个完整的group list。

contact management

参考RFC 3921 chapter 7 关于roster的管理部分

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

这里介绍几个概念,每个item表示一个contact(XMPP协议称为roster), name attribute表示这个contact的friendly name, subscription表示用户和contact之间的一个关系, RFC 3921 chapter 8详细介绍了subscription的内容。item/group说明了这个contact归属于哪一个/几个group中,如果这个用户属于多个group,在item下就会有多个group tag。

subscription status

The state of the presence subscription in relation to a roster item is captured in the 'subscription' attribute 
of the <item/> element. Allowable values for this attribute are:
 
"none" -- the user does not have a subscription to the contact's presence information, and the contact does not
 have a subscription to the user's presence information
"to" -- the user has a subscription to the contact's presence information, but the contact does not have a 
subscription to the user's presence information
"from" -- the contact has a subscription to the user's presence information, but the user does not have a 
subscription to the contact's presence information
"both" -- both the user and the contact have subscriptions to each other's presence information
 

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

none表示用户和contact之前没有任何的关系(虽然在server的buddy list中存在);
to表示用户能看到contact的presence,但是contact看不到用户的Presence;
from和to的含义相反,指用户看不到contact的presence,但是contact可以看到;
both表示相关之间都能看到对方的presence。

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

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

//I am A, the buddy is B
typedef enum tagConSubscriptionType
{
	ConSubscription_None = 0,
	ConSubscription_NoneOut,  //A add B, B has no response,                     SO: B is in outstanding invitation group
	ConSubscription_NoneIn,   //B add A, A has no response,                     SO: A will see request dialog
	ConSubscription_NoneOutIn,//A add B and B add A, neither response,          SO: A will see request dialog, B is in outstd group
	ConSubscription_To,       //A can see B's presence, B cannot see A,         SO: B is in normal group
	ConSubscription_ToIn,     //A can see B's presence, B add A, A no response, SO: A will see request dialog
	ConSubscription_From,     //B can see A's presence,                         SO: B is in observer group
	ConSubscription_FromOut,  //B can see A's presence, A add B, B no response, SO: B is in observer group and outstd group
	ConSubscription_Both,     //A and B can see each other's presence,          SO: B is in normal group
}ConSubscriptionType;


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值