QXmpp создает комнату MUC (xep -0045) на сервере
Я пытаюсь добавить возможности MUC в свое приложение с помощью QXmpp, я следую этой информации в заголовочном файле QXmppMucManager.h
/// \brief The QXmppMucManager class makes it possible to interact with
/// multi-user chat rooms as defined by XEP-0045: Multi-User Chat.
///
/// To make use of this manager, you need to instantiate it and load it into
/// the QXmppClient instance as follows:
///
/// \code
/// QXmppMucManager *manager = new QXmppMucManager;
/// client->addExtension(manager);
/// \endcode
///
/// You can then join a room as follows:
///
/// \code
/// QXmppMucRoom *room = manager->addRoom("room@conference.example.com");
/// room->setNickName("mynick");
/// room->join();
/// \endcode
///
/// \ingroup Managers
В конструктор одного из моих классов я добавляю MuCManager, как это
QXmppMucManager *manager = new QXmppMucManager;
m_xmppClient.addExtension(manager);
и в слоте для создания группы Muc я делаю это
QXmppMucRoom *room = manager->addRoom("livefit@mthinkpad");
room->setNickName("mThinkpad");
room->join();
Я ожидаю, что это создаст комнату и присоединится, если она не существует, и присоединится, если она уже существует, но она просто рушит мое приложение. Я не могу разобраться, как qxmpp реализует xep -0045. Я был бы признателен если кто-то помог указать, что я делаю неправильно или как я могу создать комнату Muc на моем сервере из моего клиента. Мой сервер является локальной установкой ejabberd, и я могу получить к нему доступ в домене "mthinkpad".
1 ответ
В случае, если у кого-то возникли те же проблемы, я смог создать комнаты. Вот код, который это делает. Я создаю и настраиваю комнату на лету (я использую Openfire, и это позволяет), но вы можете запросить форму конфигурации если ты хочешь.
String jid=roomName.text()+"@conference."+serverName;
if(jid.isEmpty())
return ;
QList<QXmppMucRoom*> rooms = manager->rooms();
QXmppMucRoom* r;
foreach(r, rooms)
{
if(r->jid() == jid)
{
//LOG_MODEL_DEBUG("Group chat", "had joined room[%s]", qPrintable(jid));
return ;
}
}
m_pRoom = manager->addRoom(jid);
if(m_pRoom)
{
//nick
m_pRoom->setNickName("theDip");
//join the room.
m_pRoom->join();
}
//Prepare the dataform.
QXmppDataForm form(QXmppDataForm::Submit);
QList<QXmppDataForm::Field> fields;
{
QXmppDataForm::Field field(QXmppDataForm::Field::HiddenField);
field.setKey("FORM_TYPE");
field.setValue("http://jabber.org/protocol/muc#roomconfig");
fields.append(field);
}
QXmppDataForm::Field field;
field.setKey("muc#roomconfig_roomname");
field.setValue(roomName.text());
fields.append(field);
field.setKey("muc#roomconfig_subject");
field.setValue(roomSubject.text());
fields.append(field);
field.setKey("muc#roomconfig_roomdesc");
field.setValue(roomDesc.text());
fields.append(field);
{
QXmppDataForm::Field field(QXmppDataForm::Field::BooleanField);
field.setKey("muc#roomconfig_persistentroom");
field.setValue(true);
fields.append(field);
}
form.setFields(fields);
//The dataform ends here.
m_pRoom->setConfiguration(form);