root/src/servers/net/Services.h
/*
 * Copyright 2006-2015, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Axel Dörfler, axeld@pinc-software.de
 */
#ifndef SERVICES_H
#define SERVICES_H


#include <Handler.h>
#include <Locker.h>

#include <map>
#include <string>
#include <sys/select.h>


struct service;
struct service_connection;
typedef std::map<std::string, service*> ServiceNameMap;
typedef std::map<int, service_connection*> ServiceSocketMap;


class Services : public BHandler {
public:
                                                                Services(const BMessage& services);
        virtual                                         ~Services();

                        status_t                        InitCheck() const;

        virtual void                            MessageReceived(BMessage* message);

private:
                        void                            _NotifyListener(bool quit = false);
                        void                            _UpdateMinMaxSocket(int socket);
                        status_t                        _StartService(struct service& service);
                        status_t                        _StopService(struct service* service);
                        status_t                        _ToService(const BMessage& message,
                                                                        struct service*& service);
                        void                            _Update(const BMessage& services);
                        status_t                        _LaunchService(struct service& service,
                                                                        int socket);
                        status_t                        _Listener();
        static  status_t                        _Listener(void* self);

private:
                        thread_id                       fListener;
                        BLocker                         fLock;
                        ServiceNameMap          fNameMap;
                        ServiceSocketMap        fSocketMap;
                        uint32                          fUpdate;
                        int                                     fReadPipe;
                        int                                     fWritePipe;
                        int                                     fMinSocket;
                        int                                     fMaxSocket;
                        fd_set                          fSet;
};


const static uint32 kMsgUpdateServices = 'srvU';


#endif  // SERVICES_H