Russian Qt Forum
Ноябрь 24, 2024, 01:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]Список комнат (сервисов) на Jabber-сервере (QXMPP)  (Прочитано 3255 раз)
Vitto74
Гость
« : Декабрь 15, 2010, 10:06 »

Собственно основательно порывшись в http://qxmpp.googlecode.com/svn/tags/qxmpp-0.2.0/doc/html/index.html
не нашел как получить список комнат на своем сервере. Можно ли это сделать средствами QXMPP или придется читать XEP-0045 и допиливать самому?
« Последнее редактирование: Декабрь 20, 2010, 23:06 от Vitto74 » Записан
Vitto74
Гость
« Ответ #1 : Декабрь 15, 2010, 15:20 »

Исследование протокола показало, что для получения списка комнат нужно отправить на сервер вот это
Код:
<iq type='get' to='conference.sudouser.ru' id='purpledisco96444dcd'>
<query xmlns='http://jabber.org/protocol/disco#items'/>
</iq>
В ответ придет нечто такое
Код:
<iq from='conference.sudouser.ru' to='vitto74@sudouser.ru/Home' id='purpledisco96444dcd' type='result'>
<query xmlns='http://jabber.org/protocol/disco#items'>
<item jid='ckp@conference.sudouser.ru' name='ckp (1)'/>
</query>
</iq>
Из мануалов по QXMPP я понял, что пришедший список можно поймать сигналом
QXmppClient::discoveryIqReceived(const QXmppDiscoveryIq &)
Но как отправить запрос на этот список я так и не нашел.
Неужели вручную придется?
Записан
Vitto74
Гость
« Ответ #2 : Декабрь 20, 2010, 23:05 »

В QXMPP нет возможности посмотреть список комнат, поэтому сделал вручную.
Для начала нужно подготовится к принятию ответа на запрос т.к. придти он может быстрее, чем программа приготовится.
Код:
connect(Client, SIGNAL(discoveryIqReceived (const QXmppDiscoveryIq &)), this, SLOT(discoveryIqReceived (const QXmppDiscoveryIq &)));

Затем нужно подготовить и отправить запрос на предоставляемые сервисы. Можно получить как все сервисы (например ICQ, MRIM транспорты или конференции)
Так и сразу запросить список комнат, который с точки зрения протокола, выглядит как список сервисов предоставляемых conference.<host>.
Отправляется запрос так
Код:
    QXmppIq mes(QXmppIq::Get); //Мы хотим получить данные
    mes.setTo("conference.<host>"); //Кому отправляем. Тут может быть и просто <host>, тогда вернется список сервисов хоста
    mes.setId(id); //Заранее сгенерированная случайная строка. Позже понадобится для приема ответа.
    QXmppElementList list; //Список передаваемых параметров
    QXmppElement elem; //Элемент списка. Он всего один
    elem.setTagName("query"); //Передаем запрос
    elem.setAttribute("xmlns", "http://jabber.org/protocol/disco#items"); //Устанавливаем атрибут
    list.append(elem); //Добавляем к списку
    mes.setExtensions(list); //Устанавливаем список

    Client->sendPacket(mes); //Отправляем

В результате отправится сообщение вида
Код:
<iq type='get' to='conference.<host>' id='random'>
<query xmlns='http://jabber.org/protocol/disco#items'/>
</iq>

Теперь сервер пришлет нам ответ, который выглядит так
Код:
<iq from='conference.sudouser.ru' to='<user>@<host>/Home' id='тот самый random' type='result'>
<query xmlns='http://jabber.org/protocol/disco#items'>
<item jid='main@conference.sudouser.ru' name='main'/>
<item jid='master@conference.sudouser.ru' name='master'/>
</query>
</iq>

Сообщение ловится сигналом, который уже связан с нужным нам слотом. Сейчас запихаем этот список в QListWidget
Код:
    if (iq.getId() != id){//Собственно это то сообщение, которого мы ждем?
return;
    }
    QList<QXmppDiscoveryIq::Item> items = iq.items();
    for (int i = 0; i < items.count(); ++i){

QListWidgetItem *item = new QListWidgetItem(ui->listWidget, 0);

item->setText(items[i].name());
item->setData(Qt::UserRole, QVariant(items[i].jid()));

ui->listWidget->addItem(item);
    }
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.