Blob Blame Raw
#ifndef PROTOCOL_H
#define PROTOCOL_H


#include <mutex>

#include "error.h"
#include "address.h"


class Protocol;
class Connection;
class Server;


class Socket {
private:
	bool closed;
	Socket *prev, *next;
	
public:
	Protocol &protocol;
	Connection * const connection;
	Server * const server;
	const Address &address;
	
protected:
	Socket(const Socket&) = delete;
	Socket(Protocol &protocol, Connection *connection, Server *server, const Address &address);
	
public:
	void close();
	virtual ~Socket();
	
protected:
	virtual void onClose();
};


class Protocol {
public:
	typedef std::recursive_mutex Mutex;
	typedef std::lock_guard<Mutex> Lock;
	
private:
	friend class Socket;
	Mutex mutex;
	Socket *first, *last;
	
public:
	Protocol();
	virtual ~Protocol();
	virtual ErrorCode connect(Connection &connection, const Address &address);
	virtual ErrorCode listen(Server &server, const Address &address);
	void closeAll();
};


#endif