Browse Source

core: Simplify SDMC mod loading

If someone else wants to support other mod formats in the SDMC
directory, that can be added later. For now, just allow RomFS modding
here and force people to do other types of mods the old way.

Addresses review comments.

Co-authored-by: LC <mathew1800@gmail.com>
nce_cpp
lat9nq 5 years ago
committed by Morph
parent
commit
bc4dc2135e
  1. 21
      src/core/file_sys/patch_manager.cpp
  2. 3
      src/core/file_sys/sdmc_factory.cpp
  3. 3
      src/core/hle/service/filesystem/filesystem.cpp

21
src/core/file_sys/patch_manager.cpp

@ -529,26 +529,13 @@ PatchManager::PatchVersionNames PatchManager::GetPatchVersionNames(VirtualFile u
} }
} }
// SDMC mod directory (LayeredFS)
// SDMC mod directory (RomFS LayeredFS)
const auto sdmc_mod_dir = fs_controller.GetSDMCModificationLoadRoot(title_id); const auto sdmc_mod_dir = fs_controller.GetSDMCModificationLoadRoot(title_id);
if (sdmc_mod_dir != nullptr && sdmc_mod_dir->GetSize() > 0) {
std::string types;
const auto exefs_dir = FindSubdirectoryCaseless(sdmc_mod_dir, "exefs");
if (IsDirValidAndNonEmpty(exefs_dir)) {
bool layeredfs = false;
if (layeredfs)
AppendCommaIfNotEmpty(types, "LayeredExeFS");
}
if (IsDirValidAndNonEmpty(FindSubdirectoryCaseless(sdmc_mod_dir, "romfs")))
AppendCommaIfNotEmpty(types, "LayeredFS");
if (!types.empty()) {
if (sdmc_mod_dir != nullptr && sdmc_mod_dir->GetSize() > 0 &&
IsDirValidAndNonEmpty(FindSubdirectoryCaseless(sdmc_mod_dir, "romfs"))) {
const auto mod_disabled = const auto mod_disabled =
std::find(disabled.begin(), disabled.end(), "SDMC") != disabled.end(); std::find(disabled.begin(), disabled.end(), "SDMC") != disabled.end();
out.insert_or_assign(mod_disabled ? "[D] SDMC" : "SDMC", types);
}
out.insert_or_assign(mod_disabled ? "[D] SDMC" : "SDMC", "LayeredFS");
} }
// DLC // DLC

3
src/core/file_sys/sdmc_factory.cpp

@ -29,8 +29,9 @@ ResultVal<VirtualDir> SDMCFactory::Open() const {
VirtualDir SDMCFactory::GetSDMCModificationLoadRoot(u64 title_id) const { VirtualDir SDMCFactory::GetSDMCModificationLoadRoot(u64 title_id) const {
// LayeredFS doesn't work on updates and title id-less homebrew // LayeredFS doesn't work on updates and title id-less homebrew
if (title_id == 0 || (title_id & 0xFFF) == 0x800)
if (title_id == 0 || (title_id & 0xFFF) == 0x800) {
return nullptr; return nullptr;
}
return GetOrCreateDirectoryRelative(dir, fmt::format("/atmosphere/contents/{:016X}", title_id)); return GetOrCreateDirectoryRelative(dir, fmt::format("/atmosphere/contents/{:016X}", title_id));
} }

3
src/core/hle/service/filesystem/filesystem.cpp

@ -706,8 +706,9 @@ FileSys::VirtualDir FileSystemController::GetModificationLoadRoot(u64 title_id)
FileSys::VirtualDir FileSystemController::GetSDMCModificationLoadRoot(u64 title_id) const { FileSys::VirtualDir FileSystemController::GetSDMCModificationLoadRoot(u64 title_id) const {
LOG_TRACE(Service_FS, "Opening SDMC mod load root for tid={:016X}", title_id); LOG_TRACE(Service_FS, "Opening SDMC mod load root for tid={:016X}", title_id);
if (sdmc_factory == nullptr)
if (sdmc_factory == nullptr) {
return nullptr; return nullptr;
}
return sdmc_factory->GetSDMCModificationLoadRoot(title_id); return sdmc_factory->GetSDMCModificationLoadRoot(title_id);
} }

Loading…
Cancel
Save