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. es6第一章 continue

    块级作用域 ES6内允许块级作用域任意嵌套 {{{{let insane = 'Hello World'}}}} 这段代码使用了一个五层的作用域. {{{{ {let c = ''hello worl ...

  2. JQ五星好评效果

    $(".list-txt ul").find("li").click(function(){    if($(this).index()==0){       ...

  3. python的布尔类型与流程控制

    布尔类型其实可以算是一种特殊的数字,下面是 help() 函数得到的帮助信息:  bool 首先,请注意这一行:

  4. 深入java多线程一

    涉及到 1.线程的启动(start) 2.线程的暂停(suspend()和resume()) 3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return) ...

  5. “百度杯”CTF比赛 九月场_123(文件备份,爆破,上传)

    题目在i春秋ctf训练营 翻看源码,发现提示: 打开user.php,页面一片空白,参考大佬的博客才知道可能会存在user.php.bak的备份文件,下载该文件可以得到用户名列表 拿去burp爆破: ...

  6. 深入理解事件(Event)

    前言 在前一篇文章中讲到了Event 发布与订阅(一) 里面用到了事件来实现一些发布与订阅,当时对事件及其委托理解的还不是太深入,可能在使用上有点捉急.这篇来好好讲讲事件,以及通过一些小DEMO来加深 ...

  7. Lazy Loading | Explicit Loading | Eager Loading in EntityFramework and EntityFramework.Core

    EntityFramework Eagerly Loading Eager loading is the process whereby a query for one type of entity ...

  8. [WC 2010]重建计划

    Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案, ...

  9. [NOIp 2016]天天爱跑步

    Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图 ...

  10. hdu 5517 Triple(二维树状数组)

    Triple Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...