applets: Add AppletManager class to control lifetime
This commit is contained in:
		| @@ -5,11 +5,21 @@ | ||||
| #include <cstring> | ||||
| #include "common/assert.h" | ||||
| #include "core/core.h" | ||||
| #include "core/frontend/applets/error.h" | ||||
| #include "core/frontend/applets/general_frontend.h" | ||||
| #include "core/frontend/applets/profile_select.h" | ||||
| #include "core/frontend/applets/software_keyboard.h" | ||||
| #include "core/frontend/applets/web_browser.h" | ||||
| #include "core/hle/kernel/readable_event.h" | ||||
| #include "core/hle/kernel/server_session.h" | ||||
| #include "core/hle/kernel/writable_event.h" | ||||
| #include "core/hle/service/am/am.h" | ||||
| #include "core/hle/service/am/applets/applets.h" | ||||
| #include "core/hle/service/am/applets/error.h" | ||||
| #include "core/hle/service/am/applets/general_backend.h" | ||||
| #include "core/hle/service/am/applets/profile_select.h" | ||||
| #include "core/hle/service/am/applets/software_keyboard.h" | ||||
| #include "core/hle/service/am/applets/web_browser.h" | ||||
|  | ||||
| namespace Service::AM::Applets { | ||||
|  | ||||
| @@ -111,4 +121,76 @@ void Applet::Initialize() { | ||||
|     initialized = true; | ||||
| } | ||||
|  | ||||
| AppletManager::AppletManager() = default; | ||||
|  | ||||
| AppletManager::~AppletManager() = default; | ||||
|  | ||||
| void AppletManager::SetAppletFrontendSet(AppletFrontendSet set) { | ||||
|     if (set.error != nullptr) | ||||
|         frontend.error = std::move(set.error); | ||||
|     if (set.photo_viewer != nullptr) | ||||
|         frontend.photo_viewer = std::move(set.photo_viewer); | ||||
|     if (set.profile_select != nullptr) | ||||
|         frontend.profile_select = std::move(set.profile_select); | ||||
|     if (set.software_keyboard != nullptr) | ||||
|         frontend.software_keyboard = std::move(set.software_keyboard); | ||||
|     if (set.web_browser != nullptr) | ||||
|         frontend.web_browser = std::move(set.web_browser); | ||||
| } | ||||
|  | ||||
| void AppletManager::SetDefaultAppletFrontendSet() { | ||||
|     frontend.error = std::make_unique<Core::Frontend::DefaultErrorApplet>(); | ||||
|     frontend.photo_viewer = std::make_unique<Core::Frontend::DefaultPhotoViewerApplet>(); | ||||
|     frontend.profile_select = std::make_unique<Core::Frontend::DefaultProfileSelectApplet>(); | ||||
|     frontend.software_keyboard = std::make_unique<Core::Frontend::DefaultSoftwareKeyboardApplet>(); | ||||
|     frontend.web_browser = std::make_unique<Core::Frontend::DefaultWebBrowserApplet>(); | ||||
| } | ||||
|  | ||||
| void AppletManager::SetDefaultAppletsIfMissing() { | ||||
|     if (frontend.error == nullptr) { | ||||
|         frontend.error = std::make_unique<Core::Frontend::DefaultErrorApplet>(); | ||||
|     } | ||||
|  | ||||
|     if (frontend.photo_viewer == nullptr) { | ||||
|         frontend.photo_viewer = std::make_unique<Core::Frontend::DefaultPhotoViewerApplet>(); | ||||
|     } | ||||
|  | ||||
|     if (frontend.profile_select == nullptr) { | ||||
|         frontend.profile_select = std::make_unique<Core::Frontend::DefaultProfileSelectApplet>(); | ||||
|     } | ||||
|  | ||||
|     if (frontend.software_keyboard == nullptr) { | ||||
|         frontend.software_keyboard = | ||||
|             std::make_unique<Core::Frontend::DefaultSoftwareKeyboardApplet>(); | ||||
|     } | ||||
|  | ||||
|     if (frontend.web_browser == nullptr) { | ||||
|         frontend.web_browser = std::make_unique<Core::Frontend::DefaultWebBrowserApplet>(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void AppletManager::ClearAll() { | ||||
|     frontend = {}; | ||||
| } | ||||
|  | ||||
| std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id) const { | ||||
|     switch (id) { | ||||
|     case AppletId::Error: | ||||
|         return std::make_shared<Error>(*frontend.error); | ||||
|     case AppletId::ProfileSelect: | ||||
|         return std::make_shared<ProfileSelect>(*frontend.profile_select); | ||||
|     case AppletId::SoftwareKeyboard: | ||||
|         return std::make_shared<SoftwareKeyboard>(*frontend.software_keyboard); | ||||
|     case AppletId::PhotoViewer: | ||||
|         return std::make_shared<PhotoViewer>(*frontend.photo_viewer); | ||||
|     case AppletId::LibAppletOff: | ||||
|         return std::make_shared<WebBrowser>(*frontend.web_browser); | ||||
|     default: | ||||
|         UNIMPLEMENTED_MSG( | ||||
|             "No backend implementation exists for applet_id={:02X}! Falling back to stub applet.", | ||||
|             static_cast<u8>(id)); | ||||
|         return std::make_shared<StubApplet>(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| } // namespace Service::AM::Applets | ||||
|   | ||||
| @@ -12,12 +12,43 @@ | ||||
|  | ||||
| union ResultCode; | ||||
|  | ||||
| namespace Core::Frontend { | ||||
| class ErrorApplet; | ||||
| class PhotoViewerApplet; | ||||
| class ProfileSelectApplet; | ||||
| class SoftwareKeyboardApplet; | ||||
| class WebBrowserApplet; | ||||
| } // namespace Core::Frontend | ||||
|  | ||||
| namespace Service::AM { | ||||
|  | ||||
| class IStorage; | ||||
|  | ||||
| namespace Applets { | ||||
|  | ||||
| enum class AppletId : u32 { | ||||
|     OverlayDisplay = 0x02, | ||||
|     QLaunch = 0x03, | ||||
|     Starter = 0x04, | ||||
|     Auth = 0x0A, | ||||
|     Cabinet = 0x0B, | ||||
|     Controller = 0x0C, | ||||
|     DataErase = 0x0D, | ||||
|     Error = 0x0E, | ||||
|     NetConnect = 0x0F, | ||||
|     ProfileSelect = 0x10, | ||||
|     SoftwareKeyboard = 0x11, | ||||
|     MiiEdit = 0x12, | ||||
|     LibAppletWeb = 0x13, | ||||
|     LibAppletShop = 0x14, | ||||
|     PhotoViewer = 0x15, | ||||
|     Settings = 0x16, | ||||
|     LibAppletOff = 0x17, | ||||
|     LibAppletWhitelisted = 0x18, | ||||
|     LibAppletAuth = 0x19, | ||||
|     MyPage = 0x1A, | ||||
| }; | ||||
|  | ||||
| class AppletDataBroker final { | ||||
| public: | ||||
|     AppletDataBroker(); | ||||
| @@ -105,5 +136,29 @@ protected: | ||||
|     bool initialized = false; | ||||
| }; | ||||
|  | ||||
| struct AppletFrontendSet { | ||||
|     std::unique_ptr<Core::Frontend::ErrorApplet> error; | ||||
|     std::unique_ptr<Core::Frontend::PhotoViewerApplet> photo_viewer; | ||||
|     std::unique_ptr<Core::Frontend::ProfileSelectApplet> profile_select; | ||||
|     std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet> software_keyboard; | ||||
|     std::unique_ptr<Core::Frontend::WebBrowserApplet> web_browser; | ||||
| }; | ||||
|  | ||||
| class AppletManager { | ||||
| public: | ||||
|     AppletManager(); | ||||
|     ~AppletManager(); | ||||
|  | ||||
|     void SetAppletFrontendSet(AppletFrontendSet set); | ||||
|     void SetDefaultAppletFrontendSet(); | ||||
|     void SetDefaultAppletsIfMissing(); | ||||
|     void ClearAll(); | ||||
|  | ||||
|     std::shared_ptr<Applet> GetApplet(AppletId id) const; | ||||
|  | ||||
| private: | ||||
|     AppletFrontendSet frontend; | ||||
| }; | ||||
|  | ||||
| } // namespace Applets | ||||
| } // namespace Service::AM | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zach Hilman
					Zach Hilman