实战libjingle之sigslot,MessageHandler

来源:互联网 发布:linux vi创建文件 编辑:程序博客网 时间:2024/06/05 17:20

接触libjingle,感慨于它强大的功能.这里不在全部描述libjingle模块. 只是简单介绍下它两个模块(sigslot,MessageHandler).

sigslot主要用于对象的事件传递

Messagehandler是很好的异步触发处理机制.  

至于两者概念非本文描述,本文侧重于两者的实际运用.

先在Xcode下新建个Test工程

1.加入所需要的文件.如下图

  至于为什么只加入这这些文件,本人也没有搞懂,借鉴别人的.

2.工程设置里面

   a. 设置Other Linker Flags选项

   Other Linker Flags: -all_load   -ObjC

   b.  设置Header Search Paths 选项

    例如我的项目中libjingle放在路径: $(SRCROOT)/Test/libjingle

   要从网上下载完整的libjingle库

  c:设置Other C++ Flags选项:

///begin

-DV8_DEPRECATION_WARNINGS

-DEXPAT_RELATIVE_PATH

-DFEATURE_ENABLE_VOICEMAIL

-DGTEST_RELATIVE_PATH

-DJSONCPP_RELATIVE_PATH

-DFEATURE_ENABLE_PSTN

-DLOGGING=1

-DSRTP_RELATIVE_PATH

-DFEATURE_ENABLE_SSL

-DHAVE_SRTP

-DHAVE_WEBRTC_VIDEO

-DHAVE_WEBRTC_VOICE

-DUSE_WEBRTC_DEV_BRANCH

-DPSAPI_VERSION=1

-D_CRT_RAND_S

-DCERT_CHAIN_PARA_HAS_EXTRA_FIELDS

-D_ATL_NO_OPENGL

-D_HAS_EXCEPTIONS=0

-D_SECURE_ATL

-DCHROMIUM_BUILD

-DTOOLKIT_VIEWS=1

-DUSE_AURA=1

-DUSE_ASH=1

-DUSE_DEFAULT_RENDER_THEME=1

-DUSE_LIBJPEG_TURBO=1

-DENABLE_ONE_CLICK_SIGNIN

-DENABLE_REMOTING=1

-DENABLE_WEBRTC=1

-DENABLE_PEPPER_CDMS

-DENABLE_CONFIGURATION_POLICY

-DENABLE_INPUT_SPEECH

-DENABLE_NOTIFICATIONS

-DENABLE_EGLIMAGE=1

-D__STD_C

-DENABLE_TASK_MANAGER=1

-DENABLE_EXTENSIONS=1

-DENABLE_PLUGIN_INSTALLATION=1

-DENABLE_PLUGINS=1

-DENABLE_SESSION_SERVICE=1

-DENABLE_THEMES=1

-DENABLE_AUTOFILL_DIALOG=1

-DENABLE_BACKGROUND=1

-DENABLE_AUTOMATION=1

-DENABLE_GOOGLE_NOW=1

-DCLD_VERSION=2

-DENABLE_FULL_PRINTING=1

-DENABLE_PRINTING=1

-DENABLE_SPELLCHECK=1

-DENABLE_CAPTIVE_PORTAL_DETECTION=1

-DENABLE_APP_LIST=1

-DENABLE_SETTINGS_APP=1

-DENABLE_MANAGED_USERS=1

-DENABLE_MDNS=1

-DLIBPEERCONNECTION_LIB=1

-DHAVE_SCTP

-DSSL_USE_NSS

-DHAVE_NSS_SSL_H

-DSSL_USE_NSS_RNG

-DNSS_PLATFORM_CLIENT_AUTH

-DNO_NSPR_10_SUPPORT

-DNSPR_STATIC

-DNSS_ENABLE_ECC

-DNSS_STATIC

-DNSS_USE_STATIC_LIBS

-DUSE_UTIL_DIRECTLY

-DDYNAMIC_ANNOTATIONS_ENABLED=1

