1/*
2 * Copyright 2011, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Clemens Zeidler <haiku@clemens-zeidler.de>
7 */
8
9
10#include "QueryMonitor.h"
11
12
13QueryHandler::QueryHandler(EntryViewInterface* listener)
14	:
15	FileMonitor(listener)
16{
17
18}
19
20
21void
22QueryHandler::MessageReceived(BMessage* message)
23{
24	int32 opcode;
25	if (message->what == B_QUERY_UPDATE
26		&& message->FindInt32("opcode", &opcode) == B_OK) {
27		switch (opcode) {
28			case B_ENTRY_CREATED:
29			case B_ENTRY_REMOVED:
30				message->what = B_NODE_MONITOR;
31				break;
32		}
33	}
34
35	FileMonitor::MessageReceived(message);
36}
37
38
39QueryReader::QueryReader(QueryHandler* handler)
40	:
41	ReadThread(handler)
42{
43
44}
45
46
47QueryReader::~QueryReader()
48{
49	Reset();
50}
51
52
53bool
54QueryReader::AddQuery(BQuery* query)
55{
56	query->SetTarget(fTarget);
57	query->Fetch();
58	return fQueries.AddItem(query);
59}
60
61
62void
63QueryReader::Reset()
64{
65	Stop();
66	Wait();
67
68	for (int32 i = 0; i < fLiveQueries.CountItems(); i++)
69		delete fLiveQueries.ItemAt(i);
70	fLiveQueries.MakeEmpty();
71
72	for (int32 i = 0; i < fQueries.CountItems(); i++)
73		delete fQueries.ItemAt(i);
74	fQueries.MakeEmpty();
75}
76
77
78bool
79QueryReader::ReadNextEntry(entry_ref& entry)
80{
81	BQuery* query = fQueries.ItemAt(0);
82	if (query == NULL)
83		return false;
84	if (query->GetNextRef(&entry) != B_OK) {
85		fQueries.RemoveItemAt(0);
86		fLiveQueries.AddItem(query);
87		return ReadNextEntry(entry);
88	}
89	return true;
90}
91