1/*
2 * Copyright 2006-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel Dörfler, axeld@pinc-software.de
7 */
8#ifndef SERVICES_H
9#define SERVICES_H
10
11
12#include <Handler.h>
13#include <Locker.h>
14
15#include <map>
16#include <string>
17#include <sys/select.h>
18
19
20struct service;
21struct service_address;
22typedef std::map<std::string, service*> ServiceNameMap;
23typedef std::map<int, service_address*> ServiceSocketMap;
24
25
26class Services : public BHandler {
27	public:
28		Services(const BMessage& services);
29		virtual ~Services();
30
31		status_t InitCheck() const;
32
33		virtual void MessageReceived(BMessage* message);
34
35	private:
36		void _NotifyListener(bool quit = false);
37		void _UpdateMinMaxSocket(int socket);
38		status_t _StartService(struct service& service);
39		status_t _StopService(struct service& service);
40		status_t _ToService(const BMessage& message, struct service*& service);
41		void _Update(const BMessage& services);
42		int32 _CompareServices(struct service& a, struct service& b);
43		status_t _LaunchService(struct service& service, int socket);
44		status_t _Listener();
45		static status_t _Listener(void* self);
46
47		thread_id	fListener;
48		BLocker		fLock;
49		ServiceNameMap fNameMap;
50		ServiceSocketMap fSocketMap;
51		uint32		fUpdate;
52		int			fReadPipe;
53		int			fWritePipe;
54		int			fMinSocket;
55		int			fMaxSocket;
56		fd_set		fSet;
57};
58
59const static uint32 kMsgUpdateServices = 'srvU';
60
61#endif	// SERVICES_H
62