-DWTF_USE_DYNAMIC_ANNOTATIONS=1

-DPJ_IS_LITTLE_ENDIAN=1

-DPJ_IS_BIG_ENDIAN=0

-DPOSIX

-D_DEBUG

-DLIBCORE_EXPORTS

-D__STDC_CONSTANT_MACROS

-DV8_DEPRECATION_WARNINGS

-DEXPAT_RELATIVE_PATH

-DFEATURE_ENABLE_VOICEMAIL

-DGTEST_RELATIVE_PATH

-DJSONCPP_RELATIVE_PATH

-DLOGGING=1

-DSRTP_RELATIVE_PATH

-DFEATURE_ENABLE_SSL

-DFEATURE_ENABLE_PSTN

-DHAVE_SRTP

-DHAVE_WEBRTC_VIDEO

-DHAVE_WEBRTC_VOICE

-DUSE_WEBRTC_DEV_BRANCH

-D_FILE_OFFSET_BITS=64

-DCHROMIUM_BUILD

-DTOOLKIT_VIEWS=1

-DUI_COMPOSITOR_IMAGE_TRANSPORT

-DUSE_AURA=1

-DUSE_CAIRO=1

-DUSE_GLIB=1

-DUSE_DEFAULT_RENDER_THEME=1

-DUSE_LIBJPEG_TURBO=1

-DUSE_NSS=1

-DUSE_X11=1

-DUSE_CLIPBOARD_AURAX11=1

-DENABLE_ONE_CLICK_SIGNIN

-DUSE_XI2_MT=2

-DUSE_XI2_MT=2

-DENABLE_WEBRTC=1

-DENABLE_PEPPER_CDMS

-DENABLE_CONFIGURATION_POLICY

-DENABLE_INPUT_SPEECH

-DENABLE_NOTIFICATIONS

-DUSE_UDEV

-DENABLE_EGLIMAGE=1

-DENABLE_TASK_MANAGER=1

-DENABLE_EXTENSIONS=1

-DENABLE_PLUGIN_INSTALLATION=1

-DENABLE_PLUGINS=1

-DENABLE_SESSION_SERVICE=1

-DENABLE_THEMES=1

-DENABLE_AUTOFILL_DIALOG=1

-DENABLE_BACKGROUND=1

-DENABLE_AUTOMATION=1

-DENABLE_GOOGLE_NOW=1

-DCLD_VERSION=2

-DENABLE_FULL_PRINTING=1

-DENABLE_PRINTING=1

-DENABLE_SPELLCHECK=1

-DENABLE_CAPTIVE_PORTAL_DETECTION=1

-DENABLE_APP_LIST=1

-DENABLE_SETTINGS_APP=1

-DENABLE_MANAGED_USERS=1

-DENABLE_MDNS=1

-DLIBPEERCONNECTION_LIB=1

-DHAVE_SCTP

-DHASH_NAMESPACE=__gnu_cxx

-DPOSIX

-DDISABLE_DYNAMIC_CAST

-D_REENTRANT

-DSSL_USE_NSS

-DHAVE_NSS_SSL_H

-DSSL_USE_NSS_RNG

-DHAVE_INT16_T

-DHAVE_INT32_T

-DHAVE_INT8_T

-DHAVE_UINT16_T

-DHAVE_UINT32_T

-DHAVE_UINT64_T

-DHAVE_UINT8_T

-DHAVE_STDINT_H

-DHAVE_INTTYPES_H

-DHAVE_NETINET_IN_H

-DINLINE=inline

-DCPU_CISC

-DDYNAMIC_ANNOTATIONS_ENABLED=1

-DWTF_USE_DYNAMIC_ANNOTATIONS=1

-D_DEBUG

-D_GLIBCXX_DEBUG=1

-DIOS

-D__ARMEL__

-D_ARM_

-DNO_CRYPTO

-DNODEBUG

///end

3. 设置Build Phases的Compile Sources中的

 maccocoathreadhelper.mm

 scoped_autorelease_pool.mm文件为 -fno-objc-arc

