diff options
| -rw-r--r-- | src/core/file_sys/patch_manager.cpp | 15 | ||||
| -rw-r--r-- | src/core/file_sys/patch_manager.h | 3 | ||||
| -rw-r--r-- | src/core/file_sys/romfs_factory.cpp | 4 | ||||
| -rw-r--r-- | src/core/file_sys/romfs_factory.h | 1 | 
4 files changed, 18 insertions, 5 deletions
diff --git a/src/core/file_sys/patch_manager.cpp b/src/core/file_sys/patch_manager.cpp index 539698f6e..b43880e92 100644 --- a/src/core/file_sys/patch_manager.cpp +++ b/src/core/file_sys/patch_manager.cpp @@ -184,8 +184,8 @@ static void ApplyLayeredFS(VirtualFile& romfs, u64 title_id, ContentRecordType t      romfs = std::move(packed);  } -VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, -                                     ContentRecordType type) const { +VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset, ContentRecordType type, +                                     VirtualFile update_raw) const {      LOG_INFO(Loader, "Patching RomFS for title_id={:016X}, type={:02X}", title_id,               static_cast<u8>(type)); @@ -205,6 +205,13 @@ VirtualFile PatchManager::PatchRomFS(VirtualFile romfs, u64 ivfc_offset,                       FormatTitleVersion(installed->GetEntryVersion(update_tid).get_value_or(0)));              romfs = new_nca->GetRomFS();          } +    } else if (update_raw != nullptr) { +        const auto new_nca = std::make_shared<NCA>(update, romfs, ivfc_offset); +        if (new_nca->GetStatus() == Loader::ResultStatus::Success && +            new_nca->GetRomFS() != nullptr) { +            LOG_INFO(Loader, "    RomFS: Update (XCI) applied successfully"); +            romfs = new_nca->GetRomFS(); +        }      }      // LayeredFS @@ -224,7 +231,7 @@ static bool IsDirValidAndNonEmpty(const VirtualDir& dir) {      return dir != nullptr && (!dir->GetFiles().empty() || !dir->GetSubdirectories().empty());  } -std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNames() const { +std::map<PatchType, std::string> PatchManager::GetPatchVersionNames(VirtualFile update_raw) const {      std::map<std::string, std::string, std::less<>> out;      const auto installed = Service::FileSystem::GetUnionContents(); @@ -245,6 +252,8 @@ std::map<std::string, std::string, std::less<>> PatchManager::GetPatchVersionNam                      "Update",                      FormatTitleVersion(meta_ver.get(), TitleVersionFormat::ThreeElements));              } +        } else if (update_raw != nullptr) { +            out[PatchType::Update] = "XCI";          }      } diff --git a/src/core/file_sys/patch_manager.h b/src/core/file_sys/patch_manager.h index 6a864ec43..e87ce54e5 100644 --- a/src/core/file_sys/patch_manager.h +++ b/src/core/file_sys/patch_manager.h @@ -46,7 +46,8 @@ public:      // - Game Updates      // - LayeredFS      VirtualFile PatchRomFS(VirtualFile base, u64 ivfc_offset, -                           ContentRecordType type = ContentRecordType::Program) const; +                           ContentRecordType type = ContentRecordType::Program, +                           VirtualFile update_raw = nullptr) const;      // Returns a vector of pairs between patch names and patch versions.      // i.e. Update 3.2.2 will return {"Update", "3.2.2"} diff --git a/src/core/file_sys/romfs_factory.cpp b/src/core/file_sys/romfs_factory.cpp index 4994c2532..a0ee16895 100644 --- a/src/core/file_sys/romfs_factory.cpp +++ b/src/core/file_sys/romfs_factory.cpp @@ -24,6 +24,7 @@ RomFSFactory::RomFSFactory(Loader::AppLoader& app_loader) {          LOG_ERROR(Service_FS, "Unable to read RomFS!");      } +    app_loader.ReadUpdateRaw(update_raw);      updatable = app_loader.IsRomFSUpdatable();      ivfc_offset = app_loader.ReadRomFSIVFCOffset();  } @@ -35,7 +36,8 @@ ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess() {          return MakeResult<VirtualFile>(file);      const PatchManager patch_manager(Core::CurrentProcess()->GetTitleID()); -    return MakeResult<VirtualFile>(patch_manager.PatchRomFS(file, ivfc_offset)); +    return MakeResult<VirtualFile>( +        patch_manager.PatchRomFS(file, ivfc_offset, ContentRecordType::Program, update_raw));  }  ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, ContentRecordType type) { diff --git a/src/core/file_sys/romfs_factory.h b/src/core/file_sys/romfs_factory.h index 2cace8180..1cd4cedf1 100644 --- a/src/core/file_sys/romfs_factory.h +++ b/src/core/file_sys/romfs_factory.h @@ -37,6 +37,7 @@ public:  private:      VirtualFile file; +    VirtualFile update_raw;      bool updatable;      u64 ivfc_offset;  };  | 
