1// ServerManager.h
2
3#ifndef NET_FS_SERVER_MANAGER_H
4#define NET_FS_SERVER_MANAGER_H
5
6#include "Locker.h"
7
8class ExtendedServerInfo;
9class NetAddress;
10
11// ServerManager
12class ServerManager {
13public:
14			class Listener;
15
16public:
17								ServerManager(Listener* listener);
18								~ServerManager();
19
20			status_t			Init();
21			void				Uninit();
22
23			void				Run();
24
25			ExtendedServerInfo*	GetServerInfo(const NetAddress& address);
26			status_t			AddServer(const NetAddress& address);
27			void				RemoveServer(const NetAddress& address);
28
29private:
30			struct ServerInfoMap;
31			class ServerInfoTask;
32			friend class ServerInfoTask;
33
34	static	int32				_BroadcastListenerEntry(void* data);
35			int32				_BroadcastListener();
36			status_t			_InitBroadcastListener();
37			void				_TerminateBroadcastListener();
38
39			void				_ServerAdded(ExtendedServerInfo* serverInfo);
40			void				_ServerUpdated(ExtendedServerInfo* serverInfo);
41			void				_AddingServerFailed(
42									ExtendedServerInfo* serverInfo);
43			void				_UpdatingServerFailed(
44									ExtendedServerInfo* serverInfo);
45			void				_RemoveServer(ExtendedServerInfo* serverInfo);
46
47private:
48			Locker				fLock;
49			ServerInfoMap*		fServerInfos;
50			thread_id			fBroadcastListener;
51			int32				fBroadcastListenerSocket;
52			Listener*			fListener;
53			volatile bool		fTerminating;
54};
55
56// Listener
57class ServerManager::Listener {
58public:
59								Listener()	{}
60	virtual						~Listener();
61
62	virtual	void				ServerAdded(ExtendedServerInfo* serverInfo) = 0;
63	virtual	void				ServerUpdated(ExtendedServerInfo* oldInfo,
64									ExtendedServerInfo* newInfo) = 0;
65	virtual	void				ServerRemoved(
66									ExtendedServerInfo* serverInfo) = 0;
67};
68
69
70#endif	// NET_FS_SERVER_MANAGER_H
71