原因在两个文件是为非ARC的,如果你的是非ARC,就略这一项

//至此引入库成功,编译没有问题了


4.工程介绍

  网上讲解sigslot都是使用receive和sender为例子,我也借用下.同时实现了MessageHandler异步触发,说简单概要点就是post和OnMessage

//Receive.h

#include <stdio.h>

#include <vector>

#include <string>

#include "sigslot.h"

#include "thread.h"

#include "messagehandler.h"

#include "Sender.h"

class Receive :publicsigslot::has_slots<>,publictalk_base::MessageHandler {

public:

    Receive(void);

    ~Receive();

    enum {

        Message_Init,

        Message_Destory,

    };

    //初始化和销毁

    void InitData(constchar *json);

    void Destory();

    //继承MessageHandler的消息处理

    virtual void OnMessage(talk_base::Message* msg);

    //sigslot事件 注册一个Event事件

    /*注意这里的参数必须和Sender中的SignalEventContent参数个数匹配*/

    void OnEvent(Sender* mysender,Sender::SenderStatus,int code,const std::string& content);

private:

    talk_base::Thread *_receiveThread;

    Sender* _sender;

};

//receive.cpp

#include "Receive.h"

Receive::Receive(void) {

    _receiveThread = new talk_base::Thread();

    _receiveThread->SetName("ReceiveThread",_receiveThread);

    _receiveThread->Start();

}

Receive::~Receive() {

    //这里Post Message_Destory消息,通知释放资源

    _receiveThread->Post(this,Message_Destory);

    delete_receiveThread;

    _receiveThread = NULL;

}

void Receive::Destory() {

    //释放资源

}

//外部接口,形参为json格式,支持任意参数接入

void Receive::InitData(constchar *json) {

    //这里可以使用_myThread->Post(this,Message_Init)方式(类似Message_Destory)进一步初始化操作.不例举了.

    //创建发送事件对象

    _sender = newSender();

    //sender对象和receive对象建立连接

    _sender->SignalEventContent.connect(this, &Receive::OnEvent);

}

void Receive::OnEvent(Sender *mysender,Sender::SenderStatus,int code,conststd::string& content) {

    //事件响应接口.通过sigslot实现了sender对象中的事件传递到receive对象

}


void Receive::OnMessage(talk_base::Message *msg) {

    switch (msg->message_id) {

        caseMessage_Destory: {

            Destory();

        }

            break;

    }

}

//sender.h

#include <stdio.h>

#include <vector>

#include <string>

#include "sigslot.h"

#include "thread.h"

#include "messagehandler.h"

class Sender

    :publicsigslot::has_slots<>,

     publictalk_base::MessageHandler {

public:

    Sender(void);

    ~Sender();

    enum SenderStatus {

        Sender_Init,

        Sender_Destroy,

        Sender_Event,

    };

    //signal4表示后面接4个参数,sigslot里面最多支持8个参数,要支持不同的参数使用signal0-8

    /*4个参数分别表示:当前类指针,Status,codecontent*/

    sigslot::signal4<Sender*, SenderStatus, int,const std::string& > SignalEventContent;

    void OnNetWorkEvent(int code,conststd::string& content);

    //继承关系不能省略

    virtual void OnMessage(talk_base::Message* msg);

private:

    //talk_base::Thread *_senderThread;

};

//sender.cpp

#include "Sender.h"

Sender::Sender(void) {

   /* _senderThread = new talk_base::Thread();

    _senderThread->SetName("SendThread", _senderThread);

    _senderThread->Start();*/

}

Sender::~Sender() {}


void Sender::OnNetWorkEvent(int code,conststd::string& content) {

    // 通过网络响应的事件接口(网络超时,接收数据接口)

    //使用sigslot,使sender的对象传递事件

    SignalEventContent(this,Sender_Event,code,content);

}

void Sender::OnMessage(talk_base::Message* msg) {}

0 0