Program Listing for File WsppWebSocket.h

Return to documentation for file (axr.sdk/net/WsppWebSocket.h)

// Copyright (C) AcceleratXR, Inc. All rights reserved.
#pragma once

#include "IWebSocket.h"
#include "../Configuration.h"

#include <memory.h>
#include <websocketpp/common/thread.hpp>
#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>

namespace axr {
namespace sdk {
namespace net {

typedef websocketpp::client<websocketpp::config::asio_tls_client> wsclient;
typedef std::shared_ptr<boost::asio::ssl::context> context_ptr;

class WsppWebSocketMessage : public IWebSocketMessage
{
public:
    WsppWebSocketMessage(pplx::cancellation_token cts, wsclient::message_ptr msg)
        : m_Cts(cts)
        , m_Value(msg)
    {
    }

    virtual std::vector<uint8_t> GetData() const override;

    virtual utility::string_t GetString() const override;

    virtual WebSocketMessageType GetType() const override;

    virtual pplx::task<std::vector<uint8_t>> ExtractData() const override;

    virtual pplx::task<utility::string_t> ExtractString() const override;

private:
    pplx::cancellation_token m_Cts;
    wsclient::message_ptr m_Value;
};

class WsppWebSocket : public IWebSocket
{
public:
    WsppWebSocket(std::shared_ptr<Configuration> config);
    ~WsppWebSocket();

    virtual std::vector<CloseCallback>::const_iterator AddCloseHandler(CloseCallback callback) override;

    virtual void RemoveCloseHandler(std::vector<CloseCallback>::const_iterator iter) override;

    virtual std::vector<MessageCallback>::const_iterator AddMessageHandler(MessageCallback callback) override;

    virtual void RemoveMessageHandler(std::vector<MessageCallback>::const_iterator iter) override;

    virtual pplx::task<void> Connect(utility::string_t uri) override;

    virtual pplx::task<void> Close() override;

    virtual WebSocketStatus GetStatus() override
    {
        return m_Status;
    }

    virtual pplx::task<void> Send(std::shared_ptr<IWebSocketMessage> message) override;

private:
    std::vector<CloseCallback> m_CloseCallbacks;
    std::shared_ptr<Configuration> m_Config;
    wsclient m_Endpoint;
    websocketpp::connection_hdl m_Handle;
    std::vector<MessageCallback> m_MessageCallbacks;
    WebSocketStatus m_Status;

    void onClose(websocketpp::connection_hdl hdl);
    void onFail(websocketpp::connection_hdl hdl);
    void onMessage(websocketpp::connection_hdl hdl, wsclient::message_ptr msg);
    void onOpen(websocketpp::connection_hdl hdl);
    static context_ptr OnTlsInit();
};

} // namespace net
} // namespace sdk
} // namespace axr