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
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