// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include #include "common/uuid.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" namespace Core { class System; } namespace Service::Glue { // This is nn::notification::AlarmSettingId using AlarmSettingId = u16; static_assert(sizeof(AlarmSettingId) == 0x2, "AlarmSettingId is an invalid size"); using ApplicationParameter = std::array; static_assert(sizeof(ApplicationParameter) == 0x400, "ApplicationParameter is an invalid size"); struct DailyAlarmSetting { s8 hour; s8 minute; }; static_assert(sizeof(DailyAlarmSetting) == 0x2, "DailyAlarmSetting is an invalid size"); struct WeeklyScheduleAlarmSetting { INSERT_PADDING_BYTES_NOINIT(0xA); std::array day_of_week; }; static_assert(sizeof(WeeklyScheduleAlarmSetting) == 0x18, "WeeklyScheduleAlarmSetting is an invalid size"); // This is nn::notification::AlarmSetting struct AlarmSetting { AlarmSettingId alarm_setting_id; u8 kind; u8 muted; INSERT_PADDING_BYTES_NOINIT(0x4); Common::UUID account_id; u64 application_id; INSERT_PADDING_BYTES_NOINIT(0x8); WeeklyScheduleAlarmSetting schedule; }; static_assert(sizeof(AlarmSetting) == 0x40, "AlarmSetting is an invalid size"); enum class NotificationChannel : u8 { Unknown0 = 0, }; struct NotificationPresentationSetting { INSERT_PADDING_BYTES_NOINIT(0x10); }; static_assert(sizeof(NotificationPresentationSetting) == 0x10, "NotificationPresentationSetting is an invalid size"); class NotificationServiceImpl { public: Result RegisterAlarmSetting(AlarmSettingId* out_alarm_setting_id, const AlarmSetting& alarm_setting, std::span application_parameter); Result UpdateAlarmSetting(const AlarmSetting& alarm_setting, std::span application_parameter); Result ListAlarmSettings(s32* out_count, std::span out_alarms); Result LoadApplicationParameter(u32* out_size, std::span out_application_parameter, AlarmSettingId alarm_setting_id); Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id); Result Initialize(u64 aruid); private: std::vector::iterator GetAlarmFromId(AlarmSettingId alarm_setting_id); std::vector alarms{}; AlarmSettingId last_alarm_setting_id{}; }; class INotificationServicesForApplication final : public ServiceFramework { public: explicit INotificationServicesForApplication(Core::System& system_); ~INotificationServicesForApplication() override; private: Result RegisterAlarmSetting(Out out_alarm_setting_id, InLargeData alarm_setting, InBuffer application_parameter); Result UpdateAlarmSetting(InLargeData alarm_setting, InBuffer application_parameter); Result ListAlarmSettings(Out out_count, OutArray out_alarms); Result LoadApplicationParameter(Out out_size, OutBuffer out_application_parameter, AlarmSettingId alarm_setting_id); Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id); Result Initialize(ClientAppletResourceUserId aruid); NotificationServiceImpl impl; }; class INotificationSystemEventAccessor; class INotificationServices final : public ServiceFramework { public: explicit INotificationServices(Core::System& system_); ~INotificationServices() override; private: Result RegisterAlarmSetting(Out out_alarm_setting_id, InLargeData alarm_setting, InBuffer application_parameter); Result UpdateAlarmSetting(InLargeData alarm_setting, InBuffer application_parameter); Result ListAlarmSettings(Out out_count, OutArray out_alarms); Result LoadApplicationParameter(Out out_size, OutBuffer out_application_parameter, AlarmSettingId alarm_setting_id); Result DeleteAlarmSetting(AlarmSettingId alarm_setting_id); Result Initialize(ClientAppletResourceUserId aruid); Result OpenNotificationSystemEventAccessor(Out> out_notification_system_event_accessor); Result GetNotificationPresentationSetting( Out out_notification_presentation_setting, NotificationChannel notification_channel); NotificationServiceImpl impl; }; } // namespace Service::Glue