summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/pctl/parental_control_service.cpp341
-rw-r--r--src/core/hle/service/pctl/parental_control_service.h62
2 files changed, 204 insertions, 199 deletions
diff --git a/src/core/hle/service/pctl/parental_control_service.cpp b/src/core/hle/service/pctl/parental_control_service.cpp
index 4248b0184..f57f2f157 100644
--- a/src/core/hle/service/pctl/parental_control_service.cpp
+++ b/src/core/hle/service/pctl/parental_control_service.cpp
@@ -4,7 +4,7 @@
4#include "core/core.h" 4#include "core/core.h"
5#include "core/file_sys/control_metadata.h" 5#include "core/file_sys/control_metadata.h"
6#include "core/file_sys/patch_manager.h" 6#include "core/file_sys/patch_manager.h"
7#include "core/hle/service/ipc_helpers.h" 7#include "core/hle/service/cmif_serialization.h"
8#include "core/hle/service/pctl/parental_control_service.h" 8#include "core/hle/service/pctl/parental_control_service.h"
9#include "core/hle/service/pctl/pctl_results.h" 9#include "core/hle/service/pctl/pctl_results.h"
10 10
@@ -12,37 +12,38 @@ namespace Service::PCTL {
12 12
13IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_) 13IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_)
14 : ServiceFramework{system_, "IParentalControlService"}, capability{capability_}, 14 : ServiceFramework{system_, "IParentalControlService"}, capability{capability_},
15 service_context{system_, "IParentalControlService"} { 15 service_context{system_, "IParentalControlService"}, synchronization_event{service_context},
16 unlinked_event{service_context}, request_suspension_event{service_context} {
16 // clang-format off 17 // clang-format off
17 static const FunctionInfo functions[] = { 18 static const FunctionInfo functions[] = {
18 {1, &IParentalControlService::Initialize, "Initialize"}, 19 {1, D<&IParentalControlService::Initialize>, "Initialize"},
19 {1001, &IParentalControlService::CheckFreeCommunicationPermission, "CheckFreeCommunicationPermission"}, 20 {1001, D<&IParentalControlService::CheckFreeCommunicationPermission>, "CheckFreeCommunicationPermission"},
20 {1002, nullptr, "ConfirmLaunchApplicationPermission"}, 21 {1002, D<&IParentalControlService::ConfirmLaunchApplicationPermission>, "ConfirmLaunchApplicationPermission"},
21 {1003, nullptr, "ConfirmResumeApplicationPermission"}, 22 {1003, D<&IParentalControlService::ConfirmResumeApplicationPermission>, "ConfirmResumeApplicationPermission"},
22 {1004, &IParentalControlService::ConfirmSnsPostPermission, "ConfirmSnsPostPermission"}, 23 {1004, D<&IParentalControlService::ConfirmSnsPostPermission>, "ConfirmSnsPostPermission"},
23 {1005, nullptr, "ConfirmSystemSettingsPermission"}, 24 {1005, nullptr, "ConfirmSystemSettingsPermission"},
24 {1006, &IParentalControlService::IsRestrictionTemporaryUnlocked, "IsRestrictionTemporaryUnlocked"}, 25 {1006, D<&IParentalControlService::IsRestrictionTemporaryUnlocked>, "IsRestrictionTemporaryUnlocked"},
25 {1007, nullptr, "RevertRestrictionTemporaryUnlocked"}, 26 {1007, nullptr, "RevertRestrictionTemporaryUnlocked"},
26 {1008, nullptr, "EnterRestrictedSystemSettings"}, 27 {1008, nullptr, "EnterRestrictedSystemSettings"},
27 {1009, nullptr, "LeaveRestrictedSystemSettings"}, 28 {1009, nullptr, "LeaveRestrictedSystemSettings"},
28 {1010, nullptr, "IsRestrictedSystemSettingsEntered"}, 29 {1010, D<&IParentalControlService::IsRestrictedSystemSettingsEntered>, "IsRestrictedSystemSettingsEntered"},
29 {1011, nullptr, "RevertRestrictedSystemSettingsEntered"}, 30 {1011, nullptr, "RevertRestrictedSystemSettingsEntered"},
30 {1012, nullptr, "GetRestrictedFeatures"}, 31 {1012, nullptr, "GetRestrictedFeatures"},
31 {1013, &IParentalControlService::ConfirmStereoVisionPermission, "ConfirmStereoVisionPermission"}, 32 {1013, D<&IParentalControlService::ConfirmStereoVisionPermission>, "ConfirmStereoVisionPermission"},
32 {1014, nullptr, "ConfirmPlayableApplicationVideoOld"}, 33 {1014, nullptr, "ConfirmPlayableApplicationVideoOld"},
33 {1015, nullptr, "ConfirmPlayableApplicationVideo"}, 34 {1015, nullptr, "ConfirmPlayableApplicationVideo"},
34 {1016, nullptr, "ConfirmShowNewsPermission"}, 35 {1016, nullptr, "ConfirmShowNewsPermission"},
35 {1017, &IParentalControlService::EndFreeCommunication, "EndFreeCommunication"}, 36 {1017, D<&IParentalControlService::EndFreeCommunication>, "EndFreeCommunication"},
36 {1018, &IParentalControlService::IsFreeCommunicationAvailable, "IsFreeCommunicationAvailable"}, 37 {1018, D<&IParentalControlService::IsFreeCommunicationAvailable>, "IsFreeCommunicationAvailable"},
37 {1031, &IParentalControlService::IsRestrictionEnabled, "IsRestrictionEnabled"}, 38 {1031, D<&IParentalControlService::IsRestrictionEnabled>, "IsRestrictionEnabled"},
38 {1032, &IParentalControlService::GetSafetyLevel, "GetSafetyLevel"}, 39 {1032, D<&IParentalControlService::GetSafetyLevel>, "GetSafetyLevel"},
39 {1033, nullptr, "SetSafetyLevel"}, 40 {1033, nullptr, "SetSafetyLevel"},
40 {1034, nullptr, "GetSafetyLevelSettings"}, 41 {1034, nullptr, "GetSafetyLevelSettings"},
41 {1035, &IParentalControlService::GetCurrentSettings, "GetCurrentSettings"}, 42 {1035, D<&IParentalControlService::GetCurrentSettings>, "GetCurrentSettings"},
42 {1036, nullptr, "SetCustomSafetyLevelSettings"}, 43 {1036, nullptr, "SetCustomSafetyLevelSettings"},
43 {1037, nullptr, "GetDefaultRatingOrganization"}, 44 {1037, nullptr, "GetDefaultRatingOrganization"},
44 {1038, nullptr, "SetDefaultRatingOrganization"}, 45 {1038, nullptr, "SetDefaultRatingOrganization"},
45 {1039, &IParentalControlService::GetFreeCommunicationApplicationListCount, "GetFreeCommunicationApplicationListCount"}, 46 {1039, D<&IParentalControlService::GetFreeCommunicationApplicationListCount>, "GetFreeCommunicationApplicationListCount"},
46 {1042, nullptr, "AddToFreeCommunicationApplicationList"}, 47 {1042, nullptr, "AddToFreeCommunicationApplicationList"},
47 {1043, nullptr, "DeleteSettings"}, 48 {1043, nullptr, "DeleteSettings"},
48 {1044, nullptr, "GetFreeCommunicationApplicationList"}, 49 {1044, nullptr, "GetFreeCommunicationApplicationList"},
@@ -51,20 +52,20 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili
51 {1047, nullptr, "NotifyApplicationDownloadStarted"}, 52 {1047, nullptr, "NotifyApplicationDownloadStarted"},
52 {1048, nullptr, "NotifyNetworkProfileCreated"}, 53 {1048, nullptr, "NotifyNetworkProfileCreated"},
53 {1049, nullptr, "ResetFreeCommunicationApplicationList"}, 54 {1049, nullptr, "ResetFreeCommunicationApplicationList"},
54 {1061, &IParentalControlService::ConfirmStereoVisionRestrictionConfigurable, "ConfirmStereoVisionRestrictionConfigurable"}, 55 {1061, D<&IParentalControlService::ConfirmStereoVisionRestrictionConfigurable>, "ConfirmStereoVisionRestrictionConfigurable"},
55 {1062, &IParentalControlService::GetStereoVisionRestriction, "GetStereoVisionRestriction"}, 56 {1062, D<&IParentalControlService::GetStereoVisionRestriction>, "GetStereoVisionRestriction"},
56 {1063, &IParentalControlService::SetStereoVisionRestriction, "SetStereoVisionRestriction"}, 57 {1063, D<&IParentalControlService::SetStereoVisionRestriction>, "SetStereoVisionRestriction"},
57 {1064, &IParentalControlService::ResetConfirmedStereoVisionPermission, "ResetConfirmedStereoVisionPermission"}, 58 {1064, D<&IParentalControlService::ResetConfirmedStereoVisionPermission>, "ResetConfirmedStereoVisionPermission"},
58 {1065, &IParentalControlService::IsStereoVisionPermitted, "IsStereoVisionPermitted"}, 59 {1065, D<&IParentalControlService::IsStereoVisionPermitted>, "IsStereoVisionPermitted"},
59 {1201, nullptr, "UnlockRestrictionTemporarily"}, 60 {1201, nullptr, "UnlockRestrictionTemporarily"},
60 {1202, nullptr, "UnlockSystemSettingsRestriction"}, 61 {1202, nullptr, "UnlockSystemSettingsRestriction"},
61 {1203, nullptr, "SetPinCode"}, 62 {1203, nullptr, "SetPinCode"},
62 {1204, nullptr, "GenerateInquiryCode"}, 63 {1204, nullptr, "GenerateInquiryCode"},
63 {1205, nullptr, "CheckMasterKey"}, 64 {1205, nullptr, "CheckMasterKey"},
64 {1206, nullptr, "GetPinCodeLength"}, 65 {1206, D<&IParentalControlService::GetPinCodeLength>, "GetPinCodeLength"},
65 {1207, nullptr, "GetPinCodeChangedEvent"}, 66 {1207, nullptr, "GetPinCodeChangedEvent"},
66 {1208, nullptr, "GetPinCode"}, 67 {1208, nullptr, "GetPinCode"},
67 {1403, &IParentalControlService::IsPairingActive, "IsPairingActive"}, 68 {1403, D<&IParentalControlService::IsPairingActive>, "IsPairingActive"},
68 {1406, nullptr, "GetSettingsLastUpdated"}, 69 {1406, nullptr, "GetSettingsLastUpdated"},
69 {1411, nullptr, "GetPairingAccountInfo"}, 70 {1411, nullptr, "GetPairingAccountInfo"},
70 {1421, nullptr, "GetAccountNickname"}, 71 {1421, nullptr, "GetAccountNickname"},
@@ -72,18 +73,18 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili
72 {1425, nullptr, "RequestPostEvents"}, 73 {1425, nullptr, "RequestPostEvents"},
73 {1426, nullptr, "GetPostEventInterval"}, 74 {1426, nullptr, "GetPostEventInterval"},
74 {1427, nullptr, "SetPostEventInterval"}, 75 {1427, nullptr, "SetPostEventInterval"},
75 {1432, &IParentalControlService::GetSynchronizationEvent, "GetSynchronizationEvent"}, 76 {1432, D<&IParentalControlService::GetSynchronizationEvent>, "GetSynchronizationEvent"},
76 {1451, nullptr, "StartPlayTimer"}, 77 {1451, D<&IParentalControlService::StartPlayTimer>, "StartPlayTimer"},
77 {1452, nullptr, "StopPlayTimer"}, 78 {1452, D<&IParentalControlService::StopPlayTimer>, "StopPlayTimer"},
78 {1453, nullptr, "IsPlayTimerEnabled"}, 79 {1453, D<&IParentalControlService::IsPlayTimerEnabled>, "IsPlayTimerEnabled"},
79 {1454, nullptr, "GetPlayTimerRemainingTime"}, 80 {1454, nullptr, "GetPlayTimerRemainingTime"},
80 {1455, nullptr, "IsRestrictedByPlayTimer"}, 81 {1455, D<&IParentalControlService::IsRestrictedByPlayTimer>, "IsRestrictedByPlayTimer"},
81 {1456, &IParentalControlService::GetPlayTimerSettings, "GetPlayTimerSettings"}, 82 {1456, D<&IParentalControlService::GetPlayTimerSettings>, "GetPlayTimerSettings"},
82 {1457, &IParentalControlService::GetPlayTimerEventToRequestSuspension, "GetPlayTimerEventToRequestSuspension"}, 83 {1457, D<&IParentalControlService::GetPlayTimerEventToRequestSuspension>, "GetPlayTimerEventToRequestSuspension"},
83 {1458, &IParentalControlService::IsPlayTimerAlarmDisabled, "IsPlayTimerAlarmDisabled"}, 84 {1458, D<&IParentalControlService::IsPlayTimerAlarmDisabled>, "IsPlayTimerAlarmDisabled"},
84 {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"}, 85 {1471, nullptr, "NotifyWrongPinCodeInputManyTimes"},
85 {1472, nullptr, "CancelNetworkRequest"}, 86 {1472, nullptr, "CancelNetworkRequest"},
86 {1473, &IParentalControlService::GetUnlinkedEvent, "GetUnlinkedEvent"}, 87 {1473, D<&IParentalControlService::GetUnlinkedEvent>, "GetUnlinkedEvent"},
87 {1474, nullptr, "ClearUnlinkedEvent"}, 88 {1474, nullptr, "ClearUnlinkedEvent"},
88 {1601, nullptr, "DisableAllFeatures"}, 89 {1601, nullptr, "DisableAllFeatures"},
89 {1602, nullptr, "PostEnableAllFeatures"}, 90 {1602, nullptr, "PostEnableAllFeatures"},
@@ -119,19 +120,9 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili
119 }; 120 };
120 // clang-format on 121 // clang-format on
121 RegisterHandlers(functions); 122 RegisterHandlers(functions);
122
123 synchronization_event =
124 service_context.CreateEvent("IParentalControlService::SynchronizationEvent");
125 unlinked_event = service_context.CreateEvent("IParentalControlService::UnlinkedEvent");
126 request_suspension_event =
127 service_context.CreateEvent("IParentalControlService::RequestSuspensionEvent");
128} 123}
129 124
130IParentalControlService::~IParentalControlService() { 125IParentalControlService::~IParentalControlService() = default;
131 service_context.CloseEvent(synchronization_event);
132 service_context.CloseEvent(unlinked_event);
133 service_context.CloseEvent(request_suspension_event);
134}
135 126
136bool IParentalControlService::CheckFreeCommunicationPermissionImpl() const { 127bool IParentalControlService::CheckFreeCommunicationPermissionImpl() const {
137 if (states.temporary_unlocked) { 128 if (states.temporary_unlocked) {
@@ -176,20 +167,19 @@ void IParentalControlService::SetStereoVisionRestrictionImpl(bool is_restricted)
176 settings.is_stero_vision_restricted = is_restricted; 167 settings.is_stero_vision_restricted = is_restricted;
177} 168}
178 169
179void IParentalControlService::Initialize(HLERequestContext& ctx) { 170Result IParentalControlService::Initialize() {
180 LOG_DEBUG(Service_PCTL, "called"); 171 LOG_DEBUG(Service_PCTL, "called");
181 IPC::ResponseBuilder rb{ctx, 2};
182 172
183 if (False(capability & (Capability::Application | Capability::System))) { 173 if (False(capability & (Capability::Application | Capability::System))) {
184 LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability); 174 LOG_ERROR(Service_PCTL, "Invalid capability! capability={:X}", capability);
185 return; 175 R_THROW(PCTL::ResultNoCapability);
186 } 176 }
187 177
188 // TODO(ogniK): Recovery flag initialization for pctl:r 178 // TODO(ogniK): Recovery flag initialization for pctl:r
189 179
190 const auto tid = system.GetApplicationProcessProgramID(); 180 const auto program_id = system.GetApplicationProcessProgramID();
191 if (tid != 0) { 181 if (program_id != 0) {
192 const FileSys::PatchManager pm{tid, system.GetFileSystemController(), 182 const FileSys::PatchManager pm{program_id, system.GetFileSystemController(),
193 system.GetContentProvider()}; 183 system.GetContentProvider()};
194 const auto control = pm.GetControlMetadata(); 184 const auto control = pm.GetControlMetadata();
195 if (control.first) { 185 if (control.first) {
@@ -199,7 +189,7 @@ void IParentalControlService::Initialize(HLERequestContext& ctx) {
199 states.free_communication = false; 189 states.free_communication = false;
200 states.stereo_vision = false; 190 states.stereo_vision = false;
201 states.application_info = ApplicationInfo{ 191 states.application_info = ApplicationInfo{
202 .application_id = tid, 192 .application_id = program_id,
203 .age_rating = control.first->GetRatingAge(), 193 .age_rating = control.first->GetRatingAge(),
204 .parental_control_flag = control.first->GetParentalControlFlag(), 194 .parental_control_flag = control.first->GetParentalControlFlag(),
205 .capability = capability, 195 .capability = capability,
@@ -211,231 +201,234 @@ void IParentalControlService::Initialize(HLERequestContext& ctx) {
211 } 201 }
212 } 202 }
213 203
214 rb.Push(ResultSuccess); 204 R_SUCCEED();
215} 205}
216 206
217void IParentalControlService::CheckFreeCommunicationPermission(HLERequestContext& ctx) { 207Result IParentalControlService::CheckFreeCommunicationPermission() {
218 LOG_DEBUG(Service_PCTL, "called"); 208 LOG_DEBUG(Service_PCTL, "called");
219 209
220 IPC::ResponseBuilder rb{ctx, 2};
221 if (!CheckFreeCommunicationPermissionImpl()) { 210 if (!CheckFreeCommunicationPermissionImpl()) {
222 rb.Push(PCTL::ResultNoFreeCommunication); 211 R_THROW(PCTL::ResultNoFreeCommunication);
223 } else { 212 } else {
224 rb.Push(ResultSuccess); 213 states.free_communication = true;
214 R_SUCCEED();
225 } 215 }
226
227 states.free_communication = true;
228} 216}
229 217
230void IParentalControlService::ConfirmSnsPostPermission(HLERequestContext& ctx) { 218Result IParentalControlService::ConfirmLaunchApplicationPermission(
231 LOG_WARNING(Service_PCTL, "(STUBBED) called"); 219 InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
220 LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
221 application_id);
222 R_SUCCEED();
223}
232 224
233 IPC::ResponseBuilder rb{ctx, 2}; 225Result IParentalControlService::ConfirmResumeApplicationPermission(
234 rb.Push(PCTL::ResultNoFreeCommunication); 226 InBuffer<BufferAttr_HipcPointer> restriction_bitset, u64 nacp_flag, u64 application_id) {
227 LOG_WARNING(Service_PCTL, "(STUBBED) called, nacp_flag={:#x} application_id={:016X}", nacp_flag,
228 application_id);
229 R_SUCCEED();
235} 230}
236 231
237void IParentalControlService::IsRestrictionTemporaryUnlocked(HLERequestContext& ctx) { 232Result IParentalControlService::ConfirmSnsPostPermission() {
238 const bool is_temporary_unlocked = false; 233 LOG_WARNING(Service_PCTL, "(STUBBED) called");
234 R_THROW(PCTL::ResultNoFreeCommunication);
235}
239 236
240 LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}", is_temporary_unlocked); 237Result IParentalControlService::IsRestrictionTemporaryUnlocked(
238 Out<bool> out_is_temporary_unlocked) {
239 *out_is_temporary_unlocked = false;
240 LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
241 *out_is_temporary_unlocked);
242 R_SUCCEED();
243}
241 244
242 IPC::ResponseBuilder rb{ctx, 3}; 245Result IParentalControlService::IsRestrictedSystemSettingsEntered(
243 rb.Push(ResultSuccess); 246 Out<bool> out_is_restricted_system_settings_entered) {
244 rb.Push<u8>(is_temporary_unlocked); 247 *out_is_restricted_system_settings_entered = false;
248 LOG_WARNING(Service_PCTL, "(STUBBED) called, is_temporary_unlocked={}",
249 *out_is_restricted_system_settings_entered);
250 R_SUCCEED();
245} 251}
246 252
247void IParentalControlService::ConfirmStereoVisionPermission(HLERequestContext& ctx) { 253Result IParentalControlService::ConfirmStereoVisionPermission() {
248 LOG_DEBUG(Service_PCTL, "called"); 254 LOG_DEBUG(Service_PCTL, "called");
249 states.stereo_vision = true; 255 states.stereo_vision = true;
250 256 R_SUCCEED();
251 IPC::ResponseBuilder rb{ctx, 2};
252 rb.Push(ResultSuccess);
253} 257}
254 258
255void IParentalControlService::EndFreeCommunication(HLERequestContext& ctx) { 259Result IParentalControlService::EndFreeCommunication() {
256 LOG_WARNING(Service_PCTL, "(STUBBED) called"); 260 LOG_WARNING(Service_PCTL, "(STUBBED) called");
257 261 R_SUCCEED();
258 IPC::ResponseBuilder rb{ctx, 2};
259 rb.Push(ResultSuccess);
260} 262}
261 263
262void IParentalControlService::IsFreeCommunicationAvailable(HLERequestContext& ctx) { 264Result IParentalControlService::IsFreeCommunicationAvailable() {
263 LOG_WARNING(Service_PCTL, "(STUBBED) called"); 265 LOG_WARNING(Service_PCTL, "(STUBBED) called");
264 266
265 IPC::ResponseBuilder rb{ctx, 2};
266 if (!CheckFreeCommunicationPermissionImpl()) { 267 if (!CheckFreeCommunicationPermissionImpl()) {
267 rb.Push(PCTL::ResultNoFreeCommunication); 268 R_THROW(PCTL::ResultNoFreeCommunication);
268 } else { 269 } else {
269 rb.Push(ResultSuccess); 270 R_SUCCEED();
270 } 271 }
271} 272}
272 273
273void IParentalControlService::IsRestrictionEnabled(HLERequestContext& ctx) { 274Result IParentalControlService::IsRestrictionEnabled(Out<bool> out_restriction_enabled) {
274 LOG_DEBUG(Service_PCTL, "called"); 275 LOG_DEBUG(Service_PCTL, "called");
275 276
276 IPC::ResponseBuilder rb{ctx, 3};
277 if (False(capability & (Capability::Status | Capability::Recovery))) { 277 if (False(capability & (Capability::Status | Capability::Recovery))) {
278 LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!"); 278 LOG_ERROR(Service_PCTL, "Application does not have Status or Recovery capabilities!");
279 rb.Push(PCTL::ResultNoCapability); 279 *out_restriction_enabled = false;
280 rb.Push(false); 280 R_THROW(PCTL::ResultNoCapability);
281 return;
282 } 281 }
283 282
284 rb.Push(pin_code[0] != '\0'); 283 *out_restriction_enabled = pin_code[0] != '\0';
284 R_SUCCEED();
285} 285}
286 286
287void IParentalControlService::GetSafetyLevel(HLERequestContext& ctx) { 287Result IParentalControlService::GetSafetyLevel(Out<u32> out_safety_level) {
288 const u32 safety_level = 0; 288 *out_safety_level = 0;
289 289 LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", *out_safety_level);
290 LOG_WARNING(Service_PCTL, "(STUBBED) called, safety_level={}", safety_level); 290 R_SUCCEED();
291
292 IPC::ResponseBuilder rb{ctx, 3};
293 rb.Push(ResultSuccess);
294 rb.Push(safety_level);
295} 291}
296 292
297void IParentalControlService::GetCurrentSettings(HLERequestContext& ctx) { 293Result IParentalControlService::GetCurrentSettings(Out<RestrictionSettings> out_settings) {
298 LOG_INFO(Service_PCTL, "called"); 294 LOG_INFO(Service_PCTL, "called");
299 295 *out_settings = restriction_settings;
300 IPC::ResponseBuilder rb{ctx, 3}; 296 R_SUCCEED();
301 rb.Push(ResultSuccess);
302 rb.PushRaw(restriction_settings);
303} 297}
304 298
305void IParentalControlService::GetFreeCommunicationApplicationListCount(HLERequestContext& ctx) { 299Result IParentalControlService::GetFreeCommunicationApplicationListCount(Out<s32> out_count) {
306 const u32 count = 4; 300 *out_count = 4;
307 301 LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", *out_count);
308 LOG_WARNING(Service_PCTL, "(STUBBED) called, count={}", count); 302 R_SUCCEED();
309
310 IPC::ResponseBuilder rb{ctx, 3};
311 rb.Push(ResultSuccess);
312 rb.Push(count);
313} 303}
314 304
315void IParentalControlService::ConfirmStereoVisionRestrictionConfigurable(HLERequestContext& ctx) { 305Result IParentalControlService::ConfirmStereoVisionRestrictionConfigurable() {
316 LOG_DEBUG(Service_PCTL, "called"); 306 LOG_DEBUG(Service_PCTL, "called");
317 307
318 IPC::ResponseBuilder rb{ctx, 2};
319
320 if (False(capability & Capability::StereoVision)) { 308 if (False(capability & Capability::StereoVision)) {
321 LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); 309 LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
322 rb.Push(PCTL::ResultNoCapability); 310 R_THROW(PCTL::ResultNoCapability);
323 return;
324 } 311 }
325 312
326 if (pin_code[0] == '\0') { 313 if (pin_code[0] == '\0') {
327 rb.Push(PCTL::ResultNoRestrictionEnabled); 314 R_THROW(PCTL::ResultNoRestrictionEnabled);
328 return;
329 } 315 }
330 316
331 rb.Push(ResultSuccess); 317 R_SUCCEED();
332} 318}
333 319
334void IParentalControlService::IsStereoVisionPermitted(HLERequestContext& ctx) { 320Result IParentalControlService::IsStereoVisionPermitted(Out<bool> out_is_permitted) {
335 LOG_DEBUG(Service_PCTL, "called"); 321 LOG_DEBUG(Service_PCTL, "called");
336 322
337 IPC::ResponseBuilder rb{ctx, 3};
338 if (!ConfirmStereoVisionPermissionImpl()) { 323 if (!ConfirmStereoVisionPermissionImpl()) {
339 rb.Push(PCTL::ResultStereoVisionRestricted); 324 *out_is_permitted = false;
340 rb.Push(false); 325 R_THROW(PCTL::ResultStereoVisionRestricted);
341 } else { 326 } else {
342 rb.Push(ResultSuccess); 327 *out_is_permitted = true;
343 rb.Push(true); 328 R_SUCCEED();
344 } 329 }
345} 330}
346 331
347void IParentalControlService::IsPairingActive(HLERequestContext& ctx) { 332Result IParentalControlService::GetPinCodeLength(Out<s32> out_length) {
348 const bool is_pairing_active = false; 333 *out_length = 0;
349 334 LOG_WARNING(Service_PCTL, "(STUBBED) called, length={}", *out_length);
350 LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", is_pairing_active); 335 R_SUCCEED();
336}
351 337
352 IPC::ResponseBuilder rb{ctx, 3}; 338Result IParentalControlService::IsPairingActive(Out<bool> out_is_pairing_active) {
353 rb.Push(ResultSuccess); 339 *out_is_pairing_active = false;
354 rb.Push<u8>(is_pairing_active); 340 LOG_WARNING(Service_PCTL, "(STUBBED) called, is_pairing_active={}", *out_is_pairing_active);
341 R_SUCCEED();
355} 342}
356 343
357void IParentalControlService::GetSynchronizationEvent(HLERequestContext& ctx) { 344Result IParentalControlService::GetSynchronizationEvent(
345 OutCopyHandle<Kernel::KReadableEvent> out_event) {
358 LOG_INFO(Service_PCTL, "called"); 346 LOG_INFO(Service_PCTL, "called");
359 347 *out_event = synchronization_event.GetHandle();
360 IPC::ResponseBuilder rb{ctx, 2, 1}; 348 R_SUCCEED();
361 rb.Push(ResultSuccess);
362 rb.PushCopyObjects(synchronization_event->GetReadableEvent());
363} 349}
364 350
365void IParentalControlService::GetPlayTimerSettings(HLERequestContext& ctx) { 351Result IParentalControlService::StartPlayTimer() {
366 LOG_WARNING(Service_PCTL, "(STUBBED) called"); 352 LOG_WARNING(Service_PCTL, "(STUBBED) called");
353 R_SUCCEED();
354}
367 355
368 const PlayTimerSettings timer_settings{}; 356Result IParentalControlService::StopPlayTimer() {
369 357 LOG_WARNING(Service_PCTL, "(STUBBED) called");
370 IPC::ResponseBuilder rb{ctx, 15}; 358 R_SUCCEED();
371 rb.Push(ResultSuccess);
372 rb.PushRaw(timer_settings);
373} 359}
374 360
375void IParentalControlService::GetPlayTimerEventToRequestSuspension(HLERequestContext& ctx) { 361Result IParentalControlService::IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled) {
376 LOG_INFO(Service_PCTL, "called"); 362 *out_is_play_timer_enabled = false;
363 LOG_WARNING(Service_PCTL, "(STUBBED) called, enabled={}", *out_is_play_timer_enabled);
364 R_SUCCEED();
365}
377 366
378 IPC::ResponseBuilder rb{ctx, 2, 1}; 367Result IParentalControlService::IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer) {
379 rb.Push(ResultSuccess); 368 *out_is_restricted_by_play_timer = false;
380 rb.PushCopyObjects(request_suspension_event->GetReadableEvent()); 369 LOG_WARNING(Service_PCTL, "(STUBBED) called, restricted={}", *out_is_restricted_by_play_timer);
370 R_SUCCEED();
381} 371}
382 372
383void IParentalControlService::IsPlayTimerAlarmDisabled(HLERequestContext& ctx) { 373Result IParentalControlService::GetPlayTimerSettings(
384 const bool is_play_timer_alarm_disabled = false; 374 Out<PlayTimerSettings> out_play_timer_settings) {
375 LOG_WARNING(Service_PCTL, "(STUBBED) called");
376 *out_play_timer_settings = {};
377 R_SUCCEED();
378}
385 379
386 LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}", is_play_timer_alarm_disabled); 380Result IParentalControlService::GetPlayTimerEventToRequestSuspension(
381 OutCopyHandle<Kernel::KReadableEvent> out_event) {
382 LOG_INFO(Service_PCTL, "called");
383 *out_event = request_suspension_event.GetHandle();
384 R_SUCCEED();
385}
387 386
388 IPC::ResponseBuilder rb{ctx, 3}; 387Result IParentalControlService::IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled) {
389 rb.Push(ResultSuccess); 388 *out_play_timer_alarm_disabled = false;
390 rb.Push<u8>(is_play_timer_alarm_disabled); 389 LOG_INFO(Service_PCTL, "called, is_play_timer_alarm_disabled={}",
390 *out_play_timer_alarm_disabled);
391 R_SUCCEED();
391} 392}
392 393
393void IParentalControlService::GetUnlinkedEvent(HLERequestContext& ctx) { 394Result IParentalControlService::GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
394 LOG_INFO(Service_PCTL, "called"); 395 LOG_INFO(Service_PCTL, "called");
395 396 *out_event = unlinked_event.GetHandle();
396 IPC::ResponseBuilder rb{ctx, 2, 1}; 397 R_SUCCEED();
397 rb.Push(ResultSuccess);
398 rb.PushCopyObjects(unlinked_event->GetReadableEvent());
399} 398}
400 399
401void IParentalControlService::SetStereoVisionRestriction(HLERequestContext& ctx) { 400Result IParentalControlService::GetStereoVisionRestriction(
402 IPC::RequestParser rp{ctx}; 401 Out<bool> out_stereo_vision_restriction) {
403 const auto can_use = rp.Pop<bool>(); 402 LOG_DEBUG(Service_PCTL, "called");
404 LOG_DEBUG(Service_PCTL, "called, can_use={}", can_use);
405 403
406 IPC::ResponseBuilder rb{ctx, 2};
407 if (False(capability & Capability::StereoVision)) { 404 if (False(capability & Capability::StereoVision)) {
408 LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); 405 LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
409 rb.Push(PCTL::ResultNoCapability); 406 *out_stereo_vision_restriction = false;
410 return; 407 R_THROW(PCTL::ResultNoCapability);
411 } 408 }
412 409
413 SetStereoVisionRestrictionImpl(can_use); 410 *out_stereo_vision_restriction = settings.is_stero_vision_restricted;
414 rb.Push(ResultSuccess); 411 R_SUCCEED();
415} 412}
416 413
417void IParentalControlService::GetStereoVisionRestriction(HLERequestContext& ctx) { 414Result IParentalControlService::SetStereoVisionRestriction(bool stereo_vision_restriction) {
418 LOG_DEBUG(Service_PCTL, "called"); 415 LOG_DEBUG(Service_PCTL, "called, can_use={}", stereo_vision_restriction);
419 416
420 IPC::ResponseBuilder rb{ctx, 3};
421 if (False(capability & Capability::StereoVision)) { 417 if (False(capability & Capability::StereoVision)) {
422 LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!"); 418 LOG_ERROR(Service_PCTL, "Application does not have StereoVision capability!");
423 rb.Push(PCTL::ResultNoCapability); 419 R_THROW(PCTL::ResultNoCapability);
424 rb.Push(false);
425 return;
426 } 420 }
427 421
428 rb.Push(ResultSuccess); 422 SetStereoVisionRestrictionImpl(stereo_vision_restriction);
429 rb.Push(settings.is_stero_vision_restricted); 423 R_SUCCEED();
430} 424}
431 425
432void IParentalControlService::ResetConfirmedStereoVisionPermission(HLERequestContext& ctx) { 426Result IParentalControlService::ResetConfirmedStereoVisionPermission() {
433 LOG_DEBUG(Service_PCTL, "called"); 427 LOG_DEBUG(Service_PCTL, "called");
434 428
435 states.stereo_vision = false; 429 states.stereo_vision = false;
436 430
437 IPC::ResponseBuilder rb{ctx, 2}; 431 R_SUCCEED();
438 rb.Push(ResultSuccess);
439} 432}
440 433
441} // namespace Service::PCTL 434} // namespace Service::PCTL
diff --git a/src/core/hle/service/pctl/parental_control_service.h b/src/core/hle/service/pctl/parental_control_service.h
index dcc357f65..03dbaa2e5 100644
--- a/src/core/hle/service/pctl/parental_control_service.h
+++ b/src/core/hle/service/pctl/parental_control_service.h
@@ -3,7 +3,9 @@
3 3
4#pragma once 4#pragma once
5 5
6#include "core/hle/service/cmif_types.h"
6#include "core/hle/service/kernel_helpers.h" 7#include "core/hle/service/kernel_helpers.h"
8#include "core/hle/service/os/event.h"
7#include "core/hle/service/pctl/pctl_types.h" 9#include "core/hle/service/pctl/pctl_types.h"
8#include "core/hle/service/service.h" 10#include "core/hle/service/service.h"
9 11
@@ -19,28 +21,38 @@ private:
19 bool ConfirmStereoVisionPermissionImpl() const; 21 bool ConfirmStereoVisionPermissionImpl() const;
20 void SetStereoVisionRestrictionImpl(bool is_restricted); 22 void SetStereoVisionRestrictionImpl(bool is_restricted);
21 23
22 void Initialize(HLERequestContext& ctx); 24 Result Initialize();
23 void CheckFreeCommunicationPermission(HLERequestContext& ctx); 25 Result CheckFreeCommunicationPermission();
24 void ConfirmSnsPostPermission(HLERequestContext& ctx); 26 Result ConfirmLaunchApplicationPermission(InBuffer<BufferAttr_HipcPointer> restriction_bitset,
25 void IsRestrictionTemporaryUnlocked(HLERequestContext& ctx); 27 u64 nacp_flag, u64 application_id);
26 void ConfirmStereoVisionPermission(HLERequestContext& ctx); 28 Result ConfirmResumeApplicationPermission(InBuffer<BufferAttr_HipcPointer> restriction_bitset,
27 void EndFreeCommunication(HLERequestContext& ctx); 29 u64 nacp_flag, u64 application_id);
28 void IsFreeCommunicationAvailable(HLERequestContext& ctx); 30 Result ConfirmSnsPostPermission();
29 void IsRestrictionEnabled(HLERequestContext& ctx); 31 Result IsRestrictionTemporaryUnlocked(Out<bool> out_is_temporary_unlocked);
30 void GetSafetyLevel(HLERequestContext& ctx); 32 Result IsRestrictedSystemSettingsEntered(Out<bool> out_is_restricted_system_settings_entered);
31 void GetCurrentSettings(HLERequestContext& ctx); 33 Result ConfirmStereoVisionPermission();
32 void GetFreeCommunicationApplicationListCount(HLERequestContext& ctx); 34 Result EndFreeCommunication();
33 void ConfirmStereoVisionRestrictionConfigurable(HLERequestContext& ctx); 35 Result IsFreeCommunicationAvailable();
34 void IsStereoVisionPermitted(HLERequestContext& ctx); 36 Result IsRestrictionEnabled(Out<bool> out_restriction_enabled);
35 void IsPairingActive(HLERequestContext& ctx); 37 Result GetSafetyLevel(Out<u32> out_safety_level);
36 void GetSynchronizationEvent(HLERequestContext& ctx); 38 Result GetCurrentSettings(Out<RestrictionSettings> out_settings);
37 void GetPlayTimerSettings(HLERequestContext& ctx); 39 Result GetFreeCommunicationApplicationListCount(Out<s32> out_count);
38 void GetPlayTimerEventToRequestSuspension(HLERequestContext& ctx); 40 Result ConfirmStereoVisionRestrictionConfigurable();
39 void IsPlayTimerAlarmDisabled(HLERequestContext& ctx); 41 Result IsStereoVisionPermitted(Out<bool> out_is_permitted);
40 void GetUnlinkedEvent(HLERequestContext& ctx); 42 Result GetPinCodeLength(Out<s32> out_length);
41 void SetStereoVisionRestriction(HLERequestContext& ctx); 43 Result IsPairingActive(Out<bool> out_is_pairing_active);
42 void GetStereoVisionRestriction(HLERequestContext& ctx); 44 Result GetSynchronizationEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
43 void ResetConfirmedStereoVisionPermission(HLERequestContext& ctx); 45 Result StartPlayTimer();
46 Result StopPlayTimer();
47 Result IsPlayTimerEnabled(Out<bool> out_is_play_timer_enabled);
48 Result IsRestrictedByPlayTimer(Out<bool> out_is_restricted_by_play_timer);
49 Result GetPlayTimerSettings(Out<PlayTimerSettings> out_play_timer_settings);
50 Result GetPlayTimerEventToRequestSuspension(OutCopyHandle<Kernel::KReadableEvent> out_event);
51 Result IsPlayTimerAlarmDisabled(Out<bool> out_play_timer_alarm_disabled);
52 Result GetUnlinkedEvent(OutCopyHandle<Kernel::KReadableEvent> out_event);
53 Result GetStereoVisionRestriction(Out<bool> out_stereo_vision_restriction);
54 Result SetStereoVisionRestriction(bool stereo_vision_restriction);
55 Result ResetConfirmedStereoVisionPermission();
44 56
45 struct States { 57 struct States {
46 u64 current_tid{}; 58 u64 current_tid{};
@@ -65,10 +77,10 @@ private:
65 std::array<char, 8> pin_code{}; 77 std::array<char, 8> pin_code{};
66 Capability capability{}; 78 Capability capability{};
67 79
68 Kernel::KEvent* synchronization_event;
69 Kernel::KEvent* unlinked_event;
70 Kernel::KEvent* request_suspension_event;
71 KernelHelpers::ServiceContext service_context; 80 KernelHelpers::ServiceContext service_context;
81 Event synchronization_event;
82 Event unlinked_event;
83 Event request_suspension_event;
72}; 84};
73 85
74} // namespace Service::PCTL 86} // namespace Service::PCTL