haiku/headers/private/index_server/IndexServerAddOn.h

137 lines
3.1 KiB
C
Raw Normal View History

/*
* Copyright 2010, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
* Clemens Zeidler <haiku@clemens-zeidler.de>
*/
#ifndef INDEX_SERVER_ADD_ON_H
#define INDEX_SERVER_ADD_ON_H
#include <Autolock.h>
#include <Entry.h>
#include <image.h>
#include <ObjectList.h>
#include <String.h>
#include <Volume.h>
#include "Referenceable.h"
class analyser_settings {
public:
analyser_settings();
bool catchUpEnabled;
//! the volume is scanned form 0 to syncPosition, from
//! syncPosition to watchingStart the volume is not scanned
bigtime_t syncPosition;
bigtime_t watchingStart;
bigtime_t watchingPosition;
};
class FileAnalyser;
/*! Thread safe class to sync settings between different FileAnalyser. For
example the watcher analyser and the catch up analyser. Because the lock
overhead use it only when necessary or use a cached analyser_settings if
possible. */
class AnalyserSettings : public BReferenceable {
public:
AnalyserSettings(const BString& name,
const BVolume& volume);
const BString& Name() { return fName; }
const BVolume& Volume() { return fVolume; }
bool ReadSettings();
bool WriteSettings();
analyser_settings RawSettings();
// settings
void SetCatchUpEnabled(bool enabled);
void SetSyncPosition(bigtime_t time);
void SetWatchingStart(bigtime_t time);
void SetWatchingPosition(bigtime_t time);
bool CatchUpEnabled();
bigtime_t SyncPosition();
bigtime_t WatchingStart();
bigtime_t WatchingPosition();
private:
BString fName;
BVolume fVolume;
BLocker fSettingsLock;
analyser_settings fAnalyserSettings;
};
class FileAnalyser {
public:
FileAnalyser(const BString& name,
const BVolume& volume);
virtual ~FileAnalyser() {}
void SetSettings(AnalyserSettings* settings);
AnalyserSettings* Settings() const;
const analyser_settings& CachedSettings() const;
void UpdateSettingsCache();
const BString& Name() const { return fName; }
const BVolume& Volume() const { return fVolume; }
virtual status_t InitCheck() = 0;
virtual void AnalyseEntry(const entry_ref& ref) = 0;
virtual void DeleteEntry(const entry_ref& ref) { }
virtual void MoveEntry(const entry_ref& oldRef,
const entry_ref& newRef) { }
//! If the indexer send a bunch of entry this indicates that the last one
//! has been arrived.
virtual void LastEntry() { }
protected:
BVolume fVolume;
BReference<AnalyserSettings> fAnalyserSettings;
analyser_settings fCachedSettings;
private:
BString fName;
};
typedef BObjectList<FileAnalyser> FileAnalyserList;
class IndexServerAddOn {
public:
IndexServerAddOn(image_id id, const char* name)
:
fImageId(id),
fName(name)
{
}
virtual ~IndexServerAddOn() {}
image_id ImageId() { return fImageId; }
BString Name() { return fName; }
virtual FileAnalyser* CreateFileAnalyser(const BVolume& volume) = 0;
private:
image_id fImageId;
BString fName;
};
typedef IndexServerAddOn* create_index_server_addon(image_id id,
const char* name);
#endif