WebSocket

#ifndef __CC_WEBSOCKET_H__

#define __CC_WEBSOCKET_H__


#include "ExtensionMacros.h"

#include "cocos2d.h"

#include "libwebsockets.h"

#include <list>


NS_CC_EXT_BEGIN


class WsThreadHelper;

class WsMessage;


class WebSocket

{

public:

    WebSocket();

    virtual ~WebSocket();

    

    /**

     *  @brief Data structure for message

     */

    struct Data

    {

        Data():bytes(NULL), len(0), isBinary(false){}

        char* bytes;

        int len;

        bool isBinary;

    };

    

    /**

     *  @brief Errors in websocket

     */

    enum ErrorCode

    {

        kErrorTimeout = 0,

        kErrorConnectionFailure,

        kErrorUnknown

    };


    /**

     *  @brief The delegate class to process websocket events.

     */

    class Delegate

    {

    public:

        virtual ~Delegate() {}

        virtual void onOpen(WebSocket* ws) = 0;

        virtual void onMessage(WebSocket* ws, const Data& data) = 0;

        virtual void onClose(WebSocket* ws) = 0;

        virtual void onError(WebSocket* ws, const ErrorCode& error) = 0;

    };

    

    

    /**

     *  @brief  The initialized method for websocket.

     *          It needs to be invoked right after websocket instance is allocated.

     *  @param  delegate The delegate which want to receive event from websocket.

     *  @param  url      The URL of websocket server.

     *  @return true: Success, false: Failure

     */

    bool init(const Delegate& delegate,

              const std::string& url,

              const std::vector<std::string>* protocols = NULL);

    

    /**

     *  @brief Sends string data to websocket server.

     */

    void send(const std::string& message);

    

    /**

     *  @brief Sends binary data to websocket server.

     */

    void send(const unsigned char* binaryMsg, unsigned int len);

    

    /**

     *  @brief Closes the connection to server.

     */

    void close();


    /**

     *  Websocket state

     */

    enum State

    {

        kStateConnecting = 0,

        kStateOpen,

        kStateClosing,

        kStateClosed

    };

    

    /**

     *  @brief Gets current state of connection.

     */

    State getReadyState();

private:

    virtual void onSubThreadStarted();

    virtual int onSubThreadLoop();

    virtual void onSubThreadEnded();

    virtual void onUIThreadReceiveMessage(WsMessage* msg);

    


    friend class WebSocketCallbackWrapper;

    int onSocketCallback(struct libwebsocket_context *ctx,

                         struct libwebsocket *wsi,

                         enum libwebsocket_callback_reasons reason,

                         void *user, void *in, size_t len);

    

private:

State        _readyState;

    std::string  _host;

    unsigned int _port;

    std::string  _path;

    

    friend class WsThreadHelper;

    WsThreadHelper* _wsHelper;

    

    struct libwebsocket*         _wsInstance;

    struct libwebsocket_context* _wsContext;

    Delegate* _delegate;

    int _SSLConnection;

    struct libwebsocket_protocols* _wsProtocols;

};


NS_CC_EXT_END


#endif /* defined(__CC_JSB_WEBSOCKET_H__) */


posted @ 2014-06-05 21:11  zfyouxi  阅读(650)  评论(0编辑  收藏  举报