acc: Stub StoreSaveDataThumbnail
Fixes ACA NEOGEO METAL SLUG hanging on boot.
This commit is contained in:
		| @@ -32,9 +32,15 @@ | ||||
|  | ||||
| namespace Service::Account { | ||||
|  | ||||
| constexpr ResultCode ERR_INVALID_BUFFER_SIZE{ErrorModule::Account, 30}; | ||||
| constexpr ResultCode ERR_INVALID_USER_ID{ErrorModule::Account, 20}; | ||||
| constexpr ResultCode ERR_INVALID_APPLICATION_ID{ErrorModule::Account, 22}; | ||||
| constexpr ResultCode ERR_INVALID_BUFFER{ErrorModule::Account, 30}; | ||||
| constexpr ResultCode ERR_INVALID_BUFFER_SIZE{ErrorModule::Account, 31}; | ||||
| constexpr ResultCode ERR_FAILED_SAVE_DATA{ErrorModule::Account, 100}; | ||||
|  | ||||
| // Thumbnails are hard coded to be at least this size | ||||
| constexpr std::size_t THUMBNAIL_SIZE = 0x24000; | ||||
|  | ||||
| static std::string GetImagePath(Common::UUID uuid) { | ||||
|     return Common::FS::GetUserPath(Common::FS::UserPath::NANDDir) + | ||||
|            "/system/save/8000000000000010/su/avators/" + uuid.FormatSwitch() + ".jpg"; | ||||
| @@ -369,7 +375,7 @@ protected: | ||||
|         if (user_data.size() < sizeof(ProfileData)) { | ||||
|             LOG_ERROR(Service_ACC, "ProfileData buffer too small!"); | ||||
|             IPC::ResponseBuilder rb{ctx, 2}; | ||||
|             rb.Push(ERR_INVALID_BUFFER_SIZE); | ||||
|             rb.Push(ERR_INVALID_BUFFER); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
| @@ -402,7 +408,7 @@ protected: | ||||
|         if (user_data.size() < sizeof(ProfileData)) { | ||||
|             LOG_ERROR(Service_ACC, "ProfileData buffer too small!"); | ||||
|             IPC::ResponseBuilder rb{ctx, 2}; | ||||
|             rb.Push(ERR_INVALID_BUFFER_SIZE); | ||||
|             rb.Push(ERR_INVALID_BUFFER); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
| @@ -811,6 +817,55 @@ void Module::Interface::ListOpenContextStoredUsers(Kernel::HLERequestContext& ct | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| } | ||||
|  | ||||
| void Module::Interface::StoreSaveDataThumbnailApplication(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto uuid = rp.PopRaw<Common::UUID>(); | ||||
|  | ||||
|     LOG_WARNING(Service_ACC, "(STUBBED) called, uuid={}", uuid.Format()); | ||||
|  | ||||
|     // TODO(ogniK): Check if application ID is zero on acc initialize. As we don't have a reliable | ||||
|     // way of confirming things like the TID, we're going to assume a non zero value for the time | ||||
|     // being. | ||||
|     constexpr u64 tid{1}; | ||||
|     StoreSaveDataThumbnail(ctx, uuid, tid); | ||||
| } | ||||
|  | ||||
| void Module::Interface::StoreSaveDataThumbnailSystem(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto uuid = rp.PopRaw<Common::UUID>(); | ||||
|     const auto tid = rp.Pop<u64_le>(); | ||||
|  | ||||
|     LOG_WARNING(Service_ACC, "(STUBBED) called, uuid={}, tid={:016X}", uuid.Format(), tid); | ||||
|     StoreSaveDataThumbnail(ctx, uuid, tid); | ||||
| } | ||||
|  | ||||
| void Module::Interface::StoreSaveDataThumbnail(Kernel::HLERequestContext& ctx, | ||||
|                                                const Common::UUID& uuid, const u64 tid) { | ||||
|     IPC::ResponseBuilder rb{ctx, 2}; | ||||
|  | ||||
|     if (tid == 0) { | ||||
|         LOG_ERROR(Service_ACC, "TitleID is not valid!"); | ||||
|         rb.Push(ERR_INVALID_APPLICATION_ID); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (!uuid) { | ||||
|         LOG_ERROR(Service_ACC, "User ID is not valid!"); | ||||
|         rb.Push(ERR_INVALID_USER_ID); | ||||
|         return; | ||||
|     } | ||||
|     const auto thumbnail_size = ctx.GetReadBufferSize(); | ||||
|     if (thumbnail_size != THUMBNAIL_SIZE) { | ||||
|         LOG_ERROR(Service_ACC, "Buffer size is empty! size={:X} expecting {:X}", thumbnail_size, | ||||
|                   THUMBNAIL_SIZE); | ||||
|         rb.Push(ERR_INVALID_BUFFER_SIZE); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // TODO(ogniK): Construct save data thumbnail | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| } | ||||
|  | ||||
| void Module::Interface::TrySelectUserWithoutInteraction(Kernel::HLERequestContext& ctx) { | ||||
|     LOG_DEBUG(Service_ACC, "called"); | ||||
|     // A u8 is passed into this function which we can safely ignore. It's to determine if we have | ||||
|   | ||||
| @@ -4,6 +4,7 @@ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include "common/uuid.h" | ||||
| #include "core/hle/service/glue/manager.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| @@ -36,9 +37,13 @@ public: | ||||
|         void ListQualifiedUsers(Kernel::HLERequestContext& ctx); | ||||
|         void LoadOpenContext(Kernel::HLERequestContext& ctx); | ||||
|         void ListOpenContextStoredUsers(Kernel::HLERequestContext& ctx); | ||||
|         void StoreSaveDataThumbnailApplication(Kernel::HLERequestContext& ctx); | ||||
|         void StoreSaveDataThumbnailSystem(Kernel::HLERequestContext& ctx); | ||||
|  | ||||
|     private: | ||||
|         ResultCode InitializeApplicationInfoBase(); | ||||
|         void StoreSaveDataThumbnail(Kernel::HLERequestContext& ctx, const Common::UUID& uuid, | ||||
|                                     const u64 tid); | ||||
|  | ||||
|         enum class ApplicationType : u32_le { | ||||
|             GameCard = 0, | ||||
|   | ||||
| @@ -29,7 +29,7 @@ ACC_SU::ACC_SU(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | ||||
|         {104, nullptr, "GetProfileUpdateNotifier"}, | ||||
|         {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ | ||||
|         {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+ | ||||
|         {110, nullptr, "StoreSaveDataThumbnail"}, | ||||
|         {110, &ACC_SU::StoreSaveDataThumbnailSystem, "StoreSaveDataThumbnail"}, | ||||
|         {111, nullptr, "ClearSaveDataThumbnail"}, | ||||
|         {112, nullptr, "LoadSaveDataThumbnail"}, | ||||
|         {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ | ||||
|   | ||||
| @@ -26,7 +26,7 @@ ACC_U0::ACC_U0(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | ||||
|         {101, &ACC_U0::GetBaasAccountManagerForApplication, "GetBaasAccountManagerForApplication"}, | ||||
|         {102, nullptr, "AuthenticateApplicationAsync"}, | ||||
|         {103, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ | ||||
|         {110, nullptr, "StoreSaveDataThumbnail"}, | ||||
|         {110, &ACC_U0::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, | ||||
|         {111, nullptr, "ClearSaveDataThumbnail"}, | ||||
|         {120, nullptr, "CreateGuestLoginRequest"}, | ||||
|         {130, &ACC_U0::LoadOpenContext, "LoadOpenContext"}, // 5.0.0+ | ||||
|   | ||||
| @@ -29,7 +29,7 @@ ACC_U1::ACC_U1(std::shared_ptr<Module> module, std::shared_ptr<ProfileManager> p | ||||
|         {104, nullptr, "GetProfileUpdateNotifier"}, | ||||
|         {105, nullptr, "CheckNetworkServiceAvailabilityAsync"}, // 4.0.0+ | ||||
|         {106, nullptr, "GetProfileSyncNotifier"}, // 9.0.0+ | ||||
|         {110, nullptr, "StoreSaveDataThumbnail"}, | ||||
|         {110, &ACC_U1::StoreSaveDataThumbnailApplication, "StoreSaveDataThumbnail"}, | ||||
|         {111, nullptr, "ClearSaveDataThumbnail"}, | ||||
|         {112, nullptr, "LoadSaveDataThumbnail"}, | ||||
|         {113, nullptr, "GetSaveDataThumbnailExistence"}, // 5.0.0+ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Chloe Marcec
					Chloe Marcec