1/*
2 * Copyright 2004, Waldemar Kornewald <wkornew@gmx.net>
3 * Distributed under the terms of the MIT License.
4 */
5
6/*!	\class SimpleMessageFilter
7	\brief This is a BMessageFilter that can filter multiple \a what values.
8
9	This class extends the BMessageFilter's ability of handling one \a what value
10	to handling multiple \a what values.
11*/
12
13#include "SimpleMessageFilter.h"
14#include <Message.h>
15
16
17/*!	\brief Creates a copy of the \a what array.
18
19	\param what A pointer to an array of \a what values that should be filtered.
20		The end-of-list indicator is an element valued 0 (zero).
21	\param target The target for messages matching one of the \a what values.
22		If \a target == NULL the messages will be discarded.
23*/
24SimpleMessageFilter::SimpleMessageFilter(const uint32 *what, BHandler *target)
25	: BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE),
26	fTarget(target)
27{
28	if(!what) {
29		fWhatArray = NULL;
30		return;
31	}
32
33	// include the trailing zero in the copy
34	int32 count = 0;
35	while(what[count++] != 0)
36		;
37	fWhatArray = new uint32[count];
38	memcpy(fWhatArray, what, count * sizeof(uint32));
39}
40
41
42//! Frees the copied \a what array.
43SimpleMessageFilter::~SimpleMessageFilter()
44{
45	delete fWhatArray;
46}
47
48
49//! Filters all messages that match the \a what array given in the constructor.
50filter_result
51SimpleMessageFilter::Filter(BMessage *message, BHandler **target)
52{
53	for(int32 index = 0; fWhatArray[index] != 0; index++)
54		if(fWhatArray[index] == message->what) {
55			if(!fTarget)
56				return B_SKIP_MESSAGE;
57
58			*target = fTarget;
59			break;
60		}
61
62	return B_DISPATCH_MESSAGE;
63}
64