diff options
| author | 2024-02-21 21:41:55 -0500 | |
|---|---|---|
| committer | 2024-02-21 23:42:33 -0500 | |
| commit | 89c2fd3d2830d5b1e73c9e051e4af39772963036 (patch) | |
| tree | fb95e6ac93fac3fe1dfa4c7702dfec08ff825c94 | |
| parent | pctl: rewrite IParentalControlServiceFactory (diff) | |
| download | yuzu-89c2fd3d2830d5b1e73c9e051e4af39772963036.tar.gz yuzu-89c2fd3d2830d5b1e73c9e051e4af39772963036.tar.xz yuzu-89c2fd3d2830d5b1e73c9e051e4af39772963036.zip | |
pctl: rewrite IParentalControlService
| -rw-r--r-- | src/core/hle/service/pctl/parental_control_service.cpp | 341 | ||||
| -rw-r--r-- | src/core/hle/service/pctl/parental_control_service.h | 62 |
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 | ||
| 13 | IParentalControlService::IParentalControlService(Core::System& system_, Capability capability_) | 13 | IParentalControlService::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 | ||
| 130 | IParentalControlService::~IParentalControlService() { | 125 | IParentalControlService::~IParentalControlService() = default; |
| 131 | service_context.CloseEvent(synchronization_event); | ||
| 132 | service_context.CloseEvent(unlinked_event); | ||
| 133 | service_context.CloseEvent(request_suspension_event); | ||
| 134 | } | ||
| 135 | 126 | ||
| 136 | bool IParentalControlService::CheckFreeCommunicationPermissionImpl() const { | 127 | bool 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 | ||
| 179 | void IParentalControlService::Initialize(HLERequestContext& ctx) { | 170 | Result 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 | ||
| 217 | void IParentalControlService::CheckFreeCommunicationPermission(HLERequestContext& ctx) { | 207 | Result 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 | ||
| 230 | void IParentalControlService::ConfirmSnsPostPermission(HLERequestContext& ctx) { | 218 | Result 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}; | 225 | Result 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 | ||
| 237 | void IParentalControlService::IsRestrictionTemporaryUnlocked(HLERequestContext& ctx) { | 232 | Result 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); | 237 | Result 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}; | 245 | Result 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 | ||
| 247 | void IParentalControlService::ConfirmStereoVisionPermission(HLERequestContext& ctx) { | 253 | Result 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 | ||
| 255 | void IParentalControlService::EndFreeCommunication(HLERequestContext& ctx) { | 259 | Result 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 | ||
| 262 | void IParentalControlService::IsFreeCommunicationAvailable(HLERequestContext& ctx) { | 264 | Result 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 | ||
| 273 | void IParentalControlService::IsRestrictionEnabled(HLERequestContext& ctx) { | 274 | Result 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 | ||
| 287 | void IParentalControlService::GetSafetyLevel(HLERequestContext& ctx) { | 287 | Result 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 | ||
| 297 | void IParentalControlService::GetCurrentSettings(HLERequestContext& ctx) { | 293 | Result 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 | ||
| 305 | void IParentalControlService::GetFreeCommunicationApplicationListCount(HLERequestContext& ctx) { | 299 | Result 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 | ||
| 315 | void IParentalControlService::ConfirmStereoVisionRestrictionConfigurable(HLERequestContext& ctx) { | 305 | Result 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 | ||
| 334 | void IParentalControlService::IsStereoVisionPermitted(HLERequestContext& ctx) { | 320 | Result 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 | ||
| 347 | void IParentalControlService::IsPairingActive(HLERequestContext& ctx) { | 332 | Result 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}; | 338 | Result 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 | ||
| 357 | void IParentalControlService::GetSynchronizationEvent(HLERequestContext& ctx) { | 344 | Result 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 | ||
| 365 | void IParentalControlService::GetPlayTimerSettings(HLERequestContext& ctx) { | 351 | Result 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{}; | 356 | Result 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 | ||
| 375 | void IParentalControlService::GetPlayTimerEventToRequestSuspension(HLERequestContext& ctx) { | 361 | Result 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}; | 367 | Result 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 | ||
| 383 | void IParentalControlService::IsPlayTimerAlarmDisabled(HLERequestContext& ctx) { | 373 | Result 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); | 380 | Result 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}; | 387 | Result 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 | ||
| 393 | void IParentalControlService::GetUnlinkedEvent(HLERequestContext& ctx) { | 394 | Result 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 | ||
| 401 | void IParentalControlService::SetStereoVisionRestriction(HLERequestContext& ctx) { | 400 | Result 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 | ||
| 417 | void IParentalControlService::GetStereoVisionRestriction(HLERequestContext& ctx) { | 414 | Result 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 | ||
| 432 | void IParentalControlService::ResetConfirmedStereoVisionPermission(HLERequestContext& ctx) { | 426 | Result 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 |