/* * 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