#ifndef MS_UNIX_STREAM_SOCKET_HANDLE_HPP
#define MS_UNIX_STREAM_SOCKET_HANDLE_HPP
#include "common.hpp"
#include <uv.h>
class UnixStreamSocketHandle
{
public:
struct UvWriteData
{
explicit UvWriteData(size_t storeSize) : store(new uint8_t[storeSize])
{
}
UvWriteData(const UvWriteData&) = delete;
~UvWriteData()
{
delete[] this->store;
}
uv_write_t req{};
uint8_t* store{ nullptr };
};
enum class Role : uint8_t
{
PRODUCER = 1,
CONSUMER
};
public:
UnixStreamSocketHandle(int fd, size_t bufferSize, UnixStreamSocketHandle::Role role);
UnixStreamSocketHandle& operator=(const UnixStreamSocketHandle&) = delete;
UnixStreamSocketHandle(const UnixStreamSocketHandle&) = delete;
virtual ~UnixStreamSocketHandle();
public:
void Close();
bool IsClosed() const
{
return this->closed;
}
void Write(const uint8_t* data, size_t len);
uint32_t GetSendBufferSize() const;
void SetSendBufferSize(uint32_t size);
uint32_t GetRecvBufferSize() const;
void SetRecvBufferSize(uint32_t size);
public:
void OnUvReadAlloc(size_t suggestedSize, uv_buf_t* buf);
void OnUvRead(ssize_t nread, const uv_buf_t* buf);
void OnUvWriteError(int error);
protected:
virtual void UserOnUnixStreamRead() = 0;
virtual void UserOnUnixStreamSocketClosed() = 0;
private:
uv_pipe_t* uvHandle{ nullptr };
bool closed{ false };
bool isClosedByPeer{ false };
bool hasError{ false };
protected:
size_t bufferSize{ 0u };
UnixStreamSocketHandle::Role role;
uint8_t* buffer{ nullptr };
size_t bufferDataLen{ 0u };
};
#endif