Merge pull request #11357 from liamwhite/lime-vfs
android: jni: ensure NCAs from loaded filepath are registered in manual content provider
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user