diff options
| author | Zach Hilman <zachhilman@gmail.com> | 2018-10-14 18:58:07 -0400 | 
|---|---|---|
| committer | Zach Hilman <zachhilman@gmail.com> | 2018-10-14 18:58:14 -0400 | 
| commit | 573744137486f187e1e8e3d59771e41378d3f895 (patch) | |
| tree | 88426791d74df82bd1a22a7f8859e280e5510376 | |
| parent | 7e2096db8a1db9f573c8aac63072309d9be0c856 (diff) | |
aoc: Read DLC base title ID from RegisteredCache
Falls back to title ID + 0x1000, which is what HOS does.
| -rw-r--r-- | src/core/file_sys/control_metadata.cpp | 4 | ||||
| -rw-r--r-- | src/core/file_sys/control_metadata.h | 1 | ||||
| -rw-r--r-- | src/core/hle/service/aoc/aoc_u.cpp | 15 | 
3 files changed, 18 insertions, 2 deletions
| diff --git a/src/core/file_sys/control_metadata.cpp b/src/core/file_sys/control_metadata.cpp index 5b1177a03..6bb588080 100644 --- a/src/core/file_sys/control_metadata.cpp +++ b/src/core/file_sys/control_metadata.cpp @@ -56,6 +56,10 @@ u64 NACP::GetTitleId() const {      return raw->title_id;  } +u64 NACP::GetDLCBaseTitleId() const { +    return raw->dlc_base_title_id; +} +  std::string NACP::GetVersionString() const {      return Common::StringFromFixedZeroTerminatedBuffer(raw->version_string.data(), 0x10);  } diff --git a/src/core/file_sys/control_metadata.h b/src/core/file_sys/control_metadata.h index 43d6f0719..141f7e056 100644 --- a/src/core/file_sys/control_metadata.h +++ b/src/core/file_sys/control_metadata.h @@ -79,6 +79,7 @@ public:      std::string GetApplicationName(Language language = Language::Default) const;      std::string GetDeveloperName(Language language = Language::Default) const;      u64 GetTitleId() const; +    u64 GetDLCBaseTitleId() const;      std::string GetVersionString() const;  private: diff --git a/src/core/hle/service/aoc/aoc_u.cpp b/src/core/hle/service/aoc/aoc_u.cpp index 77c01e595..518161bf7 100644 --- a/src/core/hle/service/aoc/aoc_u.cpp +++ b/src/core/hle/service/aoc/aoc_u.cpp @@ -7,8 +7,10 @@  #include <vector>  #include "common/logging/log.h"  #include "core/file_sys/content_archive.h" +#include "core/file_sys/control_metadata.h"  #include "core/file_sys/nca_metadata.h"  #include "core/file_sys/partition_filesystem.h" +#include "core/file_sys/patch_manager.h"  #include "core/file_sys/registered_cache.h"  #include "core/hle/ipc_helpers.h"  #include "core/hle/kernel/process.h" @@ -19,7 +21,7 @@  namespace Service::AOC {  constexpr u64 DLC_BASE_TITLE_ID_MASK = 0xFFFFFFFFFFFFE000; -constexpr u64 DLC_BASE_TO_AOC_ID_MASK = 0x1000; +constexpr u64 DLC_BASE_TO_AOC_ID = 0x1000;  static bool CheckAOCTitleIDMatchesBase(u64 base, u64 aoc) {      return (aoc & DLC_BASE_TITLE_ID_MASK) == base; @@ -105,7 +107,16 @@ void AOC_U::ListAddOnContent(Kernel::HLERequestContext& ctx) {  void AOC_U::GetAddOnContentBaseId(Kernel::HLERequestContext& ctx) {      IPC::ResponseBuilder rb{ctx, 4};      rb.Push(RESULT_SUCCESS); -    rb.Push(Core::System::GetInstance().CurrentProcess()->GetTitleID() | DLC_BASE_TO_AOC_ID_MASK); +    const auto title_id = Core::System::GetInstance().CurrentProcess()->GetTitleID(); +    FileSys::PatchManager pm{title_id}; + +    const auto res = pm.GetControlMetadata(); +    if (res.first == nullptr) { +        rb.Push(title_id + DLC_BASE_TO_AOC_ID); +        return; +    } + +    rb.Push(res.first->GetDLCBaseTitleId());  }  void AOC_U::PrepareAddOnContent(Kernel::HLERequestContext& ctx) { | 
