1/*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Copyright 2013, Rene Gollent, rene@gollent.com.
4 * Distributed under the terms of the MIT License.
5 */
6#ifndef FILE_MANAGER_H
7#define FILE_MANAGER_H
8
9#include <map>
10
11#include <Locker.h>
12#include <Message.h>
13#include <String.h>
14
15#include <util/DoublyLinkedList.h>
16#include <util/OpenHashTable.h>
17
18
19class LocatableEntry;
20class LocatableFile;
21class SourceFile;
22class TeamFileManagerSettings;
23
24
25class FileManager {
26public:
27								FileManager();
28								~FileManager();
29
30			status_t			Init(bool targetIsLocal);
31
32			bool				Lock()		{ return fLock.Lock(); }
33			void				Unlock()	{ fLock.Unlock(); }
34
35			LocatableFile*		GetTargetFile(const BString& directory,
36									const BString& relativePath);
37										// returns a reference
38			LocatableFile*		GetTargetFile(const BString& path);
39										// returns a reference
40			void				TargetEntryLocated(const BString& path,
41									const BString& locatedPath);
42
43			LocatableFile*		GetSourceFile(const BString& directory,
44									const BString& relativePath);
45										// returns a reference
46			LocatableFile*		GetSourceFile(const BString& path);
47										// returns a reference
48			status_t			SourceEntryLocated(const BString& path,
49									const BString& locatedPath);
50
51			status_t			LoadSourceFile(LocatableFile* file,
52									SourceFile*& _sourceFile);
53										// returns a reference
54
55			status_t			LoadLocationMappings(TeamFileManagerSettings*
56									settings);
57			status_t			SaveLocationMappings(TeamFileManagerSettings*
58									settings);
59
60private:
61			struct EntryPath;
62			struct EntryHashDefinition;
63			class Domain;
64			struct SourceFileEntry;
65			struct SourceFileHashDefinition;
66
67			typedef BOpenHashTable<EntryHashDefinition> LocatableEntryTable;
68			typedef BOpenHashTable<SourceFileHashDefinition> SourceFileTable;
69			typedef std::map<BString, BString> LocatedFileMap;
70
71			friend struct SourceFileEntry;
72				// for gcc 2
73
74private:
75			SourceFileEntry*	_LookupSourceFile(const BString& path);
76			void				_SourceFileUnused(SourceFileEntry* entry);
77			bool				_LocateFileIfMapped(const BString& sourcePath,
78									LocatableFile* file);
79
80private:
81			BLocker				fLock;
82			Domain*				fTargetDomain;
83			Domain*				fSourceDomain;
84			SourceFileTable*	fSourceFiles;
85			LocatedFileMap		fSourceLocationMappings;
86};
87
88
89
90#endif	// FILE_MANAGER_H
91