mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-09 16:32:44 +01:00
applets: Add AppletManager class to control lifetime
This commit is contained in:
parent
0cfbd3325b
commit
e51d33f0ce
2 changed files with 137 additions and 0 deletions
|
@ -5,11 +5,21 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "core/core.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/readable_event.h"
|
||||||
#include "core/hle/kernel/server_session.h"
|
#include "core/hle/kernel/server_session.h"
|
||||||
#include "core/hle/kernel/writable_event.h"
|
#include "core/hle/kernel/writable_event.h"
|
||||||
#include "core/hle/service/am/am.h"
|
#include "core/hle/service/am/am.h"
|
||||||
#include "core/hle/service/am/applets/applets.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 {
|
namespace Service::AM::Applets {
|
||||||
|
|
||||||
|
@ -111,4 +121,76 @@ void Applet::Initialize() {
|
||||||
initialized = true;
|
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
|
} // namespace Service::AM::Applets
|
||||||
|
|
|
@ -12,12 +12,43 @@
|
||||||
|
|
||||||
union ResultCode;
|
union ResultCode;
|
||||||
|
|
||||||
|
namespace Core::Frontend {
|
||||||
|
class ErrorApplet;
|
||||||
|
class PhotoViewerApplet;
|
||||||
|
class ProfileSelectApplet;
|
||||||
|
class SoftwareKeyboardApplet;
|
||||||
|
class WebBrowserApplet;
|
||||||
|
} // namespace Core::Frontend
|
||||||
|
|
||||||
namespace Service::AM {
|
namespace Service::AM {
|
||||||
|
|
||||||
class IStorage;
|
class IStorage;
|
||||||
|
|
||||||
namespace Applets {
|
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 {
|
class AppletDataBroker final {
|
||||||
public:
|
public:
|
||||||
AppletDataBroker();
|
AppletDataBroker();
|
||||||
|
@ -105,5 +136,29 @@ protected:
|
||||||
bool initialized = false;
|
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 Applets
|
||||||
} // namespace Service::AM
|
} // namespace Service::AM
|
||||||
|
|
Loading…
Reference in a new issue