diff options
| author | 2019-03-11 19:32:59 -0400 | |
|---|---|---|
| committer | 2019-04-17 11:35:24 -0400 | |
| commit | e51d33f0cee74f9fbd58439b411e6d3fef57576d (patch) | |
| tree | 1e7a76599d9d831ae71b719fd0da36f7bd64eab6 /src | |
| parent | Merge pull request #2315 from ReinUsesLisp/severity-decompiler (diff) | |
| download | yuzu-e51d33f0cee74f9fbd58439b411e6d3fef57576d.tar.gz yuzu-e51d33f0cee74f9fbd58439b411e6d3fef57576d.tar.xz yuzu-e51d33f0cee74f9fbd58439b411e6d3fef57576d.zip | |
applets: Add AppletManager class to control lifetime
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/am/applets/applets.cpp | 82 | ||||
| -rw-r--r-- | src/core/hle/service/am/applets/applets.h | 55 |
2 files changed, 137 insertions, 0 deletions
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp index a6064c63f..7f70b10df 100644 --- a/src/core/hle/service/am/applets/applets.cpp +++ b/src/core/hle/service/am/applets/applets.cpp | |||
| @@ -5,11 +5,21 @@ | |||
| 5 | #include <cstring> | 5 | #include <cstring> |
| 6 | #include "common/assert.h" | 6 | #include "common/assert.h" |
| 7 | #include "core/core.h" | 7 | #include "core/core.h" |
| 8 | #include "core/frontend/applets/error.h" | ||
| 9 | #include "core/frontend/applets/general_frontend.h" | ||
| 10 | #include "core/frontend/applets/profile_select.h" | ||
| 11 | #include "core/frontend/applets/software_keyboard.h" | ||
| 12 | #include "core/frontend/applets/web_browser.h" | ||
| 8 | #include "core/hle/kernel/readable_event.h" | 13 | #include "core/hle/kernel/readable_event.h" |
| 9 | #include "core/hle/kernel/server_session.h" | 14 | #include "core/hle/kernel/server_session.h" |
| 10 | #include "core/hle/kernel/writable_event.h" | 15 | #include "core/hle/kernel/writable_event.h" |
| 11 | #include "core/hle/service/am/am.h" | 16 | #include "core/hle/service/am/am.h" |
| 12 | #include "core/hle/service/am/applets/applets.h" | 17 | #include "core/hle/service/am/applets/applets.h" |
| 18 | #include "core/hle/service/am/applets/error.h" | ||
| 19 | #include "core/hle/service/am/applets/general_backend.h" | ||
| 20 | #include "core/hle/service/am/applets/profile_select.h" | ||
| 21 | #include "core/hle/service/am/applets/software_keyboard.h" | ||
| 22 | #include "core/hle/service/am/applets/web_browser.h" | ||
| 13 | 23 | ||
| 14 | namespace Service::AM::Applets { | 24 | namespace Service::AM::Applets { |
| 15 | 25 | ||
| @@ -111,4 +121,76 @@ void Applet::Initialize() { | |||
| 111 | initialized = true; | 121 | initialized = true; |
| 112 | } | 122 | } |
| 113 | 123 | ||
| 124 | AppletManager::AppletManager() = default; | ||
| 125 | |||
| 126 | AppletManager::~AppletManager() = default; | ||
| 127 | |||
| 128 | void AppletManager::SetAppletFrontendSet(AppletFrontendSet set) { | ||
| 129 | if (set.error != nullptr) | ||
| 130 | frontend.error = std::move(set.error); | ||
| 131 | if (set.photo_viewer != nullptr) | ||
| 132 | frontend.photo_viewer = std::move(set.photo_viewer); | ||
| 133 | if (set.profile_select != nullptr) | ||
| 134 | frontend.profile_select = std::move(set.profile_select); | ||
| 135 | if (set.software_keyboard != nullptr) | ||
| 136 | frontend.software_keyboard = std::move(set.software_keyboard); | ||
| 137 | if (set.web_browser != nullptr) | ||
| 138 | frontend.web_browser = std::move(set.web_browser); | ||
| 139 | } | ||
| 140 | |||
| 141 | void AppletManager::SetDefaultAppletFrontendSet() { | ||
| 142 | frontend.error = std::make_unique<Core::Frontend::DefaultErrorApplet>(); | ||
| 143 | frontend.photo_viewer = std::make_unique<Core::Frontend::DefaultPhotoViewerApplet>(); | ||
| 144 | frontend.profile_select = std::make_unique<Core::Frontend::DefaultProfileSelectApplet>(); | ||
| 145 | frontend.software_keyboard = std::make_unique<Core::Frontend::DefaultSoftwareKeyboardApplet>(); | ||
| 146 | frontend.web_browser = std::make_unique<Core::Frontend::DefaultWebBrowserApplet>(); | ||
| 147 | } | ||
| 148 | |||
| 149 | void AppletManager::SetDefaultAppletsIfMissing() { | ||
| 150 | if (frontend.error == nullptr) { | ||
| 151 | frontend.error = std::make_unique<Core::Frontend::DefaultErrorApplet>(); | ||
| 152 | } | ||
| 153 | |||
| 154 | if (frontend.photo_viewer == nullptr) { | ||
| 155 | frontend.photo_viewer = std::make_unique<Core::Frontend::DefaultPhotoViewerApplet>(); | ||
| 156 | } | ||
| 157 | |||
| 158 | if (frontend.profile_select == nullptr) { | ||
| 159 | frontend.profile_select = std::make_unique<Core::Frontend::DefaultProfileSelectApplet>(); | ||
| 160 | } | ||
| 161 | |||
| 162 | if (frontend.software_keyboard == nullptr) { | ||
| 163 | frontend.software_keyboard = | ||
| 164 | std::make_unique<Core::Frontend::DefaultSoftwareKeyboardApplet>(); | ||
| 165 | } | ||
| 166 | |||
| 167 | if (frontend.web_browser == nullptr) { | ||
| 168 | frontend.web_browser = std::make_unique<Core::Frontend::DefaultWebBrowserApplet>(); | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | void AppletManager::ClearAll() { | ||
| 173 | frontend = {}; | ||
| 174 | } | ||
| 175 | |||
| 176 | std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id) const { | ||
| 177 | switch (id) { | ||
| 178 | case AppletId::Error: | ||
| 179 | return std::make_shared<Error>(*frontend.error); | ||
| 180 | case AppletId::ProfileSelect: | ||
| 181 | return std::make_shared<ProfileSelect>(*frontend.profile_select); | ||
| 182 | case AppletId::SoftwareKeyboard: | ||
| 183 | return std::make_shared<SoftwareKeyboard>(*frontend.software_keyboard); | ||
| 184 | case AppletId::PhotoViewer: | ||
| 185 | return std::make_shared<PhotoViewer>(*frontend.photo_viewer); | ||
| 186 | case AppletId::LibAppletOff: | ||
| 187 | return std::make_shared<WebBrowser>(*frontend.web_browser); | ||
| 188 | default: | ||
| 189 | UNIMPLEMENTED_MSG( | ||
| 190 | "No backend implementation exists for applet_id={:02X}! Falling back to stub applet.", | ||
| 191 | static_cast<u8>(id)); | ||
| 192 | return std::make_shared<StubApplet>(); | ||
| 193 | } | ||
| 194 | } | ||
| 195 | |||
| 114 | } // namespace Service::AM::Applets | 196 | } // namespace Service::AM::Applets |
diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h index 37424c379..7f932672c 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h | |||
| @@ -12,12 +12,43 @@ | |||
| 12 | 12 | ||
| 13 | union ResultCode; | 13 | union ResultCode; |
| 14 | 14 | ||
| 15 | namespace Core::Frontend { | ||
| 16 | class ErrorApplet; | ||
| 17 | class PhotoViewerApplet; | ||
| 18 | class ProfileSelectApplet; | ||
| 19 | class SoftwareKeyboardApplet; | ||
| 20 | class WebBrowserApplet; | ||
| 21 | } // namespace Core::Frontend | ||
| 22 | |||
| 15 | namespace Service::AM { | 23 | namespace Service::AM { |
| 16 | 24 | ||
| 17 | class IStorage; | 25 | class IStorage; |
| 18 | 26 | ||
| 19 | namespace Applets { | 27 | namespace Applets { |
| 20 | 28 | ||
| 29 | enum class AppletId : u32 { | ||
| 30 | OverlayDisplay = 0x02, | ||
| 31 | QLaunch = 0x03, | ||
| 32 | Starter = 0x04, | ||
| 33 | Auth = 0x0A, | ||
| 34 | Cabinet = 0x0B, | ||
| 35 | Controller = 0x0C, | ||
| 36 | DataErase = 0x0D, | ||
| 37 | Error = 0x0E, | ||
| 38 | NetConnect = 0x0F, | ||
| 39 | ProfileSelect = 0x10, | ||
| 40 | SoftwareKeyboard = 0x11, | ||
| 41 | MiiEdit = 0x12, | ||
| 42 | LibAppletWeb = 0x13, | ||
| 43 | LibAppletShop = 0x14, | ||
| 44 | PhotoViewer = 0x15, | ||
| 45 | Settings = 0x16, | ||
| 46 | LibAppletOff = 0x17, | ||
| 47 | LibAppletWhitelisted = 0x18, | ||
| 48 | LibAppletAuth = 0x19, | ||
| 49 | MyPage = 0x1A, | ||
| 50 | }; | ||
| 51 | |||
| 21 | class AppletDataBroker final { | 52 | class AppletDataBroker final { |
| 22 | public: | 53 | public: |
| 23 | AppletDataBroker(); | 54 | AppletDataBroker(); |
| @@ -105,5 +136,29 @@ protected: | |||
| 105 | bool initialized = false; | 136 | bool initialized = false; |
| 106 | }; | 137 | }; |
| 107 | 138 | ||
| 139 | struct AppletFrontendSet { | ||
| 140 | std::unique_ptr<Core::Frontend::ErrorApplet> error; | ||
| 141 | std::unique_ptr<Core::Frontend::PhotoViewerApplet> photo_viewer; | ||
| 142 | std::unique_ptr<Core::Frontend::ProfileSelectApplet> profile_select; | ||
| 143 | std::unique_ptr<Core::Frontend::SoftwareKeyboardApplet> software_keyboard; | ||
| 144 | std::unique_ptr<Core::Frontend::WebBrowserApplet> web_browser; | ||
| 145 | }; | ||
| 146 | |||
| 147 | class AppletManager { | ||
| 148 | public: | ||
| 149 | AppletManager(); | ||
| 150 | ~AppletManager(); | ||
| 151 | |||
| 152 | void SetAppletFrontendSet(AppletFrontendSet set); | ||
| 153 | void SetDefaultAppletFrontendSet(); | ||
| 154 | void SetDefaultAppletsIfMissing(); | ||
| 155 | void ClearAll(); | ||
| 156 | |||
| 157 | std::shared_ptr<Applet> GetApplet(AppletId id) const; | ||
| 158 | |||
| 159 | private: | ||
| 160 | AppletFrontendSet frontend; | ||
| 161 | }; | ||
| 162 | |||
| 108 | } // namespace Applets | 163 | } // namespace Applets |
| 109 | } // namespace Service::AM | 164 | } // namespace Service::AM |