#ifndef SERVER_H
#define SERVER_H
#include <mutex>
#include "error.h"
#include "address.h"
class Socket;
class Protocol;
class Connection;
enum : ErrorCode {
ERR_SERVER_COMMON = ERR_SERVER,
ERR_SERVER_LISTENING_FAILED,
ERR_SERVER_UNFINISHED_CONNECTIONS,
ERR_SERVER_LISTENING_LOST,
};
class Server {
public:
typedef std::recursive_mutex Mutex;
typedef std::lock_guard<Mutex> Lock;
private:
Mutex mutex;
Socket *socket;
public:
Server();
~Server();
void open(Socket *socket);
ErrorCode open(Protocol &protocol, const Address &localAddres);
void close(ErrorCode errorCode = ERR_NONE);
protected:
Protocol& getProtocol() const;
const Address& getLocalAddress() const;
void onOpen();
void onClose(ErrorCode errorCode);
Connection* onConnect(const Address &remoteAddres);
void onDisconnect(Connection *connection);
};
#endif