diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/file_sys/control_metadata.cpp | 2 | ||||
| -rw-r--r-- | src/core/file_sys/control_metadata.h | 2 | ||||
| -rw-r--r-- | src/core/file_sys/savedata_factory.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 47 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.h | 2 | 
5 files changed, 50 insertions, 5 deletions
| diff --git a/src/core/file_sys/control_metadata.cpp b/src/core/file_sys/control_metadata.cpp index 9624df054..83c184750 100644 --- a/src/core/file_sys/control_metadata.cpp +++ b/src/core/file_sys/control_metadata.cpp @@ -36,7 +36,7 @@ std::string LanguageEntry::GetDeveloperName() const {                                                         developer_name.size());  } -NACP::NACP() : raw{} {} +NACP::NACP() = default;  NACP::NACP(VirtualFile file) {      file->ReadObject(&raw); diff --git a/src/core/file_sys/control_metadata.h b/src/core/file_sys/control_metadata.h index 9bc2720c9..7b9cdc910 100644 --- a/src/core/file_sys/control_metadata.h +++ b/src/core/file_sys/control_metadata.h @@ -100,7 +100,7 @@ public:      std::vector<u8> GetRawBytes() const;  private: -    RawNACP raw; +    RawNACP raw{};  };  } // namespace FileSys diff --git a/src/core/file_sys/savedata_factory.cpp b/src/core/file_sys/savedata_factory.cpp index 54f5b698a..1913dc956 100644 --- a/src/core/file_sys/savedata_factory.cpp +++ b/src/core/file_sys/savedata_factory.cpp @@ -13,7 +13,7 @@  namespace FileSys { -constexpr const char* SAVE_DATA_SIZE_FILENAME = ".yuzu_save_size"; +constexpr char SAVE_DATA_SIZE_FILENAME[] = ".yuzu_save_size";  std::string SaveDataDescriptor::DebugInfo() const {      return fmt::format("[type={:02X}, title_id={:016X}, user_id={:016X}{:016X}, save_id={:016X}]", diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 5fc02a521..d13ce4dca 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -8,6 +8,7 @@  #include <stack>  #include "audio_core/audio_renderer.h"  #include "core/core.h" +#include "core/file_sys/savedata_factory.h"  #include "core/hle/ipc_helpers.h"  #include "core/hle/kernel/kernel.h"  #include "core/hle/kernel/process.h" @@ -865,8 +866,8 @@ IApplicationFunctions::IApplicationFunctions() : ServiceFramework("IApplicationF          {22, &IApplicationFunctions::SetTerminateResult, "SetTerminateResult"},          {23, &IApplicationFunctions::GetDisplayVersion, "GetDisplayVersion"},          {24, nullptr, "GetLaunchStorageInfoForDebug"}, -        {25, nullptr, "ExtendSaveData"}, -        {26, nullptr, "GetSaveDataSize"}, +        {25, &IApplicationFunctions::ExtendSaveData, "ExtendSaveData"}, +        {26, &IApplicationFunctions::GetSaveDataSize, "GetSaveDataSize"},          {30, &IApplicationFunctions::BeginBlockingHomeButtonShortAndLongPressed, "BeginBlockingHomeButtonShortAndLongPressed"},          {31, &IApplicationFunctions::EndBlockingHomeButtonShortAndLongPressed, "EndBlockingHomeButtonShortAndLongPressed"},          {32, &IApplicationFunctions::BeginBlockingHomeButton, "BeginBlockingHomeButton"}, @@ -1043,6 +1044,48 @@ void IApplicationFunctions::GetPseudoDeviceId(Kernel::HLERequestContext& ctx) {      rb.Push<u64>(0);  } +void IApplicationFunctions::ExtendSaveData(Kernel::HLERequestContext& ctx) { +    IPC::RequestParser rp{ctx}; +    const auto type{rp.PopRaw<FileSys::SaveDataType>()}; +    rp.Skip(1, false); +    const auto user_id{rp.PopRaw<u128>()}; +    const auto new_normal_size{rp.PopRaw<u64>()}; +    const auto new_journal_size{rp.PopRaw<u64>()}; + +    LOG_DEBUG(Service_AM, +              "called with type={:02X}, user_id={:016X}{:016X}, new_normal={:016X}, " +              "new_journal={:016X}", +              static_cast<u8>(type), user_id[1], user_id[0], new_normal_size, new_journal_size); + +    FileSystem::WriteSaveDataSize(type, Core::CurrentProcess()->GetTitleID(), user_id, +                                  {new_normal_size, new_journal_size}); + +    IPC::ResponseBuilder rb{ctx, 4}; +    rb.Push(RESULT_SUCCESS); + +    // The following value is used upon failure to help the system recover. +    // Since we always succeed, this should be 0. +    rb.Push<u64>(0); +} + +void IApplicationFunctions::GetSaveDataSize(Kernel::HLERequestContext& ctx) { +    IPC::RequestParser rp{ctx}; +    const auto type{rp.PopRaw<FileSys::SaveDataType>()}; +    rp.Skip(1, false); +    const auto user_id{rp.PopRaw<u128>()}; + +    LOG_DEBUG(Service_AM, "called with type={:02X}, user_id={:016X}{:016X}", static_cast<u8>(type), +              user_id[1], user_id[0]); + +    const auto size = +        FileSystem::ReadSaveDataSize(type, Core::CurrentProcess()->GetTitleID(), user_id); + +    IPC::ResponseBuilder rb{ctx, 6}; +    rb.Push(RESULT_SUCCESS); +    rb.Push(size.normal); +    rb.Push(size.journal); +} +  void InstallInterfaces(SM::ServiceManager& service_manager,                         std::shared_ptr<NVFlinger::NVFlinger> nvflinger) {      auto message_queue = std::make_shared<AppletMessageQueue>(); diff --git a/src/core/hle/service/am/am.h b/src/core/hle/service/am/am.h index 34c45fadf..b6113cfdd 100644 --- a/src/core/hle/service/am/am.h +++ b/src/core/hle/service/am/am.h @@ -206,6 +206,8 @@ private:      void SetGamePlayRecordingState(Kernel::HLERequestContext& ctx);      void NotifyRunning(Kernel::HLERequestContext& ctx);      void GetPseudoDeviceId(Kernel::HLERequestContext& ctx); +    void ExtendSaveData(Kernel::HLERequestContext& ctx); +    void GetSaveDataSize(Kernel::HLERequestContext& ctx);      void BeginBlockingHomeButtonShortAndLongPressed(Kernel::HLERequestContext& ctx);      void EndBlockingHomeButtonShortAndLongPressed(Kernel::HLERequestContext& ctx);      void BeginBlockingHomeButton(Kernel::HLERequestContext& ctx); | 
