Skip to content

Commit 5c6a431

Browse files
committed
Add proper multi file system
1 parent 1e465da commit 5c6a431

File tree

3 files changed

+80
-39
lines changed

3 files changed

+80
-39
lines changed

src/file/MultiFileSystem.cpp

Lines changed: 66 additions & 29 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, now at %d", fileSystem, m_fileSystems.size());
16+
#endif
17+
}
18+
19+
void MultiFileSystem::Remove(cdc::FileSystem* fileSystem)
20+
{
21+
auto it = std::find(m_fileSystems.begin(), m_fileSystems.end(), fileSystem);
22+
23+
if (it != m_fileSystems.end())
1424
{
15-
return m_pHookFS;
25+
m_fileSystems.erase(it);
1626
}
17-
18-
return m_pFS;
1927
}
2028

21-
cdc::FileRequest* MultiFileSystem::RequestRead(cdc::FileReceiver* receiver, const char* fileName, unsigned int startOffset)
29+
cdc::FileSystem* MultiFileSystem::GetBestFileSystem(const char* fileName) const noexcept
2230
{
23-
auto pFS = GetBestFileSystem(fileName);
31+
for (auto fileSystem : m_fileSystems)
32+
{
33+
if (fileSystem->FileExists(fileName))
34+
{
35+
return fileSystem;
36+
}
37+
}
2438

25-
return pFS->RequestRead(receiver, fileName, startOffset);
39+
return nullptr;
2640
}
2741

28-
cdc::File* MultiFileSystem::OpenFile(char const* fileName)
42+
cdc::FileRequest* MultiFileSystem::RequestRead(cdc::FileReceiver* receiver, const char* fileName, unsigned int startOffset)
2943
{
30-
auto pFS = GetBestFileSystem(fileName);
44+
return GetBestFileSystem(fileName)->RequestRead(receiver, fileName, startOffset);
45+
}
3146

32-
return pFS->OpenFile(fileName);
47+
cdc::File* MultiFileSystem::OpenFile(const char* fileName)
48+
{
49+
return GetBestFileSystem(fileName)->OpenFile(fileName);
3350
}
3451

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

40-
unsigned int MultiFileSystem::GetFileSize(char const* fileName)
57+
bool MultiFileSystem::FileExists(const char* 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 & 9 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);

src/modules/ModLoader.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ 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+
// Add the hook and original file system
49+
multiFileSystem->Add(fileSystem);
50+
multiFileSystem->Add(GetFS());
4751

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

0 commit comments

Comments
 (0)