mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-15 21:19:47 +00:00
a1b50e9339
This fixed the delete button enabled for external content (which is auto handled and the proper way to get rid of them is either by removing its folder from ext content list, or removing the file itself) by streaming patch source thru jni. Along the way stumbled upon another bug: If you have an external content update installed (say latest version for example) and you NAND install a previous update (like in silksong's hard mode update), the newest update version string would leak to the previous one. Did videos for both. Fixed both. Seems good to go. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3691 Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: Lizzie <lizzie@eden-emu.dev> Reviewed-by: DraVee <chimera@dravee.dev> Co-authored-by: xbzk <xbzk@eden-emu.dev> Co-committed-by: xbzk <xbzk@eden-emu.dev>
118 lines
3.6 KiB
C++
118 lines
3.6 KiB
C++
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include "common/common_types.h"
|
|
#include "core/file_sys/nca_metadata.h"
|
|
#include "core/file_sys/vfs/vfs_types.h"
|
|
#include "core/memory/dmnt_cheat_types.h"
|
|
|
|
namespace Core {
|
|
class System;
|
|
}
|
|
|
|
namespace Service::FileSystem {
|
|
class FileSystemController;
|
|
}
|
|
|
|
namespace FileSys {
|
|
|
|
class ContentProvider;
|
|
class NCA;
|
|
class NACP;
|
|
|
|
enum class PatchType { Update, DLC, Mod };
|
|
|
|
enum class PatchSource {
|
|
Unknown,
|
|
NAND,
|
|
SDMC,
|
|
External,
|
|
Packed,
|
|
};
|
|
|
|
struct Patch {
|
|
bool enabled;
|
|
std::string name;
|
|
std::string version;
|
|
PatchType type;
|
|
u64 program_id;
|
|
u64 title_id;
|
|
PatchSource source;
|
|
std::string location;
|
|
u32 numeric_version{0};
|
|
};
|
|
|
|
// A centralized class to manage patches to games.
|
|
class PatchManager {
|
|
public:
|
|
using BuildID = std::array<u8, 0x20>;
|
|
using Metadata = std::pair<std::unique_ptr<NACP>, VirtualFile>;
|
|
|
|
explicit PatchManager(u64 title_id_,
|
|
const Service::FileSystem::FileSystemController& fs_controller_,
|
|
const ContentProvider& content_provider_);
|
|
~PatchManager();
|
|
|
|
[[nodiscard]] u64 GetTitleID() const;
|
|
|
|
// Currently tracked ExeFS patches:
|
|
// - Game Updates
|
|
[[nodiscard]] VirtualDir PatchExeFS(VirtualDir exefs) const;
|
|
|
|
// Currently tracked NSO patches:
|
|
// - IPS
|
|
// - IPSwitch
|
|
[[nodiscard]] std::vector<u8> PatchNSO(const std::vector<u8>& nso,
|
|
const std::string& name) const;
|
|
|
|
// Checks to see if PatchNSO() will have any effect given the NSO's build ID.
|
|
// Used to prevent expensive copies in NSO loader.
|
|
[[nodiscard]] bool HasNSOPatch(const BuildID& build_id, std::string_view name) const;
|
|
|
|
// Creates a CheatList object with all
|
|
[[nodiscard]] std::vector<Core::Memory::CheatEntry> CreateCheatList(
|
|
const BuildID& build_id) const;
|
|
|
|
// Currently tracked RomFS patches:
|
|
// - Game Updates
|
|
// - LayeredFS
|
|
[[nodiscard]] VirtualFile PatchRomFS(const NCA* base_nca, VirtualFile base_romfs,
|
|
ContentRecordType type = ContentRecordType::Program,
|
|
VirtualFile packed_update_raw = nullptr,
|
|
bool apply_layeredfs = true) const;
|
|
|
|
// Returns a vector of patches
|
|
[[nodiscard]] std::vector<Patch> GetPatches(VirtualFile update_raw = nullptr) const;
|
|
|
|
// If the game update exists, returns the u32 version field in its Meta-type NCA. If that fails,
|
|
// it will fallback to the Meta-type NCA of the base game. If that fails, the result will be
|
|
// std::nullopt
|
|
[[nodiscard]] std::optional<u32> GetGameVersion() const;
|
|
|
|
// Given title_id of the program, attempts to get the control data of the update and parse
|
|
// it, falling back to the base control data.
|
|
[[nodiscard]] Metadata GetControlMetadata() const;
|
|
|
|
// Version of GetControlMetadata that takes an arbitrary NCA
|
|
[[nodiscard]] Metadata ParseControlNCA(const NCA& nca) const;
|
|
|
|
private:
|
|
[[nodiscard]] std::vector<VirtualFile> CollectPatches(const std::vector<VirtualDir>& patch_dirs,
|
|
const std::string& build_id) const;
|
|
|
|
u64 title_id;
|
|
const Service::FileSystem::FileSystemController& fs_controller;
|
|
const ContentProvider& content_provider;
|
|
};
|
|
|
|
} // namespace FileSys
|