@@ -18,7 +18,9 @@ struct Systemloader::Impl {
1818 m_loader(loader),
1919 m_system(system),
2020 m_fsController(loader),
21- m_TitleID(0 )
21+ m_provider(std::make_unique<FileSys::ManualContentProvider>()),
22+ m_processID(0 ),
23+ m_titleID(0 )
2224 {
2325 }
2426
@@ -31,8 +33,10 @@ struct Systemloader::Impl {
3133 // / ContentProviderUnion instance
3234 std::unique_ptr<FileSys::ContentProviderUnion> m_contentProvider;
3335 FileSys::FileSystemController m_fsController;
36+ std::unique_ptr<FileSys::ManualContentProvider> m_provider;
3437 std::unique_ptr<Nro> m_nro;
35- uint64_t m_TitleID;
38+ uint64_t m_processID;
39+ uint64_t m_titleID;
3640};
3741
3842Systemloader::Systemloader (ISwitchSystem & system) :
@@ -52,6 +56,7 @@ bool Systemloader::Initialize(void)
5256 if (impl->m_contentProvider == nullptr ) {
5357 impl->m_contentProvider = std::make_unique<FileSys::ContentProviderUnion>();
5458 }
59+ impl->m_contentProvider ->SetSlot (FileSys::ContentProviderUnionSlot::FrontendManual, impl->m_provider .get ());
5560 GetFileSystemController ().CreateFactories (*GetFilesystem (), false );
5661 return true ;
5762}
@@ -94,6 +99,10 @@ ISwitchSystem & Systemloader::GetSystem() {
9499 return impl->m_system ;
95100}
96101
102+ FileSys::ContentProvider & Systemloader::GetContentProvider () {
103+ return *impl->m_contentProvider ;
104+ }
105+
97106FileSys::VirtualFilesystem Systemloader::GetFilesystem () {
98107 return impl->m_virtualFilesystem ;
99108}
@@ -107,6 +116,16 @@ void Systemloader::RegisterContentProvider(FileSys::ContentProviderUnionSlot slo
107116 impl->m_contentProvider ->SetSlot (slot, provider);
108117}
109118
119+ void Systemloader::SetProcessID (uint64_t processID)
120+ {
121+ impl->m_processID = processID;
122+ }
123+
124+ void Systemloader::SetTitleID (uint64_t titleID)
125+ {
126+ impl->m_titleID = titleID;
127+ }
128+
110129bool Systemloader::Impl::LoadNRO (const char * nroFile)
111130{
112131 Path filePath (nroFile);
@@ -135,8 +154,8 @@ bool Systemloader::Impl::LoadNRO(const char* nroFile)
135154 return false ;
136155 }
137156
138- m_TitleID = Nacp->GetTitleId ();
139- m_fsController.RegisterProcess (processID, m_TitleID , std::make_unique<FileSys::RomFSFactory>(nullptr , false , *m_contentProvider, m_fsController));
157+ m_titleID = Nacp->GetTitleId ();
158+ m_fsController.RegisterProcess (processID, m_titleID , std::make_unique<FileSys::RomFSFactory>(nullptr , false , *m_contentProvider, m_fsController));
140159 g_settings->SetString (NXCoreSetting::GameName, Nacp->GetApplicationName ().c_str ());
141160 operatingSystem.StartApplicationProcess (metaData.GetMainThreadPriority (), metaData.GetMainThreadStackSize (), 0 , StorageId::None, StorageId::None, nullptr , 0 );
142161 return true ;
@@ -159,6 +178,28 @@ uint32_t Systemloader::GetContentProviderEntriesCount(bool useTitleType, LoaderT
159178 std::optional<LoaderTitleType> title = useTitleType ? std::optional<LoaderTitleType>((LoaderTitleType)titleType) : std::nullopt ;
160179 std::optional<LoaderContentRecordType> record = useContentRecordType ? std::optional<LoaderContentRecordType>((LoaderContentRecordType)contentRecordType) : std::nullopt ;
161180 std::optional<u64 > id = useTitleId ? std::optional<u64 >(titleId) : std::nullopt ;
162- const std::vector<FileSys:: ContentProviderEntry> list = rcu.ListEntriesFilter (title, record, id);
181+ const std::vector<ContentProviderEntry> list = rcu.ListEntriesFilter (title, record, id);
163182 return (uint32_t )list.size ();
164183}
184+
185+ uint32_t Systemloader::GetContentProviderEntries (bool useTitleType, LoaderTitleType titleType, bool useContentRecordType, LoaderContentRecordType contentRecordType, bool useTitleId, unsigned long long titleId, ContentProviderEntry * entries, uint32_t entryCount)
186+ {
187+ if (entries == nullptr || entryCount == 0 )
188+ {
189+ return 0 ;
190+ }
191+ const FileSys::ContentProviderUnion& rcu = *impl->m_contentProvider ;
192+ std::optional<LoaderTitleType> title = useTitleType ? std::optional<LoaderTitleType>((LoaderTitleType)titleType) : std::nullopt ;
193+ std::optional<LoaderContentRecordType> record = useContentRecordType ? std::optional<LoaderContentRecordType>((LoaderContentRecordType)contentRecordType) : std::nullopt ;
194+ std::optional<u64 > id = useTitleId ? std::optional<u64 >(titleId) : std::nullopt ;
195+ const std::vector<ContentProviderEntry> list = rcu.ListEntriesFilter (title, record, id);
196+ entryCount = std::min ((uint32_t )list.size (), entryCount);
197+ memcpy (entries, list.data (), entryCount * sizeof (ContentProviderEntry));
198+ return entryCount;
199+ }
200+
201+ IFileSysNCA * Systemloader::GetContentProviderEntry (uint64_t title_id, LoaderContentRecordType type)
202+ {
203+ UNIMPLEMENTED ();
204+ return nullptr ;
205+ }
0 commit comments