// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include #include #include "common/common_types.h" #include "core/file_sys/nca_metadata.h" #include "core/file_sys/vfs/vfs.h" namespace Core::Crypto { class KeyManager; } namespace Loader { enum class ResultStatus : u16; } namespace FileSys { class NCA; class PartitionFilesystem; enum class ContentRecordType : u8; class NSP : public ReadOnlyVfsDirectory { public: explicit NSP(VirtualFile file_, u64 title_id = 0, std::size_t program_index_ = 0); ~NSP() override; Loader::ResultStatus GetStatus() const; Loader::ResultStatus GetProgramStatus() const; // Should only be used when one title id can be assured. u64 GetProgramTitleID() const; u64 GetExtractedTitleID() const; std::vector GetProgramTitleIDs() const; bool IsExtractedType() const; // Common (Can be safely called on both types) VirtualFile GetRomFS() const; VirtualDir GetExeFS() const; // Type 0 Only (Collection of NCAs + Certificate + Ticket + Meta XML) std::vector> GetNCAsCollapsed() const; std::multimap> GetNCAsByTitleID() const; std::map, std::shared_ptr>> GetNCAs() const; std::shared_ptr GetNCA(u64 title_id, ContentRecordType type, TitleType title_type = TitleType::Application) const; VirtualFile GetNCAFile(u64 title_id, ContentRecordType type, TitleType title_type = TitleType::Application) const; std::vector GetFiles() const override; std::vector GetSubdirectories() const override; std::string GetName() const override; VirtualDir GetParentDirectory() const override; private: void SetTicketKeys(const std::vector& files); void InitializeExeFSAndRomFS(const std::vector& files); void ReadNCAs(const std::vector& files); VirtualFile file; const u64 expected_program_id; const std::size_t program_index; bool extracted = false; Loader::ResultStatus status; std::map program_status; std::shared_ptr pfs; // Map title id -> {map type -> NCA} std::map, std::shared_ptr>> ncas; std::set program_ids; std::vector ticket_files; Core::Crypto::KeyManager& keys; VirtualFile romfs; VirtualDir exefs; }; } // namespace FileSys