⛏️ index : haiku.git

/*
 * Copyright 2010, Haiku.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Clemens Zeidler <haiku@clemens-zeidler.de>
 */
#ifndef INDEX_SERVER_H
#define INDEX_SERVER_H


#include <Application.h>
#include <MessageRunner.h>
#include <VolumeRoster.h>

#include <AddOnMonitorHandler.h>
#include <ObjectList.h>

#include "IndexServerAddOn.h"
#include "VolumeWatcher.h"


#define DEBUG_INDEX_SERVER
#ifdef DEBUG_INDEX_SERVER
#include <stdio.h>
#	define STRACE(x...) printf(x)
#else
#	define STRACE(x...) ;
#endif


class IndexServer;


class VolumeObserverHandler : public BHandler {
public:
								VolumeObserverHandler(IndexServer* indexServer);
			void				MessageReceived(BMessage *message);
private:
			IndexServer*		fIndexServer;
};


class AnalyserMonitorHandler : public AddOnMonitorHandler {
public:
								AnalyserMonitorHandler(
									IndexServer* indexServer);

private:
			void				AddOnEnabled(
									const add_on_entry_info* entryInfo);
			void				AddOnDisabled(
									const add_on_entry_info* entryInfo);

			IndexServer*		fIndexServer;
};


class IndexServer : public BApplication {
public:
								IndexServer();
	virtual						~IndexServer();

	virtual void				ReadyToRun();
	virtual	void				MessageReceived(BMessage *message);

	virtual	bool				QuitRequested();

			void				AddVolume(const BVolume& volume);
			void				RemoveVolume(const BVolume& volume);

			void				RegisterAddOn(entry_ref ref);
			void				UnregisterAddOn(entry_ref ref);

			//! thread safe
			FileAnalyser*		CreateFileAnalyser(const BString& name,
									const BVolume& volume);
private:
			void				_StartWatchingVolumes();
			void				_StopWatchingVolumes();

			void				_SetupVolumeWatcher(VolumeWatcher* watcher);
			FileAnalyser*		_SetupFileAnalyser(IndexServerAddOn* addon,
									const BVolume& volume);
			void				_StartWatchingAddOns();

	inline	IndexServerAddOn*	_FindAddon(const BString& name);

			BVolumeRoster		fVolumeRoster;
			BObjectList<VolumeWatcher>		fVolumeWatcherList;
			BObjectList<IndexServerAddOn>	fAddOnList;

			VolumeObserverHandler	fVolumeObserverHandler;

			AnalyserMonitorHandler	fAddOnMonitorHandler;
			BMessageRunner*			fPulseRunner;
};


#endif