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