summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/am/frontend/applets.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/am/frontend/applets.h')
-rw-r--r--src/core/hle/service/am/frontend/applets.h146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/core/hle/service/am/frontend/applets.h b/src/core/hle/service/am/frontend/applets.h
new file mode 100644
index 000000000..1e1fd28b8
--- /dev/null
+++ b/src/core/hle/service/am/frontend/applets.h
@@ -0,0 +1,146 @@
+// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <memory>
+#include <queue>
+
+#include "common/swap.h"
+#include "core/hle/service/am/applet.h"
+
+union Result;
+
+namespace Core {
+class System;
+}
+
+namespace Core::Frontend {
+class CabinetApplet;
+class ControllerApplet;
+class ECommerceApplet;
+class ErrorApplet;
+class MiiEditApplet;
+class ParentalControlsApplet;
+class PhotoViewerApplet;
+class ProfileSelectApplet;
+class SoftwareKeyboardApplet;
+class WebBrowserApplet;
+} // namespace Core::Frontend
+
+namespace Kernel {
+class KernelCore;
+class KEvent;
+class KReadableEvent;
+} // namespace Kernel
+
+namespace Service::NFP {
+enum class CabinetMode : u8;
+} // namespace Service::NFP
+
+namespace Service::AM {
+
+class IStorage;
+
+namespace Frontend {
+
+class FrontendApplet {
+public:
+ explicit FrontendApplet(Core::System& system_, std::shared_ptr<Applet> applet_,
+ LibraryAppletMode applet_mode_);
+ virtual ~FrontendApplet();
+
+ virtual void Initialize();
+
+ virtual Result GetStatus() const = 0;
+ virtual void ExecuteInteractive() = 0;
+ virtual void Execute() = 0;
+ virtual Result RequestExit() = 0;
+
+ LibraryAppletMode GetLibraryAppletMode() const {
+ return applet_mode;
+ }
+
+ bool IsInitialized() const {
+ return initialized;
+ }
+
+protected:
+ std::shared_ptr<IStorage> PopInData();
+ std::shared_ptr<IStorage> PopInteractiveInData();
+ void PushOutData(std::shared_ptr<IStorage> storage);
+ void PushInteractiveOutData(std::shared_ptr<IStorage> storage);
+ void Exit();
+
+protected:
+ Core::System& system;
+ CommonArguments common_args{};
+ std::weak_ptr<Applet> applet{};
+ LibraryAppletMode applet_mode{};
+ bool initialized{false};
+};
+
+struct FrontendAppletSet {
+ using CabinetApplet = std::unique_ptr<Core::Frontend::CabinetApplet>;
+ using ControllerApplet = std::unique_ptr<Core::Frontend::ControllerApplet>;
+ using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>;
+ using MiiEdit = std::unique_ptr<Core::Frontend::MiiEditApplet>;
+ using ParentalControlsApplet = std::unique_ptr<Core::Frontend::ParentalControlsApplet>;
+ using PhotoViewer = std::unique_ptr<Core::Frontend::PhotoViewerApplet>;
+ using ProfileSelect = std::unique_ptr<Core::Frontend::ProfileSelectApplet>;
+ using SoftwareKeyboard = std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet>;
+ using WebBrowser = std::unique_ptr<Core::Frontend::WebBrowserApplet>;
+
+ FrontendAppletSet();
+ FrontendAppletSet(CabinetApplet cabinet_applet, ControllerApplet controller_applet,
+ ErrorApplet error_applet, MiiEdit mii_edit_,
+ ParentalControlsApplet parental_controls_applet, PhotoViewer photo_viewer_,
+ ProfileSelect profile_select_, SoftwareKeyboard software_keyboard_,
+ WebBrowser web_browser_);
+ ~FrontendAppletSet();
+
+ FrontendAppletSet(const FrontendAppletSet&) = delete;
+ FrontendAppletSet& operator=(const FrontendAppletSet&) = delete;
+
+ FrontendAppletSet(FrontendAppletSet&&) noexcept;
+ FrontendAppletSet& operator=(FrontendAppletSet&&) noexcept;
+
+ CabinetApplet cabinet;
+ ControllerApplet controller;
+ ErrorApplet error;
+ MiiEdit mii_edit;
+ ParentalControlsApplet parental_controls;
+ PhotoViewer photo_viewer;
+ ProfileSelect profile_select;
+ SoftwareKeyboard software_keyboard;
+ WebBrowser web_browser;
+};
+
+class FrontendAppletHolder {
+public:
+ explicit FrontendAppletHolder(Core::System& system_);
+ ~FrontendAppletHolder();
+
+ const FrontendAppletSet& GetFrontendAppletSet() const;
+ NFP::CabinetMode GetCabinetMode() const;
+ AppletId GetCurrentAppletId() const;
+
+ void SetFrontendAppletSet(FrontendAppletSet set);
+ void SetCabinetMode(NFP::CabinetMode mode);
+ void SetCurrentAppletId(AppletId applet_id);
+ void SetDefaultAppletsIfMissing();
+ void ClearAll();
+
+ std::shared_ptr<FrontendApplet> GetApplet(std::shared_ptr<Applet> applet, AppletId id,
+ LibraryAppletMode mode) const;
+
+private:
+ AppletId current_applet_id{};
+ NFP::CabinetMode cabinet_mode{};
+
+ FrontendAppletSet frontend;
+ Core::System& system;
+};
+
+} // namespace Frontend
+} // namespace Service::AM