Skip to content

Commit 35c6166

Browse files
committed
Improve MultiFileSystem to allow more file systems
1 parent 6730046 commit 35c6166

File tree

3 files changed

+76
-44
lines changed

3 files changed

+76
-44
lines changed

src/file/MultiFileSystem.cpp

Lines changed: 63 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,110 @@
11
#include "MultiFileSystem.h"
22

3-
MultiFileSystem::MultiFileSystem(cdc::FileSystem* pFS, cdc::FileSystem* pHookFS)
3+
#include "Hook.h"
4+
#include "modules/Log.h"
5+
6+
MultiFileSystem::MultiFileSystem() : m_fileSystems()
47
{
5-
m_pFS = pFS;
6-
m_pHookFS = pHookFS;
78
}
89

9-
// Gets the best file system for a file simply by checking the hook file system first
10-
cdc::FileSystem* MultiFileSystem::GetBestFileSystem(const char* fileName)
10+
void MultiFileSystem::Add(cdc::FileSystem* fileSystem)
1111
{
12-
// First check the hook file system, else fall back to default filesystem
13-
if (m_pHookFS->FileExists(fileName))
12+
m_fileSystems.push_back(fileSystem);
13+
14+
#ifdef _DEBUG
15+
Hook::GetInstance().GetModule<Log>()->WriteLine("Mounted new file system %p, number of systems: %d", fileSystem, m_fileSystems.size());
16+
#endif
17+
}
18+
19+
void MultiFileSystem::Remove(cdc::FileSystem* fileSystem)
20+
{
21+
}
22+
23+
cdc::FileSystem* MultiFileSystem::GetBestFileSystem(const char* fileName) const noexcept
24+
{
25+
for (auto fileSystem : m_fileSystems)
1426
{
15-
return m_pHookFS;
27+
if (fileSystem->FileExists(fileName))
28+
{
29+
return fileSystem;
30+
}
1631
}
1732

18-
return m_pFS;
33+
return nullptr;
1934
}
2035

2136
cdc::FileRequest* MultiFileSystem::RequestRead(cdc::FileReceiver* receiver, const char* fileName, unsigned int startOffset)
2237
{
23-
auto pFS = GetBestFileSystem(fileName);
38+
auto fileSystem = GetBestFileSystem(fileName);
2439

25-
return pFS->RequestRead(receiver, fileName, startOffset);
40+
return fileSystem->RequestRead(receiver, fileName, startOffset);
2641
}
2742

2843
cdc::File* MultiFileSystem::OpenFile(char const* fileName)
2944
{
30-
auto pFS = GetBestFileSystem(fileName);
45+
auto fileSystem = GetBestFileSystem(fileName);
3146

32-
return pFS->OpenFile(fileName);
47+
return fileSystem->OpenFile(fileName);
3348
}
3449

35-
bool MultiFileSystem::FileExists(char const* fileName)
50+
unsigned int MultiFileSystem::GetFileSize(char const* fileName)
3651
{
37-
return m_pFS->FileExists(fileName) || m_pHookFS->FileExists(fileName);
52+
auto fileSystem = GetBestFileSystem(fileName);
53+
54+
return fileSystem->GetFileSize(fileName);
3855
}
3956

40-
unsigned int MultiFileSystem::GetFileSize(char const* fileName)
57+
bool MultiFileSystem::FileExists(char const* fileName)
4158
{
42-
auto pFS = GetBestFileSystem(fileName);
59+
for (auto fileSystem : m_fileSystems)
60+
{
61+
if (fileSystem->FileExists(fileName))
62+
{
63+
return true;
64+
}
65+
}
4366

44-
return pFS->GetFileSize(fileName);
67+
return false;
4568
}
4669

4770
void MultiFileSystem::SetSpecialisationMask(unsigned int specMask)
4871
{
49-
m_pFS->SetSpecialisationMask(specMask);
50-
m_pHookFS->SetSpecialisationMask(specMask);
72+
for (auto fileSystem : m_fileSystems)
73+
{
74+
fileSystem->SetSpecialisationMask(specMask);
75+
}
5176
}
5277

