* Copyright 2011, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Clemens Zeidler <haiku@clemens-zeidler.de>
*/
#include "QueryMonitor.h"
QueryHandler::QueryHandler(EntryViewInterface* listener)
:
FileMonitor(listener)
{
}
void
QueryHandler::MessageReceived(BMessage* message)
{
int32 opcode;
if (message->what == B_QUERY_UPDATE
&& message->FindInt32("opcode", &opcode) == B_OK) {
switch (opcode) {
case B_ENTRY_CREATED:
case B_ENTRY_REMOVED:
message->what = B_NODE_MONITOR;
break;
}
}
FileMonitor::MessageReceived(message);
}
QueryReader::QueryReader(QueryHandler* handler)
:
ReadThread(handler)
{
}
QueryReader::~QueryReader()
{
Reset();
}
bool
QueryReader::AddQuery(BQuery* query)
{
query->SetTarget(fTarget);
query->Fetch();
return fQueries.AddItem(query);
}
void
QueryReader::Reset()
{
Stop();
Wait();
for (int32 i = 0; i < fLiveQueries.CountItems(); i++)
delete fLiveQueries.ItemAt(i);
fLiveQueries.MakeEmpty();
for (int32 i = 0; i < fQueries.CountItems(); i++)
delete fQueries.ItemAt(i);
fQueries.MakeEmpty();
}
bool
QueryReader::ReadNextEntry(entry_ref& entry)
{
BQuery* query = fQueries.ItemAt(0);
if (query == NULL)
return false;
if (query->GetNextRef(&entry) != B_OK) {
fQueries.RemoveItemAt(0);
fLiveQueries.AddItem(query);
return ReadNextEntry(entry);
}
return true;
}