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. js变量的生命周期

    1.在JavaScript中,对于for循环中定义的i变量,其生命周期在循环结束后仍然是有效的. for (var i=0; i < 10; i++){ doSomething(i); } al ...

  2. [LeetCode] Array Nesting 数组嵌套

    A zero-indexed array A consisting of N different integers is given. The array contains all integers ...

  3. [LeetCode] Delete Operation for Two Strings 两个字符串的删除操作

    Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...

  4. Mysql之视图的操作

    视图的操作: 1.视图的创建: create view view_name as 查询语句; 2.视图的查看: show tables;// 显示所有的表和视图 show create view vi ...

  5. brk和mmap(转)

    进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap: 1.brk是将数据段的(.data)的最高地址指针_edata往高地址推 2.mmap是虚拟地址空间找一个空闲的虚拟内存 如果mal ...

  6. 洛谷P3244 [HNOI2015]落忆枫音

    #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...

  7. poj 2653 线段与线段相交

    Pick-up sticks Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11884   Accepted: 4499 D ...

  8. 美团、java后台实习、面经

    3月27号投了美团java后台,29号收到面试邀请,好像是金融服务平台(提交简历的时候,我当时没注意随便填的···) 一面: 介绍项目经历 根据简历问一些问题:比如我简历上有区块链相关,会要求介绍一下 ...

  9. mybatis添加记录时返回主键id

    参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...

  10. ionic3-ng4学习见闻--(自定义ion-tab图标)

    学习混合开发语言,目的就是为了快速开发一个适用于多平台的app. app基本都会有footer,也就是tabbar,用来快速导航不同的页面. ionic也有这个组件,ion-tab. 常用方法如下: ...