ns: rewrite IQueryService
This commit is contained in:
		| @@ -765,10 +765,10 @@ add_library(core STATIC | ||||
|     hle/service/ns/ns_types.h | ||||
|     hle/service/ns/ns.cpp | ||||
|     hle/service/ns/ns.h | ||||
|     hle/service/ns/pdm_qry.cpp | ||||
|     hle/service/ns/pdm_qry.h | ||||
|     hle/service/ns/platform_service_manager.cpp | ||||
|     hle/service/ns/platform_service_manager.h | ||||
|     hle/service/ns/query_service.cpp | ||||
|     hle/service/ns/query_service.h | ||||
|     hle/service/ns/read_only_application_control_data_interface.cpp | ||||
|     hle/service/ns/read_only_application_control_data_interface.h | ||||
|     hle/service/ns/read_only_application_record_interface.cpp | ||||
|   | ||||
| @@ -3,8 +3,8 @@ | ||||
|  | ||||
| #include "core/hle/service/ns/develop_interface.h" | ||||
| #include "core/hle/service/ns/ns.h" | ||||
| #include "core/hle/service/ns/pdm_qry.h" | ||||
| #include "core/hle/service/ns/platform_service_manager.h" | ||||
| #include "core/hle/service/ns/query_service.h" | ||||
| #include "core/hle/service/ns/service_getter_interface.h" | ||||
| #include "core/hle/service/ns/system_update_interface.h" | ||||
| #include "core/hle/service/ns/vulnerability_manager_interface.h" | ||||
| @@ -32,7 +32,7 @@ void LoopProcess(Core::System& system) { | ||||
|     server_manager->RegisterNamedService("ns:su", std::make_shared<ISystemUpdateInterface>(system)); | ||||
|     server_manager->RegisterNamedService("ns:vm", | ||||
|                                          std::make_shared<IVulnerabilityManagerInterface>(system)); | ||||
|     server_manager->RegisterNamedService("pdm:qry", std::make_shared<PDM_QRY>(system)); | ||||
|     server_manager->RegisterNamedService("pdm:qry", std::make_shared<IQueryService>(system)); | ||||
|  | ||||
|     server_manager->RegisterNamedService("pl:s", | ||||
|                                          std::make_shared<IPlatformServiceManager>(system, "pl:s")); | ||||
|   | ||||
| @@ -1,67 +0,0 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "common/uuid.h" | ||||
| #include "core/hle/service/ipc_helpers.h" | ||||
| #include "core/hle/service/ns/pdm_qry.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service::NS { | ||||
|  | ||||
| PDM_QRY::PDM_QRY(Core::System& system_) : ServiceFramework{system_, "pdm:qry"} { | ||||
|     // clang-format off | ||||
|         static const FunctionInfo functions[] = { | ||||
|             {0, nullptr, "QueryAppletEvent"}, | ||||
|             {1, nullptr, "QueryPlayStatistics"}, | ||||
|             {2, nullptr, "QueryPlayStatisticsByUserAccountId"}, | ||||
|             {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"}, | ||||
|             {4, nullptr, "QueryPlayStatisticsByApplicationId"}, | ||||
|             {5, &PDM_QRY::QueryPlayStatisticsByApplicationIdAndUserAccountId, "QueryPlayStatisticsByApplicationIdAndUserAccountId"}, | ||||
|             {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"}, | ||||
|             {7, nullptr, "QueryLastPlayTimeV0"}, | ||||
|             {8, nullptr, "QueryPlayEvent"}, | ||||
|             {9, nullptr, "GetAvailablePlayEventRange"}, | ||||
|             {10, nullptr, "QueryAccountEvent"}, | ||||
|             {11, nullptr, "QueryAccountPlayEvent"}, | ||||
|             {12, nullptr, "GetAvailableAccountPlayEventRange"}, | ||||
|             {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"}, | ||||
|             {14, nullptr, "QueryRecentlyPlayedApplication"}, | ||||
|             {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"}, | ||||
|             {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"}, | ||||
|             {17, nullptr, "QueryLastPlayTime"}, | ||||
|             {18, nullptr, "QueryApplicationPlayStatisticsForSystem"}, | ||||
|             {19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"}, | ||||
|         }; | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
|  | ||||
| PDM_QRY::~PDM_QRY() = default; | ||||
|  | ||||
| void PDM_QRY::QueryPlayStatisticsByApplicationIdAndUserAccountId(HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp{ctx}; | ||||
|     const auto unknown = rp.Pop<bool>(); | ||||
|     rp.Pop<u8>(); // Padding | ||||
|     const auto application_id = rp.Pop<u64>(); | ||||
|     const auto user_account_uid = rp.PopRaw<Common::UUID>(); | ||||
|  | ||||
|     // TODO(German77): Read statistics of the game | ||||
|     PlayStatistics statistics{ | ||||
|         .application_id = application_id, | ||||
|         .total_launches = 1, | ||||
|     }; | ||||
|  | ||||
|     LOG_WARNING(Service_NS, | ||||
|                 "(STUBBED) called. unknown={}. application_id=0x{:016X}, user_account_uid=0x{}", | ||||
|                 unknown, application_id, user_account_uid.RawString()); | ||||
|  | ||||
|     IPC::ResponseBuilder rb{ctx, 12}; | ||||
|     rb.Push(ResultSuccess); | ||||
|     rb.PushRaw(statistics); | ||||
| } | ||||
|  | ||||
| } // namespace Service::NS | ||||
							
								
								
									
										57
									
								
								src/core/hle/service/ns/query_service.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/core/hle/service/ns/query_service.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later | ||||
|  | ||||
| #include "common/logging/log.h" | ||||
| #include "common/uuid.h" | ||||
| #include "core/hle/service/cmif_serialization.h" | ||||
| #include "core/hle/service/ns/query_service.h" | ||||
| #include "core/hle/service/service.h" | ||||
|  | ||||
| namespace Service::NS { | ||||
|  | ||||
| IQueryService::IQueryService(Core::System& system_) : ServiceFramework{system_, "pdm:qry"} { | ||||
|     // clang-format off | ||||
|     static const FunctionInfo functions[] = { | ||||
|         {0, nullptr, "QueryAppletEvent"}, | ||||
|         {1, nullptr, "QueryPlayStatistics"}, | ||||
|         {2, nullptr, "QueryPlayStatisticsByUserAccountId"}, | ||||
|         {3, nullptr, "QueryPlayStatisticsByNetworkServiceAccountId"}, | ||||
|         {4, nullptr, "QueryPlayStatisticsByApplicationId"}, | ||||
|         {5, D<&IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId>, "QueryPlayStatisticsByApplicationIdAndUserAccountId"}, | ||||
|         {6, nullptr, "QueryPlayStatisticsByApplicationIdAndNetworkServiceAccountId"}, | ||||
|         {7, nullptr, "QueryLastPlayTimeV0"}, | ||||
|         {8, nullptr, "QueryPlayEvent"}, | ||||
|         {9, nullptr, "GetAvailablePlayEventRange"}, | ||||
|         {10, nullptr, "QueryAccountEvent"}, | ||||
|         {11, nullptr, "QueryAccountPlayEvent"}, | ||||
|         {12, nullptr, "GetAvailableAccountPlayEventRange"}, | ||||
|         {13, nullptr, "QueryApplicationPlayStatisticsForSystemV0"}, | ||||
|         {14, nullptr, "QueryRecentlyPlayedApplication"}, | ||||
|         {15, nullptr, "GetRecentlyPlayedApplicationUpdateEvent"}, | ||||
|         {16, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystemV0"}, | ||||
|         {17, nullptr, "QueryLastPlayTime"}, | ||||
|         {18, nullptr, "QueryApplicationPlayStatisticsForSystem"}, | ||||
|         {19, nullptr, "QueryApplicationPlayStatisticsByUserAccountIdForSystem"}, | ||||
|     }; | ||||
|     // clang-format on | ||||
|  | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
|  | ||||
| IQueryService::~IQueryService() = default; | ||||
|  | ||||
| Result IQueryService::QueryPlayStatisticsByApplicationIdAndUserAccountId( | ||||
|     Out<PlayStatistics> out_play_statistics, bool unknown, Common::UUID account_id, | ||||
|     u64 application_id) { | ||||
|     // TODO(German77): Read statistics of the game | ||||
|     *out_play_statistics = { | ||||
|         .application_id = application_id, | ||||
|         .total_launches = 1, | ||||
|     }; | ||||
|  | ||||
|     LOG_WARNING(Service_NS, "(STUBBED) called. unknown={}. application_id={:016X}, account_id={}", | ||||
|                 unknown, application_id, account_id.FormattedString()); | ||||
|     R_SUCCEED(); | ||||
| } | ||||
|  | ||||
| } // namespace Service::NS | ||||
| @@ -3,6 +3,8 @@ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "common/uuid.h" | ||||
| #include "core/hle/service/cmif_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
| 
 | ||||
| namespace Service::NS { | ||||
| @@ -20,13 +22,15 @@ struct PlayStatistics { | ||||
| }; | ||||
| static_assert(sizeof(PlayStatistics) == 0x28, "PlayStatistics is an invalid size"); | ||||
| 
 | ||||
| class PDM_QRY final : public ServiceFramework<PDM_QRY> { | ||||
| class IQueryService final : public ServiceFramework<IQueryService> { | ||||
| public: | ||||
|     explicit PDM_QRY(Core::System& system_); | ||||
|     ~PDM_QRY() override; | ||||
|     explicit IQueryService(Core::System& system_); | ||||
|     ~IQueryService() override; | ||||
| 
 | ||||
| private: | ||||
|     void QueryPlayStatisticsByApplicationIdAndUserAccountId(HLERequestContext& ctx); | ||||
|     Result QueryPlayStatisticsByApplicationIdAndUserAccountId( | ||||
|         Out<PlayStatistics> out_play_statistics, bool unknown, Common::UUID account_id, | ||||
|         u64 application_id); | ||||
| }; | ||||
| 
 | ||||
| } // namespace Service::NS
 | ||||
		Reference in New Issue
	
	Block a user
	 Liam
					Liam