В 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);
}