5378
unsigned int MultiFileSystem::GetSpecialisationMask()
5479
{
55-
return m_pFS->GetSpecialisationMask();
80+
return m_fileSystems.empty() ? 0xFFFFFFFF : m_fileSystems[0]->GetSpecialisationMask();
5681
}
5782

58-
// These only need to call the default file system, both will end at the same place
59-
6083
cdc::FileSystem::Status MultiFileSystem::GetStatus()
6184
{
62-
return m_pFS->GetStatus();
85+
for (auto fileSystem : m_fileSystems)
86+
{
87+
if (fileSystem->GetStatus() == BUSY)
88+
{
89+
return BUSY;
90+
}
91+
}
92+
93+
return IDLE;
6394
}
6495

6596
void MultiFileSystem::Update()
6697
{
67-
m_pFS->Update();
98+
for (auto fileSystem : m_fileSystems)
99+
{
100+
fileSystem->Update();
101+
}
68102
}
69103

70104
void MultiFileSystem::Synchronize()
71105
{
72-
m_pFS->Synchronize();
106+
for (auto fileSystem : m_fileSystems)
107+
{
108+
fileSystem->Synchronize();
109+
}
73110
}

src/file/MultiFileSystem.h

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
#pragma once
22

3+
#include <vector>
4+
35
#include "cdc/file/FileSystem.h"
46

5-
// Simplified version for cdc::MultiFileSystem since it does not exist in Legend and Anniversary
6-
// The real MultiFileSystem can dynamically add and re-order systems
7-
//
8-
// This just checks the hook file system first and else falls back to the
9-
// original file system
107
class MultiFileSystem : public cdc::FileSystem
118
{
129
private:
13-
cdc::FileSystem* m_pFS;
14-
cdc::FileSystem* m_pHookFS;
10+
std::vector<cdc::FileSystem*> m_fileSystems;
11+
12+
cdc::FileSystem* GetBestFileSystem(const char* fileName) const noexcept;
1513

16-
cdc::FileSystem* GetBestFileSystem(const char* fileName);
1714
public:
18-
MultiFileSystem(cdc::FileSystem* pFS, cdc::FileSystem* pHookFS);
15+
MultiFileSystem();
16+
17+
void Add(cdc::FileSystem* fileSystem);
18+
void Remove(cdc::FileSystem* fileSystem);
1919

2020
cdc::FileRequest* RequestRead(cdc::FileReceiver* receiver, const char* fileName, unsigned int startOffset);
2121
cdc::File* OpenFile(const char* fileName);
@@ -26,12 +26,4 @@ class MultiFileSystem : public cdc::FileSystem
2626
Status GetStatus();
2727
void Update();
2828
void Synchronize();
29-
30-
#ifdef TR8
31-
void Suspend() { }
32-
bool Resume() { return false; }
33-
bool IsSuspended() { return false; }
34-
char* GetBufferPointer(cdc::FileRequest* request, unsigned int* bytesLocked) { return nullptr; }
35-
void ResetBufferPointer(int value) { }
36-
#endif
3729
};

src/modules/ModLoader.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,10 @@ static void InitArchive()
4343

4444
// Create our hook file system and multi file system
4545
auto fileSystem = CreateHookFileSystem();
46-
auto multiFileSystem = new MultiFileSystem(GetFS(), fileSystem);
46+
auto multiFileSystem = new MultiFileSystem();
47+
48+
multiFileSystem->Add(fileSystem);
49+
multiFileSystem->Add(GetFS());
4750

4851
// Overwrite the original file system with ours
4952
*(cdc::FileSystem**)GET_ADDRESS(0x10E58BC, 0x83888C, 0x9CE278) = multiFileSystem;

0 commit comments

Comments
 (0)