file_sys/romfs_factory: Eliminate usage of the global system accessor
This commit is contained in:
		
							parent
							
								
									0e80567bef
								
							
						
					
					
						commit
						a62c1999c5
					
				@ -6,7 +6,6 @@
 | 
				
			|||||||
#include "common/assert.h"
 | 
					#include "common/assert.h"
 | 
				
			||||||
#include "common/common_types.h"
 | 
					#include "common/common_types.h"
 | 
				
			||||||
#include "common/logging/log.h"
 | 
					#include "common/logging/log.h"
 | 
				
			||||||
#include "core/core.h"
 | 
					 | 
				
			||||||
#include "core/file_sys/card_image.h"
 | 
					#include "core/file_sys/card_image.h"
 | 
				
			||||||
#include "core/file_sys/content_archive.h"
 | 
					#include "core/file_sys/content_archive.h"
 | 
				
			||||||
#include "core/file_sys/nca_metadata.h"
 | 
					#include "core/file_sys/nca_metadata.h"
 | 
				
			||||||
@ -19,7 +18,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace FileSys {
 | 
					namespace FileSys {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RomFSFactory::RomFSFactory(Loader::AppLoader& app_loader) {
 | 
					RomFSFactory::RomFSFactory(Loader::AppLoader& app_loader, ContentProvider& provider,
 | 
				
			||||||
 | 
					                           Service::FileSystem::FileSystemController& controller)
 | 
				
			||||||
 | 
					    : content_provider{provider}, filesystem_controller{controller} {
 | 
				
			||||||
    // Load the RomFS from the app
 | 
					    // Load the RomFS from the app
 | 
				
			||||||
    if (app_loader.ReadRomFS(file) != Loader::ResultStatus::Success) {
 | 
					    if (app_loader.ReadRomFS(file) != Loader::ResultStatus::Success) {
 | 
				
			||||||
        LOG_ERROR(Service_FS, "Unable to read RomFS!");
 | 
					        LOG_ERROR(Service_FS, "Unable to read RomFS!");
 | 
				
			||||||
@ -46,39 +47,38 @@ ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess(u64 current_process_titl
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage,
 | 
					ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage,
 | 
				
			||||||
                                          ContentRecordType type) const {
 | 
					                                          ContentRecordType type) const {
 | 
				
			||||||
    std::shared_ptr<NCA> res;
 | 
					    const std::shared_ptr<NCA> res = GetEntry(title_id, storage, type);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (storage) {
 | 
					 | 
				
			||||||
    case StorageId::None:
 | 
					 | 
				
			||||||
        res = Core::System::GetInstance().GetContentProvider().GetEntry(title_id, type);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case StorageId::NandSystem:
 | 
					 | 
				
			||||||
        res =
 | 
					 | 
				
			||||||
            Core::System::GetInstance().GetFileSystemController().GetSystemNANDContents()->GetEntry(
 | 
					 | 
				
			||||||
                title_id, type);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case StorageId::NandUser:
 | 
					 | 
				
			||||||
        res = Core::System::GetInstance().GetFileSystemController().GetUserNANDContents()->GetEntry(
 | 
					 | 
				
			||||||
            title_id, type);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case StorageId::SdCard:
 | 
					 | 
				
			||||||
        res = Core::System::GetInstance().GetFileSystemController().GetSDMCContents()->GetEntry(
 | 
					 | 
				
			||||||
            title_id, type);
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
        UNIMPLEMENTED_MSG("Unimplemented storage_id={:02X}", static_cast<u8>(storage));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (res == nullptr) {
 | 
					    if (res == nullptr) {
 | 
				
			||||||
        // TODO(DarkLordZach): Find the right error code to use here
 | 
					        // TODO(DarkLordZach): Find the right error code to use here
 | 
				
			||||||
        return RESULT_UNKNOWN;
 | 
					        return RESULT_UNKNOWN;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const auto romfs = res->GetRomFS();
 | 
					    const auto romfs = res->GetRomFS();
 | 
				
			||||||
    if (romfs == nullptr) {
 | 
					    if (romfs == nullptr) {
 | 
				
			||||||
        // TODO(DarkLordZach): Find the right error code to use here
 | 
					        // TODO(DarkLordZach): Find the right error code to use here
 | 
				
			||||||
        return RESULT_UNKNOWN;
 | 
					        return RESULT_UNKNOWN;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return MakeResult<VirtualFile>(romfs);
 | 
					    return MakeResult<VirtualFile>(romfs);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::shared_ptr<NCA> RomFSFactory::GetEntry(u64 title_id, StorageId storage,
 | 
				
			||||||
 | 
					                                            ContentRecordType type) const {
 | 
				
			||||||
 | 
					    switch (storage) {
 | 
				
			||||||
 | 
					    case StorageId::None:
 | 
				
			||||||
 | 
					        return content_provider.GetEntry(title_id, type);
 | 
				
			||||||
 | 
					    case StorageId::NandSystem:
 | 
				
			||||||
 | 
					        return filesystem_controller.GetSystemNANDContents()->GetEntry(title_id, type);
 | 
				
			||||||
 | 
					    case StorageId::NandUser:
 | 
				
			||||||
 | 
					        return filesystem_controller.GetUserNANDContents()->GetEntry(title_id, type);
 | 
				
			||||||
 | 
					    case StorageId::SdCard:
 | 
				
			||||||
 | 
					        return filesystem_controller.GetSDMCContents()->GetEntry(title_id, type);
 | 
				
			||||||
 | 
					    case StorageId::Host:
 | 
				
			||||||
 | 
					    case StorageId::GameCard:
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					        UNIMPLEMENTED_MSG("Unimplemented storage_id={:02X}", static_cast<u8>(storage));
 | 
				
			||||||
 | 
					        return nullptr;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace FileSys
 | 
					} // namespace FileSys
 | 
				
			||||||
 | 
				
			|||||||
@ -13,8 +13,15 @@ namespace Loader {
 | 
				
			|||||||
class AppLoader;
 | 
					class AppLoader;
 | 
				
			||||||
} // namespace Loader
 | 
					} // namespace Loader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Service::FileSystem {
 | 
				
			||||||
 | 
					class FileSystemController;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace FileSys {
 | 
					namespace FileSys {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ContentProvider;
 | 
				
			||||||
 | 
					class NCA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class ContentRecordType : u8;
 | 
					enum class ContentRecordType : u8;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class StorageId : u8 {
 | 
					enum class StorageId : u8 {
 | 
				
			||||||
@ -29,18 +36,26 @@ enum class StorageId : u8 {
 | 
				
			|||||||
/// File system interface to the RomFS archive
 | 
					/// File system interface to the RomFS archive
 | 
				
			||||||
class RomFSFactory {
 | 
					class RomFSFactory {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    explicit RomFSFactory(Loader::AppLoader& app_loader);
 | 
					    explicit RomFSFactory(Loader::AppLoader& app_loader, ContentProvider& provider,
 | 
				
			||||||
 | 
					                          Service::FileSystem::FileSystemController& controller);
 | 
				
			||||||
    ~RomFSFactory();
 | 
					    ~RomFSFactory();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void SetPackedUpdate(VirtualFile update_raw);
 | 
					    void SetPackedUpdate(VirtualFile update_raw);
 | 
				
			||||||
    ResultVal<VirtualFile> OpenCurrentProcess(u64 current_process_title_id) const;
 | 
					    [[nodiscard]] ResultVal<VirtualFile> OpenCurrentProcess(u64 current_process_title_id) const;
 | 
				
			||||||
    ResultVal<VirtualFile> Open(u64 title_id, StorageId storage, ContentRecordType type) const;
 | 
					    [[nodiscard]] ResultVal<VirtualFile> Open(u64 title_id, StorageId storage,
 | 
				
			||||||
 | 
					                                              ContentRecordType type) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
 | 
					    [[nodiscard]] std::shared_ptr<NCA> GetEntry(u64 title_id, StorageId storage,
 | 
				
			||||||
 | 
					                                                ContentRecordType type) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    VirtualFile file;
 | 
					    VirtualFile file;
 | 
				
			||||||
    VirtualFile update_raw;
 | 
					    VirtualFile update_raw;
 | 
				
			||||||
    bool updatable;
 | 
					    bool updatable;
 | 
				
			||||||
    u64 ivfc_offset;
 | 
					    u64 ivfc_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ContentProvider& content_provider;
 | 
				
			||||||
 | 
					    Service::FileSystem::FileSystemController& filesystem_controller;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace FileSys
 | 
					} // namespace FileSys
 | 
				
			||||||
 | 
				
			|||||||
@ -192,8 +192,8 @@ AppLoader_DeconstructedRomDirectory::LoadResult AppLoader_DeconstructedRomDirect
 | 
				
			|||||||
    // Register the RomFS if a ".romfs" file was found
 | 
					    // Register the RomFS if a ".romfs" file was found
 | 
				
			||||||
    if (romfs_iter != files.end() && *romfs_iter != nullptr) {
 | 
					    if (romfs_iter != files.end() && *romfs_iter != nullptr) {
 | 
				
			||||||
        romfs = *romfs_iter;
 | 
					        romfs = *romfs_iter;
 | 
				
			||||||
        system.GetFileSystemController().RegisterRomFS(
 | 
					        system.GetFileSystemController().RegisterRomFS(std::make_unique<FileSys::RomFSFactory>(
 | 
				
			||||||
            std::make_unique<FileSys::RomFSFactory>(*this));
 | 
					            *this, system.GetContentProvider(), system.GetFileSystemController()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    is_loaded = true;
 | 
					    is_loaded = true;
 | 
				
			||||||
 | 
				
			|||||||
@ -58,8 +58,8 @@ AppLoader_NCA::LoadResult AppLoader_NCA::Load(Kernel::Process& process, Core::Sy
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (nca->GetRomFS() != nullptr && nca->GetRomFS()->GetSize() > 0) {
 | 
					    if (nca->GetRomFS() != nullptr && nca->GetRomFS()->GetSize() > 0) {
 | 
				
			||||||
        system.GetFileSystemController().RegisterRomFS(
 | 
					        system.GetFileSystemController().RegisterRomFS(std::make_unique<FileSys::RomFSFactory>(
 | 
				
			||||||
            std::make_unique<FileSys::RomFSFactory>(*this));
 | 
					            *this, system.GetContentProvider(), system.GetFileSystemController()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    is_loaded = true;
 | 
					    is_loaded = true;
 | 
				
			||||||
 | 
				
			|||||||
@ -218,8 +218,8 @@ AppLoader_NRO::LoadResult AppLoader_NRO::Load(Kernel::Process& process, Core::Sy
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (romfs != nullptr) {
 | 
					    if (romfs != nullptr) {
 | 
				
			||||||
        system.GetFileSystemController().RegisterRomFS(
 | 
					        system.GetFileSystemController().RegisterRomFS(std::make_unique<FileSys::RomFSFactory>(
 | 
				
			||||||
            std::make_unique<FileSys::RomFSFactory>(*this));
 | 
					            *this, system.GetContentProvider(), system.GetFileSystemController()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    is_loaded = true;
 | 
					    is_loaded = true;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user