1/*
2 * Copyright 2015, Axel D��rfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef QUERY_LIST_H
6#define QUERY_LIST_H
7
8
9#include <map>
10#include <vector>
11
12#include <Entry.h>
13#include <Handler.h>
14#include <Locker.h>
15#include <ObjectList.h>
16#include <Query.h>
17
18
19class QueryList;
20
21
22class QueryListener {
23public:
24	virtual 				~QueryListener();
25	virtual	void				EntryCreated(QueryList& source,
26									const entry_ref& ref, ino_t node) = 0;
27	virtual	void				EntryRemoved(QueryList& source,
28									const node_ref& nodeRef) = 0;
29};
30
31
32typedef std::map<node_ref, entry_ref> RefMap;
33
34
35class QueryList : public BHandler, public BLocker {
36public:
37								QueryList();
38	virtual						~QueryList();
39
40			status_t			Init(const char* predicate,
41									BVolume* volume = NULL);
42
43			void				AddListener(QueryListener* listener);
44			void				RemoveListener(QueryListener* listener);
45
46			const RefMap&		Entries() const
47									{ return fRefs; }
48
49	virtual	void				MessageReceived(BMessage* message);
50
51private:
52			void				_AddEntry(const entry_ref& ref, ino_t node);
53			void				_RemoveEntry(const node_ref& nodeRef);
54			void				_NotifyEntryCreated(const entry_ref& ref,
55									ino_t node);
56			void				_NotifyEntryRemoved(const node_ref& nodeRef);
57			void				_AddVolume(BVolume& volume,
58									const char* predicate);
59
60	static	status_t			_FetchQuery(void* self);
61			status_t			_FetchQuery();
62
63private:
64	typedef std::vector<thread_id> ThreadVector;
65	typedef std::vector<BQuery*> QueryVector;
66
67			bool				fQuit;
68			RefMap				fRefs;
69			QueryVector			fQueries;
70			QueryVector			fQueryQueue;
71			ThreadVector		fFetchThreads;
72			BObjectList<QueryListener> fListeners;
73};
74
75
76#endif // QUERY_LIST_H
77