11#include " MultiFileSystem.h"
22
3- #include " Hook.h"
4- #include " modules/Log.h"
5-
6- MultiFileSystem::MultiFileSystem () : m_fileSystems()
3+ MultiFileSystem::MultiFileSystem (cdc::FileSystem* pFS, cdc::FileSystem* pHookFS)
74{
5+ m_pFS = pFS;
6+ m_pHookFS = pHookFS;
87}
98
10- void MultiFileSystem::Add (cdc::FileSystem* fileSystem)
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)
1111{
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)
12+ // First check the hook file system, else fall back to default filesystem
13+ if (m_pHookFS->FileExists (fileName))
2614 {
27- if (fileSystem->FileExists (fileName))
28- {
29- return fileSystem;
30- }
15+ return m_pHookFS;
3116 }
3217
33- return nullptr ;
18+ return m_pFS ;
3419}
3520
3621cdc::FileRequest* MultiFileSystem::RequestRead (cdc::FileReceiver* receiver, const char * fileName, unsigned int startOffset)
3722{
38- auto fileSystem = GetBestFileSystem (fileName);
23+ auto pFS = GetBestFileSystem (fileName);
3924
40- return fileSystem ->RequestRead (receiver, fileName, startOffset);
25+ return pFS ->RequestRead (receiver, fileName, startOffset);
4126}
4227
4328cdc::File* MultiFileSystem::OpenFile (char const * fileName)
4429{
45- auto fileSystem = GetBestFileSystem (fileName);
30+ auto pFS = GetBestFileSystem (fileName);
4631
47- return fileSystem ->OpenFile (fileName);
32+ return pFS ->OpenFile (fileName);
4833}
4934
50- unsigned int MultiFileSystem::GetFileSize (char const * fileName)
35+ bool MultiFileSystem::FileExists (char const * fileName)
5136{
52- auto fileSystem = GetBestFileSystem (fileName);
53-
54- return fileSystem->GetFileSize (fileName);
37+ return m_pFS->FileExists (fileName) || m_pHookFS->FileExists (fileName);
5538}
5639
57- bool MultiFileSystem::FileExists (char const * fileName)
40+ unsigned int MultiFileSystem::GetFileSize (char const * fileName)
5841{
59- for (auto fileSystem : m_fileSystems)
60- {
61- if (fileSystem->FileExists (fileName))
62- {
63- return true ;
64- }
65- }
42+ auto pFS = GetBestFileSystem (fileName);
6643
67- return false ;
44+ return pFS-> GetFileSize (fileName) ;
6845}
6946
7047void MultiFileSystem::SetSpecialisationMask (unsigned int specMask)
7148{
72- for (auto fileSystem : m_fileSystems)
73- {
74- fileSystem->SetSpecialisationMask (specMask);
75- }
49+ m_pFS->SetSpecialisationMask (specMask);
50+ m_pHookFS->SetSpecialisationMask (specMask);
7651}
7752
7853unsigned int MultiFileSystem::GetSpecialisationMask ()
7954{
80- return m_fileSystems. empty () ? 0xFFFFFFFF : m_fileSystems[ 0 ] ->GetSpecialisationMask ();
55+ return m_pFS ->GetSpecialisationMask ();
8156}
8257
58+ // These only need to call the default file system, both will end at the same place
59+
8360cdc::FileSystem::Status MultiFileSystem::GetStatus ()
8461{
85- for (auto fileSystem : m_fileSystems)
86- {
87- if (fileSystem->GetStatus () == BUSY)
88- {
89- return BUSY;
90- }
91- }
92-
93- return IDLE;
62+ return m_pFS->GetStatus ();
9463}
9564
9665void MultiFileSystem::Update ()
9766{
98- for (auto fileSystem : m_fileSystems)
99- {
100- fileSystem->Update ();
101- }
67+ m_pFS->Update ();
10268}
10369
10470void MultiFileSystem::Synchronize ()
10571{
106- for (auto fileSystem : m_fileSystems)
107- {
108- fileSystem->Synchronize ();
109- }
72+ m_pFS->Synchronize ();
11073}
0 commit comments