Program Listing for File CpprestsdkWebSocket.h

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

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

#ifdef USE_CPPRESTSDK

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

#include <cpprest/ws_client.h>

namespace axr {
namespace sdk {
namespace net {

class CpprestsdkWebSocketMessage : public IWebSocketMessage, private web::websockets::client::websocket_incoming_message
{
public:
    CpprestsdkWebSocketMessage(const CpprestsdkWebSocketMessage& msg)
        : web::websockets::client::websocket_incoming_message(msg)
    {
    }

    CpprestsdkWebSocketMessage(const web::websockets::client::websocket_incoming_message& msg)
        : web::websockets::client::websocket_incoming_message(msg)
    {
    }

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

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

    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 pplx::task<void> Send(std::shared_ptr<IWebSocketMessage> message) override;

private:
    web::websockets::client::websocket_callback_client m_client;
    std::vector<CloseCallback> m_closeCallbacks;
    std::shared_ptr<Configuration> m_config;
    std::vector<MessageCallback> m_messageCallbacks;

    void OnClose(web::websockets::client::websocket_close_status status, const utility::string_t& reason, const std::error_code& code);

    void OnMessage(const web::websockets::client::websocket_incoming_message& msg);
};

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

#endif // USE_CPPRESTSDK