patch_manager: Add LayeredFS mods support
This commit is contained in:
		
							parent
							
								
									44fdac334c
								
							
						
					
					
						commit
						16188acb50
					
				@ -11,6 +11,7 @@
 | 
			
		||||
#include "core/file_sys/patch_manager.h"
 | 
			
		||||
#include "core/file_sys/registered_cache.h"
 | 
			
		||||
#include "core/file_sys/romfs.h"
 | 
			
		||||
#include "core/file_sys/vfs_layered.h"
 | 
			
		||||
#include "core/hle/service/filesystem/filesystem.h"
 | 
			
		||||
#include "core/loader/loader.h"
 | 
			
		||||
 | 
			
		||||
@ -31,8 +32,9 @@ std::string FormatTitleVersion(u32 version, TitleVersionFormat format) {
 | 
			
		||||
    return fmt::format("v{}.{}.{}", bytes[3], bytes[2], bytes[1]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
constexpr std::array<const char*, 1> PATCH_TYPE_NAMES{
 | 
			
		||||
constexpr std::array<const char*, 2> PATCH_TYPE_NAMES{
 | 
			
		||||
    "Update",
 | 
			
		||||
    "LayeredFS",
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::string FormatPatchTypeName(PatchType type) {
 | 
			
		||||
@ -89,6 +91,41 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // LayeredFS
 | 
			
		||||
    const auto load_dir = Service::FileSystem::GetModificationLoadRoot(title_id);
 | 
			
		||||
    if (type == ContentRecordType::Program && load_dir != nullptr && load_dir->GetSize() > 0) {
 | 
			
		||||
        const auto extracted = ExtractRomFS(romfs);
 | 
			
		||||
 | 
			
		||||
        if (extracted != nullptr) {
 | 
			
		||||
            auto patch_dirs = load_dir->GetSubdirectories();
 | 
			
		||||
            std::sort(patch_dirs.begin(), patch_dirs.end(),
 | 
			
		||||
                      [](const VirtualDir& l, const VirtualDir& r) {
 | 
			
		||||
                          return l->GetName() < r->GetName();
 | 
			
		||||
                      });
 | 
			
		||||
 | 
			
		||||
            std::vector<VirtualDir> layers;
 | 
			
		||||
            layers.reserve(patch_dirs.size() + 1);
 | 
			
		||||
            for (const auto& subdir : patch_dirs) {
 | 
			
		||||
                const auto romfs_dir = subdir->GetSubdirectory("romfs");
 | 
			
		||||
                if (romfs_dir != nullptr)
 | 
			
		||||
                    layers.push_back(romfs_dir);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            layers.push_back(extracted);
 | 
			
		||||
 | 
			
		||||
            const auto layered = LayerDirectories(layers);
 | 
			
		||||
 | 
			
		||||
            if (layered != nullptr) {
 | 
			
		||||
                const auto packed = CreateRomFS(layered);
 | 
			
		||||
 | 
			
		||||
                if (packed != nullptr) {
 | 
			
		||||
                    LOG_INFO(Loader, "    RomFS: LayeredFS patches applied successfully");
 | 
			
		||||
                    romfs = packed;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return romfs;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -114,6 +151,10 @@ std::map<PatchType, std::string> PatchManager::GetPatchVersionNames() const {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const auto lfs_dir = Service::FileSystem::GetModificationLoadRoot(title_id);
 | 
			
		||||
    if (lfs_dir != nullptr && lfs_dir->GetSize() > 0)
 | 
			
		||||
        out[PatchType::LayeredFS] = "";
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@ std::string FormatTitleVersion(u32 version,
 | 
			
		||||
 | 
			
		||||
enum class PatchType {
 | 
			
		||||
    Update,
 | 
			
		||||
    LayeredFS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::string FormatPatchTypeName(PatchType type);
 | 
			
		||||
@ -42,6 +43,7 @@ public:
 | 
			
		||||
 | 
			
		||||
    // Currently tracked RomFS patches:
 | 
			
		||||
    // - Game Updates
 | 
			
		||||
    // - LayeredFS
 | 
			
		||||
    VirtualFile PatchRomFS(VirtualFile base, u64 ivfc_offset,
 | 
			
		||||
                           ContentRecordType type = ContentRecordType::Program) const;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user