208 lines
5.8 KiB
C++
208 lines
5.8 KiB
C++
// Copyright 2018 yuzu emulator team
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <memory>
|
|
#include <queue>
|
|
#include "common/swap.h"
|
|
#include "core/hle/kernel/object.h"
|
|
#include "core/hle/kernel/writable_event.h"
|
|
|
|
union ResultCode;
|
|
|
|
namespace Core {
|
|
class System;
|
|
}
|
|
|
|
namespace Core::Frontend {
|
|
class ECommerceApplet;
|
|
class ErrorApplet;
|
|
class ParentalControlsApplet;
|
|
class PhotoViewerApplet;
|
|
class ProfileSelectApplet;
|
|
class SoftwareKeyboardApplet;
|
|
class WebBrowserApplet;
|
|
} // namespace Core::Frontend
|
|
|
|
namespace Kernel {
|
|
class KernelCore;
|
|
}
|
|
|
|
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:
|
|
explicit AppletDataBroker(Kernel::KernelCore& kernel_);
|
|
~AppletDataBroker();
|
|
|
|
struct RawChannelData {
|
|
std::vector<std::vector<u8>> normal;
|
|
std::vector<std::vector<u8>> interactive;
|
|
};
|
|
|
|
// Retrieves but does not pop the data sent to applet.
|
|
RawChannelData PeekDataToAppletForDebug() const;
|
|
|
|
std::shared_ptr<IStorage> PopNormalDataToGame();
|
|
std::shared_ptr<IStorage> PopNormalDataToApplet();
|
|
|
|
std::shared_ptr<IStorage> PopInteractiveDataToGame();
|
|
std::shared_ptr<IStorage> PopInteractiveDataToApplet();
|
|
|
|
void PushNormalDataFromGame(std::shared_ptr<IStorage>&& storage);
|
|
void PushNormalDataFromApplet(std::shared_ptr<IStorage>&& storage);
|
|
|
|
void PushInteractiveDataFromGame(std::shared_ptr<IStorage>&& storage);
|
|
void PushInteractiveDataFromApplet(std::shared_ptr<IStorage>&& storage);
|
|
|
|
void SignalStateChanged() const;
|
|
|
|
std::shared_ptr<Kernel::ReadableEvent> GetNormalDataEvent() const;
|
|
std::shared_ptr<Kernel::ReadableEvent> GetInteractiveDataEvent() const;
|
|
std::shared_ptr<Kernel::ReadableEvent> GetStateChangedEvent() const;
|
|
|
|
private:
|
|
// Queues are named from applet's perspective
|
|
|
|
// PopNormalDataToApplet and PushNormalDataFromGame
|
|
std::deque<std::shared_ptr<IStorage>> in_channel;
|
|
|
|
// PopNormalDataToGame and PushNormalDataFromApplet
|
|
std::deque<std::shared_ptr<IStorage>> out_channel;
|
|
|
|
// PopInteractiveDataToApplet and PushInteractiveDataFromGame
|
|
std::deque<std::shared_ptr<IStorage>> in_interactive_channel;
|
|
|
|
// PopInteractiveDataToGame and PushInteractiveDataFromApplet
|
|
std::deque<std::shared_ptr<IStorage>> out_interactive_channel;
|
|
|
|
Kernel::EventPair state_changed_event;
|
|
|
|
// Signaled on PushNormalDataFromApplet
|
|
Kernel::EventPair pop_out_data_event;
|
|
|
|
// Signaled on PushInteractiveDataFromApplet
|
|
Kernel::EventPair pop_interactive_out_data_event;
|
|
};
|
|
|
|
class Applet {
|
|
public:
|
|
explicit Applet(Kernel::KernelCore& kernel_);
|
|
virtual ~Applet();
|
|
|
|
virtual void Initialize();
|
|
|
|
virtual bool TransactionComplete() const = 0;
|
|
virtual ResultCode GetStatus() const = 0;
|
|
virtual void ExecuteInteractive() = 0;
|
|
virtual void Execute() = 0;
|
|
|
|
bool IsInitialized() const {
|
|
return initialized;
|
|
}
|
|
|
|
AppletDataBroker& GetBroker() {
|
|
return broker;
|
|
}
|
|
|
|
const AppletDataBroker& GetBroker() const {
|
|
return broker;
|
|
}
|
|
|
|
protected:
|
|
struct CommonArguments {
|
|
u32_le arguments_version;
|
|
u32_le size;
|
|
u32_le library_version;
|
|
u32_le theme_color;
|
|
u8 play_startup_sound;
|
|
u64_le system_tick;
|
|
};
|
|
static_assert(sizeof(CommonArguments) == 0x20, "CommonArguments has incorrect size.");
|
|
|
|
CommonArguments common_args{};
|
|
AppletDataBroker broker;
|
|
bool initialized = false;
|
|
};
|
|
|
|
struct AppletFrontendSet {
|
|
using ParentalControlsApplet = std::unique_ptr<Core::Frontend::ParentalControlsApplet>;
|
|
using ErrorApplet = std::unique_ptr<Core::Frontend::ErrorApplet>;
|
|
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>;
|
|
using ECommerceApplet = std::unique_ptr<Core::Frontend::ECommerceApplet>;
|
|
|
|
AppletFrontendSet();
|
|
AppletFrontendSet(ParentalControlsApplet parental_controls, ErrorApplet error,
|
|
PhotoViewer photo_viewer, ProfileSelect profile_select,
|
|
SoftwareKeyboard software_keyboard, WebBrowser web_browser,
|
|
ECommerceApplet e_commerce);
|
|
~AppletFrontendSet();
|
|
|
|
AppletFrontendSet(const AppletFrontendSet&) = delete;
|
|
AppletFrontendSet& operator=(const AppletFrontendSet&) = delete;
|
|
|
|
AppletFrontendSet(AppletFrontendSet&&) noexcept;
|
|
AppletFrontendSet& operator=(AppletFrontendSet&&) noexcept;
|
|
|
|
ParentalControlsApplet parental_controls;
|
|
ErrorApplet error;
|
|
PhotoViewer photo_viewer;
|
|
ProfileSelect profile_select;
|
|
SoftwareKeyboard software_keyboard;
|
|
WebBrowser web_browser;
|
|
ECommerceApplet e_commerce;
|
|
};
|
|
|
|
class AppletManager {
|
|
public:
|
|
explicit AppletManager(Core::System& system_);
|
|
~AppletManager();
|
|
|
|
const AppletFrontendSet& GetAppletFrontendSet() const;
|
|
|
|
void SetAppletFrontendSet(AppletFrontendSet set);
|
|
void SetDefaultAppletFrontendSet();
|
|
void SetDefaultAppletsIfMissing();
|
|
void ClearAll();
|
|
|
|
std::shared_ptr<Applet> GetApplet(AppletId id) const;
|
|
|
|
private:
|
|
AppletFrontendSet frontend;
|
|
Core::System& system;
|
|
};
|
|
|
|
} // namespace Applets
|
|
} // namespace Service::AM
|