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
2136cdc::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
2843cdc::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
4770void 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
5378unsigned 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-
6083cdc::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
6596void MultiFileSystem::Update ()
6697{
67- m_pFS->Update ();
98+ for (auto fileSystem : m_fileSystems)
99+ {
100+ fileSystem->Update ();
101+ }
68102}
69103
70104void MultiFileSystem::Synchronize ()
71105{
72- m_pFS->Synchronize ();
106+ for (auto fileSystem : m_fileSystems)
107+ {
108+ fileSystem->Synchronize ();
109+ }
73110}
0 commit comments