Implement sceleton of TCP interface

pull/1/head
michal.szwaj 2018-03-12 16:43:35 +01:00
parent 3db2770ac4
commit eb98ceadf5
7 changed files with 233 additions and 34 deletions

View File

@ -29,40 +29,41 @@ namespace error
enum class ErrorCode enum class ErrorCode
{ {
NONE, NONE = 0,
USB_CLAIM_INTERFACE, USB_CLAIM_INTERFACE = 1,
USB_INVALID_CONFIG_DESCRIPTOR, USB_INVALID_CONFIG_DESCRIPTOR = 2,
USB_OBTAIN_INTERFACE_DESCRIPTOR, USB_OBTAIN_INTERFACE_DESCRIPTOR = 3,
USB_EMPTY_INTERFACES, USB_EMPTY_INTERFACES = 4,
USB_INVALID_DEVICE_ENDPOINTS, USB_INVALID_DEVICE_ENDPOINTS = 5,
USB_INVALID_TRANSFER_METHOD, USB_INVALID_TRANSFER_METHOD = 6,
USB_TRANSFER_ALLOCATION, USB_TRANSFER_ALLOCATION = 7,
USB_LIST_DEVICES, USB_LIST_DEVICES = 8,
USB_OBTAIN_CONFIG_DESCRIPTOR, USB_OBTAIN_CONFIG_DESCRIPTOR = 9,
USB_TRANSFER, USB_TRANSFER = 10,
USB_SINK_COMMIT_OVERFLOW, USB_SINK_COMMIT_OVERFLOW = 11,
USB_SINK_CONSUME_UNDERFLOW, USB_SINK_CONSUME_UNDERFLOW = 12,
USB_AOAP_PROTOCOL_VERSION, USB_AOAP_PROTOCOL_VERSION = 13,
USB_EMPTY_DEVICE_LIST, USB_EMPTY_DEVICE_LIST = 14,
USB_AOAP_DEVICE_NOT_FOUND, USB_AOAP_DEVICE_NOT_FOUND = 15,
SSL_READ_CERTIFICATE, SSL_READ_CERTIFICATE = 16,
SSL_READ_PRIVATE_KEY, SSL_READ_PRIVATE_KEY = 17,
SSL_METHOD, SSL_METHOD = 18,
SSL_CONTEXT_CREATION, SSL_CONTEXT_CREATION = 19,
SSL_USE_CERTIFICATE, SSL_USE_CERTIFICATE = 20,
SSL_USE_PRIVATE_KEY, SSL_USE_PRIVATE_KEY = 21,
SSL_HANDLER_CREATION, SSL_HANDLER_CREATION = 22,
SSL_READ_BIO_CREATION, SSL_READ_BIO_CREATION = 23,
SSL_WRITE_BIO_CREATION, SSL_WRITE_BIO_CREATION = 24,
SSL_HANDSHAKE, SSL_HANDSHAKE = 25,
SSL_WRITE, SSL_WRITE = 26,
SSL_READ, SSL_READ = 27,
SSL_BIO_READ, SSL_BIO_READ = 28,
SSL_BIO_WRITE, SSL_BIO_WRITE = 29,
MESSENGER_INTERTWINED_CHANNELS, MESSENGER_INTERTWINED_CHANNELS = 30,
OPERATION_ABORTED, OPERATION_ABORTED = 31,
OPERATION_IN_PROGRESS, OPERATION_IN_PROGRESS = 32,
PARSE_PAYLOAD PARSE_PAYLOAD = 33,
TCP_TRANSFER = 34
}; };
} }

View File

@ -0,0 +1,29 @@
#pragma once
#include <memory>
#include <f1x/aasdk/Common/Data.hpp>
#include <f1x/aasdk/IO/Promise.hpp>
namespace f1x
{
namespace aasdk
{
namespace tcp
{
class ITCPEndpoint
{
public:
typedef std::shared_ptr<ITCPEndpoint> Pointer;
typedef io::Promise<size_t> Promise;
virtual ~ITCPEndpoint() = default;
virtual void send(common::DataConstBuffer buffer, Promise::Pointer promise) = 0;
virtual void receive(common::DataBuffer buffer, Promise::Pointer promise) = 0;
virtual void stop() = 0;
};
}
}
}

View File

