Re: [XIMSS] rosterList

От: Vladimir A. Butenko <CGatePro_at_mx_ru>
Дата: Mon 21 May 2007 - 14:35:57 MSD

On Mon, 21 May 2007 11:56:03 +0400
  "Denis Stanishevskiy" <CGatePro@mx.ru> wrote:
>

>> Может, не стоит делайть "bind" до того, как считали Ростер?

> можно и после, но сути это не меняет. вместо одного из <rosterItem ...
> /> приходит <presence .../>:
>
> C: <login id="logon" .../>
> S: <session .../>
> S: <response id="logon"/>
>
> C: <rosterList id='rosterList'/>
> S: <rosterItem id="rosterList" name="name1" peer="peer1"
> subscription="both"><group>General</group></rosterItem>
> S: <rosterItem ask="subscribe" id="rosterList" name="name2" peer="peer2"
> subscription="from"><group>General</group></rosterItem>
> S: <presence id="rosterList" peer="peer3" type="subscribe" />

А. Если это - синхронный ответ, то это - pending запрос. То есть кто-то запросил у Вашего юзера разрешения на подглядываение за его статусом. Юзеру надо показать диалог и позволить либо подтвердить запрос, либо отвергнуть его.

> S: <response id="rosterList"/>
>
> C: <signalBind id='1'>...</signalBind>
> C: <presenceSet id='2'/>
> ...
>
> если ответить на него <rosterSet id='...' subscription='unsubscribed'
> peer='peer3' />, то при следующем соединении придет <rosterItem ...
> subscription="none" /> - нормальный, сообщающий нам "name" и <group>.

То, что при нотификации о новом запросе о подписке нету атрибута name="realName" - так это скопировано из XMPP. Это можно добавить - если в самом запросе такое имя действительно было.

А вот <group> никак "само" появится не может. Это был какой-то клиент, который принял этот запрос, вписав его тем самым в ростер - с именем и группой, а потом, когда вы выдали type="unsubscribe" - оно поэтому и осталось в Ростере.   

> последовательность действий такая:
> 1. оба аккаунта не имеют друг друга в ростер-листе.
> 2. account1 логинится и для него выполняется команда
> <rosterSet id='9' peer='account2'
> name='name2'><group>General</group></rosterSet>
> в ответ приходит
> <rosterItem name="name2" peer="account2"
> subscription="none"><group>General</group></rosterItem>
> 3. account1 отключается.
> 4. account2 логинится и для него выполняется команда
> <rosterSet id='57' subscription='subscribe' peer='account1'/>
> в ответ приходит
> <rosterItem ask="subscribe" peer="account1" subscription="none" />
> 5. account2 отключается
> 6. account1 подключается и получает rosterItem'ы вместе с <presence
> id="rosterList" peer="account2" type="subscribe" />

Да, он получает запрос - что кто-то на него захотел подписаться. Вы же этого еще никак не подтверждали. В ростер этот контакт был внесён безо всяких подписок.   

> вот такая петрушка :(
>
> как это можно поправить, т.е. получать Contact Real Name и группу, в
> которую его положили?..

А кто его куда-то будет класть? Presence - это просто уведомление о том, что юзер запросил подписку. Из-за того, что Вы таким хитрым способом сначала заполнили Roster, то этой статьи там - всё равно что нету.

Почему бы Вам сразу не начать с того, что занести в Ростер статью с типом type="subBoth" - для этого, в отличие от XMPP, надо просто добавить к

<rosterSet id='9' peer='account2' name='name2'>

   <group>General</group>
</rosterSet>

<rosterSet id='9' peer='account2' name='name2' subscription='subBoth'>

   <group>General</group>
</rosterSet>   

> С уважением,
> Денис Станишевский.

Sincerely,
Vladimir Получено Mon May 21 10:35:37 2007

Этот архив был сгенерирован hypermail 2.1.8 : Mon 21 May 2007 - 15:14:05 MSD