haiku/src/kits/tracker/VirtualDirectoryManager.h

118 lines
2.9 KiB
C
Raw Normal View History

/*
* Copyright 2013, Haiku, Inc.
* Distributed under the terms of the MIT License.
*
* Authors:
* Ingo Weinhold, ingo_weinhold@gmx.de
*/
#ifndef VIRTUAL_DIRECTORY_MANAGER_H
#define VIRTUAL_DIRECTORY_MANAGER_H
#include <dirent.h>
#include <map>
#include <Locker.h>
#include <Node.h>
class BStringList;
namespace BPrivate {
class Model;
class VirtualDirectoryManager {
public:
static VirtualDirectoryManager* Instance();
bool Lock() { return fLock.Lock(); }
void Unlock() { fLock.Unlock(); }
status_t ResolveDirectoryPaths(
const node_ref& definitionFileNodeRef,
const entry_ref& definitionFileEntryRef,
BStringList& _directoryPaths,
node_ref* _definitionFileNodeRef = NULL,
entry_ref* _definitionFileEntryRef = NULL);
bool GetDefinitionFileChangeTime(
const node_ref& definitionFileRef,
bigtime_t& _time) const;
bool GetRootDefinitionFile(
const node_ref& definitionFileRef,
node_ref& _rootDefinitionFileRef);
bool GetSubDirectoryDefinitionFile(
const node_ref& baseDefinitionRef,
const char* subDirName,
entry_ref& _entryRef, node_ref& _nodeRef);
bool GetParentDirectoryDefinitionFile(
const node_ref& subDirDefinitionRef,
entry_ref& _entryRef, node_ref& _nodeRef);
status_t TranslateDirectoryEntry(
const node_ref& definitionFileRef,
dirent* buffer);
status_t TranslateDirectoryEntry(
const node_ref& definitionFileRef,
entry_ref& entryRef, node_ref& _nodeRef);
bool DefinitionFileChanged(
const node_ref& definitionFileRef);
// returns whether the directory still
// exists
status_t DirectoryRemoved(
const node_ref& definitionFileRef);
static bool GetEntry(const BStringList& directoryPaths,
const char* name, entry_ref* _ref,
struct stat* _st);
private:
class Info;
class RootInfo;
typedef std::map<node_ref, Info*> NodeRefInfoMap;
private:
VirtualDirectoryManager();
Info* _InfoForNodeRef(const node_ref& nodeRef) const;
bool _AddInfo(Info* info);
void _RemoveInfo(Info* info);
void _UpdateTree(RootInfo* root);
void _UpdateTree(Info* info);
void _RemoveDirectory(Info* info);
status_t _ResolveUnknownDefinitionFile(
const node_ref& definitionFileNodeRef,
const entry_ref& definitionFileEntryRef,
Info*& _info);
status_t _CreateRootInfo(
const node_ref& definitionFileNodeRef,
const entry_ref& definitionFileEntryRef,
Info*& _info);
status_t _ReadSubDirectoryDefinitionFileInfo(
const entry_ref& entryRef,
entry_ref& _rootDefinitionFileEntryRef,
BString& _subDirPath);
private:
BLocker fLock;
NodeRefInfoMap fInfos;
};
} // namespace BPrivate
#endif // VIRTUAL_DIRECTORY_MANAGER_H