@ -0,0 +1,27 @@
#pragma once
#include <functional>
#include <boost/asio/ip/tcp.hpp>
#include <f1x/aasdk/Common/Data.hpp>
namespace f1x
{
namespace aasdk
{
namespace tcp
{
class ITCPWrapper
{
public:
typedef std::function<void(const boost::system::error_code&, size_t)> Handler;
virtual ~ITCPWrapper() = default;
virtual void asyncWrite(boost::asio::ip::tcp::socket& socket, common::DataConstBuffer buffer, Handler handler) = 0;
virtual void asyncRead(boost::asio::ip::tcp::socket& socket, common::DataBuffer buffer, Handler handler) = 0;
};
}
}
}

View File

@ -0,0 +1,34 @@
#pragma once
#include <boost/asio/ip/tcp.hpp>
#include <f1x/aasdk/TCP/ITCPEndpoint.hpp>
#include <f1x/aasdk/TCP/ITCPWrapper.hpp>
namespace f1x
{
namespace aasdk
{
namespace tcp
{
class TCPEndpoint: public ITCPEndpoint, public std::enable_shared_from_this<TCPEndpoint>
{
public:
TCPEndpoint(ITCPWrapper& tcpWrapper, boost::asio::ip::tcp::socket socket);
void send(common::DataConstBuffer buffer, Promise::Pointer promise) override;
void receive(common::DataBuffer buffer, Promise::Pointer promise) override;
void stop() override;
private:
using std::enable_shared_from_this<TCPEndpoint>::shared_from_this;
void asyncOperationHandler(const boost::system::error_code& ec, size_t bytesTransferred, Promise::Pointer promise);
ITCPWrapper& tcpWrapper_;
boost::asio::ip::tcp::socket socket_;
};
}
}
}

View File

@ -0,0 +1,21 @@
#pragma once
#include <f1x/aasdk/TCP/ITCPWrapper.hpp>
namespace f1x
{
namespace aasdk
{
namespace tcp
{
class TCPWrapper: public ITCPWrapper
{
public:
void asyncWrite(boost::asio::ip::tcp::socket& socket, common::DataConstBuffer buffer, Handler handler) override;
void asyncRead(boost::asio::ip::tcp::socket& socket, common::DataBuffer buffer, Handler handler) override;
};
}
}
}

View File

@ -0,0 +1,64 @@
#include <f1x/aasdk/TCP/TCPEndpoint.hpp>
namespace f1x
{
namespace aasdk
{
namespace tcp
{
TCPEndpoint::TCPEndpoint(ITCPWrapper& tcpWrapper, boost::asio::ip::tcp::socket socket)
: tcpWrapper_(tcpWrapper)
, socket_(std::move(socket))
{
}
void TCPEndpoint::send(common::DataConstBuffer buffer, Promise::Pointer promise)
{
tcpWrapper_.asyncWrite(socket_, std::move(buffer),
std::bind(&TCPEndpoint::asyncOperationHandler,
this->shared_from_this(),
std::placeholders::_1,
std::placeholders::_2,
std::move(promise)));
}
void TCPEndpoint::receive(common::DataBuffer buffer, Promise::Pointer promise)
{
tcpWrapper_.asyncRead(socket_, std::move(buffer),
std::bind(&TCPEndpoint::asyncOperationHandler,
this->shared_from_this(),
std::placeholders::_1,
std::placeholders::_2,
std::move(promise)));
}
void TCPEndpoint::stop()
{
try
{
socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
socket_.close();
}
catch(const boost::system::system_error&)
{
}
}
void TCPEndpoint::asyncOperationHandler(const boost::system::error_code& ec, size_t bytesTransferred, Promise::Pointer promise)
{
if(!ec)
{
promise->resolve(bytesTransferred);
}
else
{
promise->reject(error::Error(error::ErrorCode::TCP_TRANSFER, static_cast<uint32_t>(ec.value())));
}
}
}
}
}

View File

@ -0,0 +1,23 @@
#include <boost/asio.hpp>
#include <f1x/aasdk/TCP/TCPWrapper.hpp>
namespace f1x
{
namespace aasdk
{
namespace tcp
{
void TCPWrapper::asyncWrite(boost::asio::ip::tcp::socket& socket, common::DataConstBuffer buffer, Handler handler)
{
boost::asio::async_write(socket, boost::asio::buffer(buffer.cdata, buffer.size), std::move(handler));
}
void TCPWrapper::asyncRead(boost::asio::ip::tcp::socket& socket, common::DataBuffer buffer, Handler handler)
{
boost::asio::async_read(socket, boost::asio::buffer(buffer.data, buffer.size), std::move(handler));
}
}
}
}