#ifndef NET_FS_SERVER_MANAGER_H
#define NET_FS_SERVER_MANAGER_H
#include "Locker.h"
class ExtendedServerInfo;
class NetAddress;
class ServerManager {
public:
class Listener;
public:
ServerManager(Listener* listener);
~ServerManager();
status_t Init();
void Uninit();
void Run();
ExtendedServerInfo* GetServerInfo(const NetAddress& address);
status_t AddServer(const NetAddress& address);
void RemoveServer(const NetAddress& address);
private:
struct ServerInfoMap;
class ServerInfoTask;
friend class ServerInfoTask;
static int32 _BroadcastListenerEntry(void* data);
int32 _BroadcastListener();
status_t _InitBroadcastListener();
void _TerminateBroadcastListener();
void _ServerAdded(ExtendedServerInfo* serverInfo);
void _ServerUpdated(ExtendedServerInfo* serverInfo);
void _AddingServerFailed(
ExtendedServerInfo* serverInfo);
void _UpdatingServerFailed(
ExtendedServerInfo* serverInfo);
void _RemoveServer(ExtendedServerInfo* serverInfo);
private:
Locker fLock;
ServerInfoMap* fServerInfos;
thread_id fBroadcastListener;
int32 fBroadcastListenerSocket;
Listener* fListener;
volatile bool fTerminating;
};
class ServerManager::Listener {
public:
Listener() {}
virtual ~Listener();
virtual void ServerAdded(ExtendedServerInfo* serverInfo) = 0;
virtual void ServerUpdated(ExtendedServerInfo* oldInfo,
ExtendedServerInfo* newInfo) = 0;
virtual void ServerRemoved(
ExtendedServerInfo* serverInfo) = 0;
};
#endif