Blob Blame Raw
#ifndef SOCKET_H
#define SOCKET_H


#include <thread>
#include <atomic>

#include "protocol.h"


enum : ErrorCode  {
	ERR_TCP_COMMON = ERR_TCP,
	ERR_TCP_WORKER_FAILED,
};


class TcpProtocol;


class TcpSocket final: public Socket {
public:
	const int sockId;
protected:
	friend class TcpProtocol;
	
	TcpSocket(
		Protocol &protocol,
		const Connection::Handle &connection,
		const Server::Handle &server,
		const Address &address,
		int sockId );
	
	TcpProtocol& getProtocol()
		{ return *(TcpProtocol*)&protocol; }
};


class TcpProtocol: public Protocol {
private:
	friend class TcpSocket;
	
	std::mutex mutexIdle;
	std::mutex mutexRun;
	std::atomic<bool> wantRun;
	
	std::thread *thread;
	int epollId;
	int eventsId;
	
	void controlCommand(unsigned long long cmd);
	void threadConnectionWrite(TcpSocket *socket, const Connection::Handle &connection);
	void threadConnectionRead(TcpSocket *socket, const Connection::Handle &connection);
	void threadProcessEvents(void *eventsPtr, int count);
	void threadRun();
	
public:
	TcpProtocol();
	~TcpProtocol();
	
	ErrorCode resolve(Address &address) override;
	
protected:
	ErrorCode onStart() override;
	void onStop(ErrorCode) override;
	void onSocketChanged(Socket *socket) override;
	ErrorCode onConnect(const Connection::Handle &connection, const Address &address) override;
	ErrorCode onListen(const Server::Handle &server, const Address &address) override;
};


#endif