#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