gloox配置聊天室

(金庆的专栏)

gloox是XMPP协议的C++客户端库。
以下代码测试创建多人聊天室(MUC), 并进行配置。
参照gloox中的muc示例代码。
gloox代码示例中没有聊天室的配置。
配置聊天室需要获取配置表单(DataForm), 填好表单然后调用 setRoomConfig().
配置表单读取服务器发来的默认配置,仅更改了其中一项。
测试服务器使用了ejabberd.

const char SERVER[] = "xmpp.jinqing.net";
const char TESTER[] = "tester";
const char PASSWORD[] = "password";

using namespace gloox;

static std::string GetTesterJid()
{
    return std::string(TESTER) + "@" + SERVER;
}

static DataForm* CreateMUCConfigForm(const DataForm& form)
{
    DataForm* pNewFm = new DataForm(TypeSubmit);
    const DataForm::FieldList& fl = form.fields();
    for (const DataFormField* pFld : fl)
    {
        DataFormField* pNewFld = pNewFm->addField(
            pFld->type(), pFld->name(), pFld->value());
        if (pFld->name() == "muc#roomconfig_roomdesc")
            pNewFld->setValue("RoomDesc_JinqTest");
    }
    return pNewFm;
}

class MUCRoomConfigHandlerTest : public MUCRoomConfigHandler
{
public:
    void handleMUCConfigList(MUCRoom* room, const MUCListItemList& items,
        MUCOperation operation) override {}

    void handleMUCConfigForm(MUCRoom* room, const DataForm& form) override
    {
        DataForm* pNewForm = CreateMUCConfigForm(form);  // deleted in setRoomConfig()
        room->setRoomConfig(pNewForm);
    }

    void handleMUCConfigResult(MUCRoom* room, bool success,
        MUCOperation operation) override {}
    void handleMUCRequest(MUCRoom* room, const DataForm& form) override {}
};  // class MUCRoomConfigHandlerTest

class CreateRoomTest : public ConnectionListener, MUCRoomHandler
{
public:
    CreateRoomTest() : m_client(JID(GetTesterJid()), PASSWORD)
    {
        m_client.registerConnectionListener(this);
    }

public:
    void TestCreate()
    {
        m_client.setPresence(Presence::Available, -1);
        JID nick(std::string("gloox@conference.") + SERVER + "/gloox");
        m_pRoom.reset(new MUCRoom(&m_client, nick, this, &m_cfgHdlr));
        m_client.connect();
    }

    void onConnect() override
    {
        m_pRoom->join();
        m_pRoom->requestRoomConfig();
    }

    void onDisconnect(ConnectionError /*e*/) override {}

    bool onTLSConnect(const CertInfo& info) override
    {
        return true;
    }

    void handleMUCParticipantPresence(MUCRoom * /*room*/,
        const MUCRoomParticipant participant,
        const Presence& presence) override {}

    void handleMUCMessage(MUCRoom* /*room*/,
        const Message& msg, bool priv) override {}

    void handleMUCSubject(MUCRoom * /*room*/, const std::string& nick,
        const std::string& subject) override {}

    void handleMUCError(MUCRoom * /*room*/, StanzaError error) override {}

    void handleMUCInfo(MUCRoom * /*room*/, int features,
        const std::string& name, const DataForm* infoForm) override {}

    void handleMUCItems(MUCRoom * /*room*/,
        const Disco::ItemList& items) override {}

    void handleMUCInviteDecline(MUCRoom * /*room*/, const JID& invitee,
        const std::string& reason) override {}

    bool handleMUCRoomCreation(MUCRoom *room) override
    {
        return true;
    }

private:
    gloox::Client m_client;
    MUCRoomConfigHandlerTest m_cfgHdlr;
    std::unique_ptr<MUCRoom> m_pRoom;
};  // class CreateRoomTest

int main()
{
    CreateRoomTest().TestCreate();
    return 0;
}

gloox配置聊天室的更多相关文章

  1. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  2. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  3. php+websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  4. 基于NodeJS的秘室聊天室

    借着放假期间将NodeJS重新回顾了一下并玩了一下sketch来进行设计界面,很不错.(注:代码整理后会放到github上,请关注.) 本次聊天室我给它定义了一个名称叫“秘密聊天室”. 需求: 技术选 ...

  5. 使用WebRTC搭建前端视频聊天室——信令篇

    博客原文地址 建议看这篇之前先看一下使用WebRTC搭建前端视频聊天室——入门篇 如果需要搭建实例的话可以参照SkyRTC-demo:github地址 其中使用了两个库:SkyRTC(github地址 ...

  6. 使用WebRTC搭建前端视频聊天室——入门篇

    http://segmentfault.com/a/1190000000436544 什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两 ...

  7. 使用Servlet和JSP实现一个简单的Web聊天室系统

    1 问题描述                                                利用Java EE相关技术实现一个简单的Web聊天室系统,具体要求如下. (1)编写一个登录 ...

  8. Clouda聊天室实践

    1.Clouda说明 Clouda是简单,可依赖的实时Javascript框架.对一个想开发移动webapp的开发者来说,可以使用clouda开发框架,实现一个功能和体验与native app齐平的轻 ...

  9. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

随机推荐

  1. [LeetCode] Self Dividing Numbers 自整除数字

    A self-dividing number is a number that is divisible by every digit it contains. For example, 128 is ...

  2. 阿里云在RSAC 2018上宣布 将在西雅图建立安全实验室

    日前,2018年度的RSA Conference全球信息安全大会在美国加州旧金山市召开.作为全球三大云计算服务商之一,阿里云携3款全新安全产品亮相,并宣布今年将在西雅图设立全新的安全实验室,整合全球安 ...

  3. [Codeforces 946F]Fibonacci String Subsequences

    Description 题库链接 定义 \(F(x)\) 为 \(F(x-1)\) 与 \(F(x-2)\) 的连接(其中 \(F(0) = "0",F(1) = "1& ...

  4. poj 2888 Magic Bracelet(Polya+矩阵快速幂)

    Magic Bracelet Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 4990   Accepted: 1610 D ...

  5. bzoj2434阿狸的自动机

    转载自 http://www.cnblogs.com/zj75211/p/6934976.html ●BZOJ 2434: [Noi2011]阿狸的打字机   ●赘述题目 (题意就不赘述了) ●解法: ...

  6. 用js来实现那些数据结构11(字典)

    我们这篇文章来说说Map这种数据结构如何用js来实现,其实它和集合(Set)极为类似,只不过Map是[键,值]的形式存储元素,通过键来查询值,Map用于保存具有映射关系的数据,Map里保存着两组数据: ...

  7. mysql 及 posgresql之优劣势大比拼

    特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例.一个实例可以管理一个或多个数据库.一台服务器可以运行多个 mysqld 实例.一个实例管理器可以监视 ...

  8. Delphi7通过SendMessage来实现默认打印机的切换

    具体代码 procedure SetDefaultPrinter(NewDefPrinter: string); var ResStr: array[0..255] of Char; begin St ...

  9. IE6浏览器有哪些常见的bug,缺陷或者与标准不一致的地方,如何解决

    IE6不支持min-height,解决办法使用css hack: .target { min-height: 100px; height: auto !important; height: 100px ...

  10. strings.h 与 string.h 头文件的区别

    今天使用 man string 来查看 string 文件的使用的方法(毕竟里面的函数名字和传入参数和发挥参数的类型,如果一段时间不使用,会产生遗忘.) 偶然发现,string.h 的man page ...