summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Liam2024-01-29 11:02:01 -0500
committerGravatar Liam2024-01-29 11:56:32 -0500
commit41149d061ddee5e9a9dba9d2cfd0199b0c6a09de (patch)
treebd60b9ddfb3ffbb74853047935796a6c406ae708 /src
parentMerge pull request #12843 from t895/system-driver-whoops (diff)
downloadyuzu-41149d061ddee5e9a9dba9d2cfd0199b0c6a09de.tar.gz
yuzu-41149d061ddee5e9a9dba9d2cfd0199b0c6a09de.tar.xz
yuzu-41149d061ddee5e9a9dba9d2cfd0199b0c6a09de.zip
notif: rewrite for new IPC
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/glue/glue.cpp7
-rw-r--r--src/core/hle/service/glue/notif.cpp291
-rw-r--r--src/core/hle/service/glue/notif.h152
3 files changed, 324 insertions, 126 deletions
diff --git a/src/core/hle/service/glue/glue.cpp b/src/core/hle/service/glue/glue.cpp
index 10376bfac..ea2843462 100644
--- a/src/core/hle/service/glue/glue.cpp
+++ b/src/core/hle/service/glue/glue.cpp
@@ -31,8 +31,11 @@ void LoopProcess(Core::System& system) {
31 // Error Context 31 // Error Context
32 server_manager->RegisterNamedService("ectx:aw", std::make_shared<ECTX_AW>(system)); 32 server_manager->RegisterNamedService("ectx:aw", std::make_shared<ECTX_AW>(system));
33 33
34 // Notification Services for application 34 // Notification Services
35 server_manager->RegisterNamedService("notif:a", std::make_shared<NOTIF_A>(system)); 35 server_manager->RegisterNamedService(
36 "notif:a", std::make_shared<INotificationServicesForApplication>(system));
37 server_manager->RegisterNamedService("notif:s",
38 std::make_shared<INotificationServices>(system));
36 39
37 // Time 40 // Time
38 auto time = std::make_shared<Time::TimeManager>(system); 41 auto time = std::make_shared<Time::TimeManager>(system);
diff --git a/src/core/hle/service/glue/notif.cpp b/src/core/hle/service/glue/notif.cpp
index fec4ad86c..5a03d34c1 100644
--- a/src/core/hle/service/glue/notif.cpp
+++ b/src/core/hle/service/glue/notif.cpp
@@ -6,48 +6,31 @@
6 6
7#include "common/assert.h" 7#include "common/assert.h"
8#include "common/logging/log.h" 8#include "common/logging/log.h"
9#include "core/hle/service/cmif_serialization.h"
9#include "core/hle/service/glue/notif.h" 10#include "core/hle/service/glue/notif.h"
10#include "core/hle/service/ipc_helpers.h" 11#include "core/hle/service/ipc_helpers.h"
12#include "core/hle/service/kernel_helpers.h"
11 13
12namespace Service::Glue { 14namespace Service::Glue {
13 15
14NOTIF_A::NOTIF_A(Core::System& system_) : ServiceFramework{system_, "notif:a"} { 16namespace {
15 // clang-format off
16 static const FunctionInfo functions[] = {
17 {500, &NOTIF_A::RegisterAlarmSetting, "RegisterAlarmSetting"},
18 {510, &NOTIF_A::UpdateAlarmSetting, "UpdateAlarmSetting"},
19 {520, &NOTIF_A::ListAlarmSettings, "ListAlarmSettings"},
20 {530, &NOTIF_A::LoadApplicationParameter, "LoadApplicationParameter"},
21 {540, &NOTIF_A::DeleteAlarmSetting, "DeleteAlarmSetting"},
22 {1000, &NOTIF_A::Initialize, "Initialize"},
23 };
24 // clang-format on
25
26 RegisterHandlers(functions);
27}
28
29NOTIF_A::~NOTIF_A() = default;
30 17
31void NOTIF_A::RegisterAlarmSetting(HLERequestContext& ctx) { 18constexpr inline std::size_t MaxAlarms = 8;
32 const auto alarm_setting_buffer_size = ctx.GetReadBufferSize(0);
33 const auto application_parameter_size = ctx.GetReadBufferSize(1);
34
35 ASSERT_MSG(alarm_setting_buffer_size == sizeof(AlarmSetting),
36 "alarm_setting_buffer_size is not 0x40 bytes");
37 ASSERT_MSG(application_parameter_size <= sizeof(ApplicationParameter),
38 "application_parameter_size is bigger than 0x400 bytes");
39 19
40 AlarmSetting new_alarm{}; 20}
41 memcpy(&new_alarm, ctx.ReadBuffer(0).data(), sizeof(AlarmSetting));
42 21
43 // TODO: Count alarms per game id 22Result NotificationServiceImpl::RegisterAlarmSetting(AlarmSettingId* out_alarm_setting_id,
44 if (alarms.size() >= max_alarms) { 23 const AlarmSetting& alarm_setting,
24 std::span<const u8> application_parameter) {
25 if (alarms.size() > MaxAlarms) {
45 LOG_ERROR(Service_NOTIF, "Alarm limit reached"); 26 LOG_ERROR(Service_NOTIF, "Alarm limit reached");
46 IPC::ResponseBuilder rb{ctx, 2}; 27 R_THROW(ResultUnknown);
47 rb.Push(ResultUnknown);
48 return;
49 } 28 }
50 29
30 ASSERT_MSG(application_parameter.size() <= sizeof(ApplicationParameter),
31 "application_parameter_size is bigger than 0x400 bytes");
32
33 AlarmSetting new_alarm = alarm_setting;
51 new_alarm.alarm_setting_id = last_alarm_setting_id++; 34 new_alarm.alarm_setting_id = last_alarm_setting_id++;
52 alarms.push_back(new_alarm); 35 alarms.push_back(new_alarm);
53 36
@@ -55,100 +38,82 @@ void NOTIF_A::RegisterAlarmSetting(HLERequestContext& ctx) {
55 38
56 LOG_WARNING(Service_NOTIF, 39 LOG_WARNING(Service_NOTIF,
57 "(STUBBED) called, application_parameter_size={}, setting_id={}, kind={}, muted={}", 40 "(STUBBED) called, application_parameter_size={}, setting_id={}, kind={}, muted={}",
58 application_parameter_size, new_alarm.alarm_setting_id, new_alarm.kind, 41 application_parameter.size(), new_alarm.alarm_setting_id, new_alarm.kind,
59 new_alarm.muted); 42 new_alarm.muted);
60 43
61 IPC::ResponseBuilder rb{ctx, 2}; 44 *out_alarm_setting_id = new_alarm.alarm_setting_id;
62 rb.Push(ResultSuccess); 45 R_SUCCEED();
63 rb.Push(new_alarm.alarm_setting_id);
64} 46}
65 47
66void NOTIF_A::UpdateAlarmSetting(HLERequestContext& ctx) { 48Result NotificationServiceImpl::UpdateAlarmSetting(const AlarmSetting& alarm_setting,
67 const auto alarm_setting_buffer_size = ctx.GetReadBufferSize(0); 49 std::span<const u8> application_parameter) {
68 const auto application_parameter_size = ctx.GetReadBufferSize(1); 50 ASSERT_MSG(application_parameter.size() <= sizeof(ApplicationParameter),
69
70 ASSERT_MSG(alarm_setting_buffer_size == sizeof(AlarmSetting),
71 "alarm_setting_buffer_size is not 0x40 bytes");
72 ASSERT_MSG(application_parameter_size <= sizeof(ApplicationParameter),
73 "application_parameter_size is bigger than 0x400 bytes"); 51 "application_parameter_size is bigger than 0x400 bytes");
74 52
75 AlarmSetting alarm_setting{};
76 memcpy(&alarm_setting, ctx.ReadBuffer(0).data(), sizeof(AlarmSetting));
77
78 const auto alarm_it = GetAlarmFromId(alarm_setting.alarm_setting_id); 53 const auto alarm_it = GetAlarmFromId(alarm_setting.alarm_setting_id);
79 if (alarm_it != alarms.end()) { 54 if (alarm_it != alarms.end()) {
80 LOG_DEBUG(Service_NOTIF, "Alarm updated"); 55 LOG_DEBUG(Service_NOTIF, "Alarm updated");
81 *alarm_it = alarm_setting; 56 *alarm_it = alarm_setting;
82 // TODO: Save application parameter data
83 } 57 }
84 58
85 LOG_WARNING(Service_NOTIF, 59 LOG_WARNING(Service_NOTIF,
86 "(STUBBED) called, application_parameter_size={}, setting_id={}, kind={}, muted={}", 60 "(STUBBED) called, application_parameter_size={}, setting_id={}, kind={}, muted={}",
87 application_parameter_size, alarm_setting.alarm_setting_id, alarm_setting.kind, 61 application_parameter.size(), alarm_setting.alarm_setting_id, alarm_setting.kind,
88 alarm_setting.muted); 62 alarm_setting.muted);
89 63 R_SUCCEED();
90 IPC::ResponseBuilder rb{ctx, 2};
91 rb.Push(ResultSuccess);
92} 64}
93 65
94void NOTIF_A::ListAlarmSettings(HLERequestContext& ctx) { 66Result NotificationServiceImpl::ListAlarmSettings(s32* out_count,
67 std::span<AlarmSetting> out_alarms) {
95 LOG_INFO(Service_NOTIF, "called, alarm_count={}", alarms.size()); 68 LOG_INFO(Service_NOTIF, "called, alarm_count={}", alarms.size());
96 69
97 // TODO: Only return alarms of this game id 70 const auto count = std::min(out_alarms.size(), alarms.size());
98 ctx.WriteBuffer(alarms); 71 for (size_t i = 0; i < count; i++) {
72 out_alarms[i] = alarms[i];
73 }
99 74
100 IPC::ResponseBuilder rb{ctx, 3}; 75 *out_count = static_cast<s32>(count);
101 rb.Push(ResultSuccess); 76 R_SUCCEED();
102 rb.Push(static_cast<u32>(alarms.size()));
103} 77}
104 78
105void NOTIF_A::LoadApplicationParameter(HLERequestContext& ctx) { 79Result NotificationServiceImpl::LoadApplicationParameter(u32* out_size,
106 IPC::RequestParser rp{ctx}; 80 std::span<u8> out_application_parameter,
107 const auto alarm_setting_id{rp.Pop<AlarmSettingId>()}; 81 AlarmSettingId alarm_setting_id) {
108
109 const auto alarm_it = GetAlarmFromId(alarm_setting_id); 82 const auto alarm_it = GetAlarmFromId(alarm_setting_id);
110 if (alarm_it == alarms.end()) { 83 if (alarm_it == alarms.end()) {
111 LOG_ERROR(Service_NOTIF, "Invalid alarm setting id={}", alarm_setting_id); 84 LOG_ERROR(Service_NOTIF, "Invalid alarm setting id={}", alarm_setting_id);
112 IPC::ResponseBuilder rb{ctx, 2}; 85 R_THROW(ResultUnknown);
113 rb.Push(ResultUnknown);
114 return;
115 } 86 }
116 87
117 // TODO: Read application parameter related to this setting id 88 // TODO: Read application parameter related to this setting id
118 ApplicationParameter application_parameter{}; 89 ApplicationParameter application_parameter{};
119 90
120 LOG_WARNING(Service_NOTIF, "(STUBBED) called, alarm_setting_id={}", alarm_setting_id); 91 LOG_WARNING(Service_NOTIF, "(STUBBED) called, alarm_setting_id={}", alarm_setting_id);
92 std::memcpy(out_application_parameter.data(), application_parameter.data(),
93 std::min(sizeof(application_parameter), out_application_parameter.size()));
121 94
122 ctx.WriteBuffer(application_parameter); 95 *out_size = static_cast<u32>(application_parameter.size());
123 96 R_SUCCEED();
124 IPC::ResponseBuilder rb{ctx, 2};
125 rb.Push(ResultSuccess);
126 rb.Push(static_cast<u32>(application_parameter.size()));
127} 97}
128 98
129void NOTIF_A::DeleteAlarmSetting(HLERequestContext& ctx) { 99Result NotificationServiceImpl::DeleteAlarmSetting(AlarmSettingId alarm_setting_id) {
130 IPC::RequestParser rp{ctx};
131 const auto alarm_setting_id{rp.Pop<AlarmSettingId>()};
132
133 std::erase_if(alarms, [alarm_setting_id](const AlarmSetting& alarm) { 100 std::erase_if(alarms, [alarm_setting_id](const AlarmSetting& alarm) {
134 return alarm.alarm_setting_id == alarm_setting_id; 101 return alarm.alarm_setting_id == alarm_setting_id;
135 }); 102 });
136 103
137 LOG_INFO(Service_NOTIF, "called, alarm_setting_id={}", alarm_setting_id); 104 LOG_INFO(Service_NOTIF, "called, alarm_setting_id={}", alarm_setting_id);
138 105
139 IPC::ResponseBuilder rb{ctx, 2}; 106 R_SUCCEED();
140 rb.Push(ResultSuccess);
141} 107}
142 108
143void NOTIF_A::Initialize(HLERequestContext& ctx) { 109Result NotificationServiceImpl::Initialize(u64 aruid) {
144 // TODO: Load previous alarms from config 110 // TODO: Load previous alarms from config
145 111
146 LOG_WARNING(Service_NOTIF, "(STUBBED) called"); 112 LOG_WARNING(Service_NOTIF, "(STUBBED) called");
147 IPC::ResponseBuilder rb{ctx, 2}; 113 R_SUCCEED();
148 rb.Push(ResultSuccess);
149} 114}
150 115
151std::vector<NOTIF_A::AlarmSetting>::iterator NOTIF_A::GetAlarmFromId( 116std::vector<AlarmSetting>::iterator NotificationServiceImpl::GetAlarmFromId(
152 AlarmSettingId alarm_setting_id) { 117 AlarmSettingId alarm_setting_id) {
153 return std::find_if(alarms.begin(), alarms.end(), 118 return std::find_if(alarms.begin(), alarms.end(),
154 [alarm_setting_id](const AlarmSetting& alarm) { 119 [alarm_setting_id](const AlarmSetting& alarm) {
@@ -156,4 +121,174 @@ std::vector<NOTIF_A::AlarmSetting>::iterator NOTIF_A::GetAlarmFromId(
156 }); 121 });
157} 122}
158 123
124INotificationServicesForApplication::INotificationServicesForApplication(Core::System& system_)
125 : ServiceFramework{system_, "notif:a"} {
126 // clang-format off
127 static const FunctionInfo functions[] = {
128 {500, D<&INotificationServicesForApplication::RegisterAlarmSetting>, "RegisterAlarmSetting"},
129 {510, D<&INotificationServicesForApplication::UpdateAlarmSetting>, "UpdateAlarmSetting"},
130 {520, D<&INotificationServicesForApplication::ListAlarmSettings>, "ListAlarmSettings"},
131 {530, D<&INotificationServicesForApplication::LoadApplicationParameter>, "LoadApplicationParameter"},
132 {540, D<&INotificationServicesForApplication::DeleteAlarmSetting>, "DeleteAlarmSetting"},
133 {1000, D<&INotificationServicesForApplication::Initialize>, "Initialize"},
134 };
135 // clang-format on
136
137 RegisterHandlers(functions);
138}
139
140INotificationServicesForApplication::~INotificationServicesForApplication() = default;
141
142Result INotificationServicesForApplication::RegisterAlarmSetting(
143 Out<AlarmSettingId> out_alarm_setting_id,
144 InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
145 InBuffer<BufferAttr_HipcMapAlias> application_parameter) {
146 R_RETURN(impl.RegisterAlarmSetting(out_alarm_setting_id.Get(), *alarm_setting,
147 application_parameter));
148}
149
150Result INotificationServicesForApplication::UpdateAlarmSetting(
151 InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
152 InBuffer<BufferAttr_HipcMapAlias> application_parameter) {
153 R_RETURN(impl.UpdateAlarmSetting(*alarm_setting, application_parameter));
154}
155
156Result INotificationServicesForApplication::ListAlarmSettings(
157 Out<s32> out_count, OutArray<AlarmSetting, BufferAttr_HipcMapAlias> out_alarms) {
158 R_RETURN(impl.ListAlarmSettings(out_count.Get(), out_alarms));
159}
160
161Result INotificationServicesForApplication::LoadApplicationParameter(
162 Out<u32> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_application_parameter,
163 AlarmSettingId alarm_setting_id) {
164 R_RETURN(
165 impl.LoadApplicationParameter(out_size.Get(), out_application_parameter, alarm_setting_id));
166}
167
168Result INotificationServicesForApplication::DeleteAlarmSetting(AlarmSettingId alarm_setting_id) {
169 R_RETURN(impl.DeleteAlarmSetting(alarm_setting_id));
170}
171
172Result INotificationServicesForApplication::Initialize(ClientAppletResourceUserId aruid) {
173 R_RETURN(impl.Initialize(*aruid));
174}
175
176class INotificationSystemEventAccessor final
177 : public ServiceFramework<INotificationSystemEventAccessor> {
178public:
179 explicit INotificationSystemEventAccessor(Core::System& system_)
180 : ServiceFramework{system_, "INotificationSystemEventAccessor"},
181 service_context{system_, "INotificationSystemEventAccessor"} {
182 // clang-format off
183 static const FunctionInfo functions[] = {
184 {0, D<&INotificationSystemEventAccessor::GetSystemEvent>, "GetSystemEvent"},
185 };
186 // clang-format on
187
188 RegisterHandlers(functions);
189
190 notification_event =
191 service_context.CreateEvent("INotificationSystemEventAccessor:NotificationEvent");
192 }
193
194 ~INotificationSystemEventAccessor() {
195 service_context.CloseEvent(notification_event);
196 }
197
198private:
199 Result GetSystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_readable_event) {
200 LOG_WARNING(Service_NOTIF, "(STUBBED) called");
201
202 *out_readable_event = &notification_event->GetReadableEvent();
203 R_SUCCEED();
204 }
205
206 KernelHelpers::ServiceContext service_context;
207 Kernel::KEvent* notification_event;
208};
209
210INotificationServices::INotificationServices(Core::System& system_)
211 : ServiceFramework{system_, "notif:s"} {
212 // clang-format off
213 static const FunctionInfo functions[] = {
214 {500, D<&INotificationServices::RegisterAlarmSetting>, "RegisterAlarmSetting"},
215 {510, D<&INotificationServices::UpdateAlarmSetting>, "UpdateAlarmSetting"},
216 {520, D<&INotificationServices::ListAlarmSettings>, "ListAlarmSettings"},
217 {530, D<&INotificationServices::LoadApplicationParameter>, "LoadApplicationParameter"},
218 {540, D<&INotificationServices::DeleteAlarmSetting>, "DeleteAlarmSetting"},
219 {1000, D<&INotificationServices::Initialize>, "Initialize"},
220 {1010, nullptr, "ListNotifications"},
221 {1020, nullptr, "DeleteNotification"},
222 {1030, nullptr, "ClearNotifications"},
223 {1040, D<&INotificationServices::OpenNotificationSystemEventAccessor>, "OpenNotificationSystemEventAccessor"},
224 {1500, nullptr, "SetNotificationPresentationSetting"},
225 {1510, D<&INotificationServices::GetNotificationPresentationSetting>, "GetNotificationPresentationSetting"},
226 {2000, nullptr, "GetAlarmSetting"},
227 {2001, nullptr, "GetAlarmSettingWithApplicationParameter"},
228 {2010, nullptr, "MuteAlarmSetting"},
229 {2020, nullptr, "IsAlarmSettingReady"},
230 {8000, nullptr, "RegisterAppletResourceUserId"},
231 {8010, nullptr, "UnregisterAppletResourceUserId"},
232 {8999, nullptr, "GetCurrentTime"},
233 {9000, nullptr, "GetAlarmSettingNextNotificationTime"},
234 };
235 // clang-format on
236
237 RegisterHandlers(functions);
238}
239
240INotificationServices::~INotificationServices() = default;
241
242Result INotificationServices::RegisterAlarmSetting(
243 Out<AlarmSettingId> out_alarm_setting_id,
244 InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
245 InBuffer<BufferAttr_HipcMapAlias> application_parameter) {
246 R_RETURN(impl.RegisterAlarmSetting(out_alarm_setting_id.Get(), *alarm_setting,
247 application_parameter));
248}
249
250Result INotificationServices::UpdateAlarmSetting(
251 InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
252 InBuffer<BufferAttr_HipcMapAlias> application_parameter) {
253 R_RETURN(impl.UpdateAlarmSetting(*alarm_setting, application_parameter));
254}
255
256Result INotificationServices::ListAlarmSettings(
257 Out<s32> out_count, OutArray<AlarmSetting, BufferAttr_HipcMapAlias> out_alarms) {
258 R_RETURN(impl.ListAlarmSettings(out_count.Get(), out_alarms));
259}
260
261Result INotificationServices::LoadApplicationParameter(
262 Out<u32> out_size, OutBuffer<BufferAttr_HipcMapAlias> out_application_parameter,
263 AlarmSettingId alarm_setting_id) {
264 R_RETURN(
265 impl.LoadApplicationParameter(out_size.Get(), out_application_parameter, alarm_setting_id));
266}
267
268Result INotificationServices::DeleteAlarmSetting(AlarmSettingId alarm_setting_id) {
269 R_RETURN(impl.DeleteAlarmSetting(alarm_setting_id));
270}
271
272Result INotificationServices::Initialize(ClientAppletResourceUserId aruid) {
273 R_RETURN(impl.Initialize(*aruid));
274}
275
276Result INotificationServices::OpenNotificationSystemEventAccessor(
277 Out<SharedPointer<INotificationSystemEventAccessor>> out_notification_system_event_accessor) {
278 LOG_WARNING(Service_NOTIF, "(STUBBED) called");
279
280 *out_notification_system_event_accessor =
281 std::make_shared<INotificationSystemEventAccessor>(system);
282 R_SUCCEED();
283}
284
285Result INotificationServices::GetNotificationPresentationSetting(
286 Out<NotificationPresentationSetting> out_notification_presentation_setting,
287 NotificationChannel notification_channel) {
288 LOG_WARNING(Service_NOTIF, "(STUBBED) called");
289
290 *out_notification_presentation_setting = {};
291 R_SUCCEED();
292}
293
159} // namespace Service::Glue 294} // namespace Service::Glue
diff --git a/src/core/hle/service/glue/notif.h b/src/core/hle/service/glue/notif.h
index b1187f3a3..ef2522fdf 100644
--- a/src/core/hle/service/glue/notif.h
+++ b/src/core/hle/service/glue/notif.h
@@ -7,6 +7,7 @@
7#include <vector> 7#include <vector>
8 8
9#include "common/uuid.h" 9#include "common/uuid.h"
10#include "core/hle/service/cmif_types.h"
10#include "core/hle/service/service.h" 11#include "core/hle/service/service.h"
11 12
12namespace Core { 13namespace Core {
@@ -15,58 +16,117 @@ class System;
15 16
16namespace Service::Glue { 17namespace Service::Glue {
17 18
18class NOTIF_A final : public ServiceFramework<NOTIF_A> { 19// This is nn::notification::AlarmSettingId
20using AlarmSettingId = u16;
21static_assert(sizeof(AlarmSettingId) == 0x2, "AlarmSettingId is an invalid size");
22
23using ApplicationParameter = std::array<u8, 0x400>;
24static_assert(sizeof(ApplicationParameter) == 0x400, "ApplicationParameter is an invalid size");
25
26struct DailyAlarmSetting {
27 s8 hour;
28 s8 minute;
29};
30static_assert(sizeof(DailyAlarmSetting) == 0x2, "DailyAlarmSetting is an invalid size");
31
32struct WeeklyScheduleAlarmSetting {
33 INSERT_PADDING_BYTES_NOINIT(0xA);
34 std::array<DailyAlarmSetting, 0x7> day_of_week;
35};
36static_assert(sizeof(WeeklyScheduleAlarmSetting) == 0x18,
37 "WeeklyScheduleAlarmSetting is an invalid size");
38
39// This is nn::notification::AlarmSetting
40struct AlarmSetting {
41 AlarmSettingId alarm_setting_id;
42 u8 kind;
43 u8 muted;
44 INSERT_PADDING_BYTES_NOINIT(0x4);
45 Common::UUID account_id;
46 u64 application_id;
47 INSERT_PADDING_BYTES_NOINIT(0x8);
48 WeeklyScheduleAlarmSetting schedule;
49};
50static_assert(sizeof(AlarmSetting) == 0x40, "AlarmSetting is an invalid size");
51
52enum class NotificationChannel : u8 {
53 Unknown0 = 0,
54};
55
56struct NotificationPresentationSetting {
57 INSERT_PADDING_BYTES_NOINIT(0x10);
58};
59static_assert(sizeof(NotificationPresentationSetting) == 0x10,
60 "NotificationPresentationSetting is an invalid size");
61
62class NotificationServiceImpl {
19public: 63public:
20 explicit NOTIF_A(Core::System& system_); 64 Result RegisterAlarmSetting(AlarmSettingId* out_alarm_setting_id,
21 ~NOTIF_A() override; 65 const AlarmSetting& alarm_setting,
66 std::span<const u8> application_parameter);
67 Result UpdateAlarmSetting(const AlarmSetting& alarm_setting,
68 std::span<const u8> application_parameter);
69 Result ListAlarmSettings(s32* out_count, std::span<AlarmSetting> out_alarms);
70 Result LoadApplicationParameter(u32* out_size, std::span<u8> out_application_parameter,
71 AlarmSettingId alarm_setting_id);
72 Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id);
73 Result Initialize(u64 aruid);
22 74
23private: 75private:
24 static constexpr std::size_t max_alarms = 8;
25
26 // This is nn::notification::AlarmSettingId
27 using AlarmSettingId = u16;
28 static_assert(sizeof(AlarmSettingId) == 0x2, "AlarmSettingId is an invalid size");
29
30 using ApplicationParameter = std::array<u8, 0x400>;
31 static_assert(sizeof(ApplicationParameter) == 0x400, "ApplicationParameter is an invalid size");
32
33 struct DailyAlarmSetting {
34 s8 hour;
35 s8 minute;
36 };
37 static_assert(sizeof(DailyAlarmSetting) == 0x2, "DailyAlarmSetting is an invalid size");
38
39 struct WeeklyScheduleAlarmSetting {
40 INSERT_PADDING_BYTES(0xA);
41 std::array<DailyAlarmSetting, 0x7> day_of_week;
42 };
43 static_assert(sizeof(WeeklyScheduleAlarmSetting) == 0x18,
44 "WeeklyScheduleAlarmSetting is an invalid size");
45
46 // This is nn::notification::AlarmSetting
47 struct AlarmSetting {
48 AlarmSettingId alarm_setting_id;
49 u8 kind;
50 u8 muted;
51 INSERT_PADDING_BYTES(0x4);
52 Common::UUID account_id;
53 u64 application_id;
54 INSERT_PADDING_BYTES(0x8);
55 WeeklyScheduleAlarmSetting schedule;
56 };
57 static_assert(sizeof(AlarmSetting) == 0x40, "AlarmSetting is an invalid size");
58
59 void RegisterAlarmSetting(HLERequestContext& ctx);
60 void UpdateAlarmSetting(HLERequestContext& ctx);
61 void ListAlarmSettings(HLERequestContext& ctx);
62 void LoadApplicationParameter(HLERequestContext& ctx);
63 void DeleteAlarmSetting(HLERequestContext& ctx);
64 void Initialize(HLERequestContext& ctx);
65
66 std::vector<AlarmSetting>::iterator GetAlarmFromId(AlarmSettingId alarm_setting_id); 76 std::vector<AlarmSetting>::iterator GetAlarmFromId(AlarmSettingId alarm_setting_id);
67
68 std::vector<AlarmSetting> alarms{}; 77 std::vector<AlarmSetting> alarms{};
69 AlarmSettingId last_alarm_setting_id{}; 78 AlarmSettingId last_alarm_setting_id{};
70}; 79};
71 80
81class INotificationServicesForApplication final
82 : public ServiceFramework<INotificationServicesForApplication> {
83public:
84 explicit INotificationServicesForApplication(Core::System& system_);
85 ~INotificationServicesForApplication() override;
86
87private:
88 Result RegisterAlarmSetting(Out<AlarmSettingId> out_alarm_setting_id,
89 InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
90 InBuffer<BufferAttr_HipcMapAlias> application_parameter);
91 Result UpdateAlarmSetting(InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
92 InBuffer<BufferAttr_HipcMapAlias> application_parameter);
93 Result ListAlarmSettings(Out<s32> out_count,
94 OutArray<AlarmSetting, BufferAttr_HipcMapAlias> out_alarms);
95 Result LoadApplicationParameter(Out<u32> out_size,
96 OutBuffer<BufferAttr_HipcMapAlias> out_application_parameter,
97 AlarmSettingId alarm_setting_id);
98 Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id);
99 Result Initialize(ClientAppletResourceUserId aruid);
100
101 NotificationServiceImpl impl;
102};
103
104class INotificationSystemEventAccessor;
105
106class INotificationServices final : public ServiceFramework<INotificationServices> {
107public:
108 explicit INotificationServices(Core::System& system_);
109 ~INotificationServices() override;
110
111private:
112 Result RegisterAlarmSetting(Out<AlarmSettingId> out_alarm_setting_id,
113 InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
114 InBuffer<BufferAttr_HipcMapAlias> application_parameter);
115 Result UpdateAlarmSetting(InLargeData<AlarmSetting, BufferAttr_HipcMapAlias> alarm_setting,
116 InBuffer<BufferAttr_HipcMapAlias> application_parameter);
117 Result ListAlarmSettings(Out<s32> out_count,
118 OutArray<AlarmSetting, BufferAttr_HipcMapAlias> out_alarms);
119 Result LoadApplicationParameter(Out<u32> out_size,
120 OutBuffer<BufferAttr_HipcMapAlias> out_application_parameter,
121 AlarmSettingId alarm_setting_id);
122 Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id);
123 Result Initialize(ClientAppletResourceUserId aruid);
124 Result OpenNotificationSystemEventAccessor(Out<SharedPointer<INotificationSystemEventAccessor>>
125 out_notification_system_event_accessor);
126 Result GetNotificationPresentationSetting(
127 Out<NotificationPresentationSetting> out_notification_presentation_setting,
128 NotificationChannel notification_channel);
129
130 NotificationServiceImpl impl;
131};
72} // namespace Service::Glue 132} // namespace Service::Glue