root/src/add-ons/kernel/file_systems/netfs/client/ServerManager.h
// ServerManager.h

#ifndef NET_FS_SERVER_MANAGER_H
#define NET_FS_SERVER_MANAGER_H

#include "Locker.h"

class ExtendedServerInfo;
class NetAddress;

// ServerManager
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;
};

// Listener
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  // NET_FS_SERVER_MANAGER_H