diff options
Diffstat (limited to 'src/android')
| -rw-r--r-- | src/android/app/src/main/jni/native.cpp | 44 | 
1 files changed, 44 insertions, 0 deletions
| diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index c23b2f19e..8b99d1d6e 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -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; | 
