forked from eden-emu/eden
		
	android: jni: ensure NCAs from loaded filepath are registered in manual content provider
This commit is contained in:
		
							parent
							
								
									bc4ad5e62d
								
							
						
					
					
						commit
						2c4ebeb51d
					
				
					 1 changed files with 44 additions and 0 deletions
				
			
		|  | @ -30,6 +30,7 @@ | |||
| #include "core/cpu_manager.h" | ||||
| #include "core/crypto/key_manager.h" | ||||
| #include "core/file_sys/card_image.h" | ||||
| #include "core/file_sys/content_archive.h" | ||||
| #include "core/file_sys/registered_cache.h" | ||||
| #include "core/file_sys/submission_package.h" | ||||
| #include "core/file_sys/vfs.h" | ||||
|  | @ -224,6 +225,42 @@ public: | |||
|         m_system.Renderer().NotifySurfaceChanged(); | ||||
|     } | ||||
| 
 | ||||
|     void ConfigureFilesystemProvider(const std::string& filepath) { | ||||
|         const auto file = m_system.GetFilesystem()->OpenFile(filepath, FileSys::Mode::Read); | ||||
|         if (!file) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         auto loader = Loader::GetLoader(m_system, file); | ||||
|         if (!loader) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const auto file_type = loader->GetFileType(); | ||||
|         if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         u64 program_id = 0; | ||||
|         const auto res2 = loader->ReadProgramId(program_id); | ||||
|         if (res2 == Loader::ResultStatus::Success && file_type == Loader::FileType::NCA) { | ||||
|             m_manual_provider->AddEntry(FileSys::TitleType::Application, | ||||
|                                         FileSys::GetCRTypeFromNCAType(FileSys::NCA{file}.GetType()), | ||||
|                                         program_id, file); | ||||
|         } else if (res2 == Loader::ResultStatus::Success && | ||||
|                    (file_type == Loader::FileType::XCI || file_type == Loader::FileType::NSP)) { | ||||
|             const auto nsp = file_type == Loader::FileType::NSP | ||||
|                                  ? std::make_shared<FileSys::NSP>(file) | ||||
|                                  : FileSys::XCI{file}.GetSecurePartitionNSP(); | ||||
|             for (const auto& title : nsp->GetNCAs()) { | ||||
|                 for (const auto& entry : title.second) { | ||||
|                     m_manual_provider->AddEntry(entry.first.first, entry.first.second, title.first, | ||||
|                                                 entry.second->GetBaseFile()); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     Core::SystemResultStatus InitializeEmulation(const std::string& filepath) { | ||||
|         std::scoped_lock lock(m_mutex); | ||||
| 
 | ||||
|  | @ -254,8 +291,14 @@ public: | |||
|             std::move(android_keyboard), // Software Keyboard
 | ||||
|             nullptr,                     // Web Browser
 | ||||
|         }); | ||||
| 
 | ||||
|         // Initialize filesystem.
 | ||||
|         m_manual_provider = std::make_unique<FileSys::ManualContentProvider>(); | ||||
|         m_system.SetContentProvider(std::make_unique<FileSys::ContentProviderUnion>()); | ||||
|         m_system.RegisterContentProvider(FileSys::ContentProviderUnionSlot::FrontendManual, | ||||
|                                          m_manual_provider.get()); | ||||
|         m_system.GetFileSystemController().CreateFactories(*m_vfs); | ||||
|         ConfigureFilesystemProvider(filepath); | ||||
| 
 | ||||
|         // Initialize account manager
 | ||||
|         m_profile_manager = std::make_unique<Service::Account::ProfileManager>(); | ||||
|  | @ -489,6 +532,7 @@ private: | |||
|     bool m_is_paused{}; | ||||
|     SoftwareKeyboard::AndroidKeyboard* m_software_keyboard{}; | ||||
|     std::unique_ptr<Service::Account::ProfileManager> m_profile_manager; | ||||
|     std::unique_ptr<FileSys::ManualContentProvider> m_manual_provider; | ||||
| 
 | ||||
|     // GPU driver parameters
 | ||||
|     std::shared_ptr<Common::DynamicLibrary> m_vulkan_library; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Liam
						Liam