1/*
2 * Copyright 2001-2014 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Erik Jaesler, erik@cgsoftware.com
7 */
8#ifndef _MESSAGE_FILTER_H
9#define _MESSAGE_FILTER_H
10
11
12#include <Handler.h>
13
14
15class BMessage;
16
17
18// filter_hook Return Codes and Protocol
19enum filter_result {
20	B_SKIP_MESSAGE,
21	B_DISPATCH_MESSAGE
22};
23
24
25typedef filter_result (*filter_hook)
26	(BMessage* message, BHandler** target, BMessageFilter* filter);
27
28
29// BMessageFilter invocation criteria
30enum message_delivery {
31	B_ANY_DELIVERY,
32	B_DROPPED_DELIVERY,
33	B_PROGRAMMED_DELIVERY
34};
35
36enum message_source {
37	B_ANY_SOURCE,
38	B_REMOTE_SOURCE,
39	B_LOCAL_SOURCE
40};
41
42
43class BMessageFilter {
44public:
45								BMessageFilter(uint32 what,
46									filter_hook func = NULL);
47								BMessageFilter(message_delivery delivery,
48									message_source source, filter_hook func = NULL);
49								BMessageFilter(message_delivery delivery,
50									message_source source, uint32 what,
51									filter_hook func = NULL);
52								BMessageFilter(const BMessageFilter& filter);
53								BMessageFilter(const BMessageFilter* filter);
54	virtual						~BMessageFilter();
55
56			BMessageFilter&		operator=(const BMessageFilter& from);
57
58			// Hook function; ignored if filter_hook is non-NULL
59	virtual	filter_result		Filter(BMessage* message, BHandler** _target);
60
61			message_delivery	MessageDelivery() const;
62			message_source		MessageSource() const;
63			uint32				Command() const;
64			bool				FiltersAnyCommand() const;
65			BLooper*			Looper() const;
66
67private:
68	friend class BLooper;
69	friend class BHandler;
70
71	virtual	void				_ReservedMessageFilter1();
72	virtual	void				_ReservedMessageFilter2();
73
74			void				SetLooper(BLooper* owner);
75			filter_hook			FilterFunction() const;
76
77			bool				fFiltersAny;
78			uint32				fWhat;
79			message_delivery	fDelivery;
80			message_source		fSource;
81			BLooper*			fLooper;
82			filter_hook			fFilterFunction;
83
84			uint32				_reserved[3];
85};
86
87
88#endif	// _MESSAGE_FILTER_H
89