mirror of https://git.suyu.dev/suyu/suyu
general_frontend: Add documentation for parental controls and ecommerce applets
This commit is contained in:
parent
73dcb13619
commit
01ff38cca8
|
@ -60,10 +60,11 @@ DefaultECommerceApplet::~DefaultECommerceApplet() = default;
|
||||||
void DefaultECommerceApplet::ShowApplicationInformation(
|
void DefaultECommerceApplet::ShowApplicationInformation(
|
||||||
std::function<void()> finished, u64 title_id, std::optional<u128> user_id,
|
std::function<void()> finished, u64 title_id, std::optional<u128> user_id,
|
||||||
std::optional<bool> full_display, std::optional<std::string> extra_parameter) {
|
std::optional<bool> full_display, std::optional<std::string> extra_parameter) {
|
||||||
|
const auto value = user_id.value_or(u128{});
|
||||||
LOG_INFO(Service_AM,
|
LOG_INFO(Service_AM,
|
||||||
"Application requested frontend show application information for EShop, "
|
"Application requested frontend show application information for EShop, "
|
||||||
"title_id={:016X}, user_id={:016X}{:016X}, full_display={}, extra_parameter={}",
|
"title_id={:016X}, user_id={:016X}{:016X}, full_display={}, extra_parameter={}",
|
||||||
title_id, user_id.value_or(u128{})[1], user_id.value_or(u128{})[0],
|
title_id, value[1], value[0],
|
||||||
full_display.has_value() ? fmt::format("{}", *full_display) : "null",
|
full_display.has_value() ? fmt::format("{}", *full_display) : "null",
|
||||||
extra_parameter.value_or("null"));
|
extra_parameter.value_or("null"));
|
||||||
finished();
|
finished();
|
||||||
|
@ -72,30 +73,33 @@ void DefaultECommerceApplet::ShowApplicationInformation(
|
||||||
void DefaultECommerceApplet::ShowAddOnContentList(std::function<void()> finished, u64 title_id,
|
void DefaultECommerceApplet::ShowAddOnContentList(std::function<void()> finished, u64 title_id,
|
||||||
std::optional<u128> user_id,
|
std::optional<u128> user_id,
|
||||||
std::optional<bool> full_display) {
|
std::optional<bool> full_display) {
|
||||||
|
const auto value = user_id.value_or(u128{});
|
||||||
LOG_INFO(Service_AM,
|
LOG_INFO(Service_AM,
|
||||||
"Application requested frontend show add on content list for EShop, "
|
"Application requested frontend show add on content list for EShop, "
|
||||||
"title_id={:016X}, user_id={:016X}{:016X}, full_display={}",
|
"title_id={:016X}, user_id={:016X}{:016X}, full_display={}",
|
||||||
title_id, user_id.value_or(u128{})[1], user_id.value_or(u128{})[0],
|
title_id, value[1], value[0],
|
||||||
full_display.has_value() ? fmt::format("{}", *full_display) : "null");
|
full_display.has_value() ? fmt::format("{}", *full_display) : "null");
|
||||||
finished();
|
finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefaultECommerceApplet::ShowSubscriptionList(std::function<void()> finished, u64 title_id,
|
void DefaultECommerceApplet::ShowSubscriptionList(std::function<void()> finished, u64 title_id,
|
||||||
std::optional<u128> user_id) {
|
std::optional<u128> user_id) {
|
||||||
|
const auto value = user_id.value_or(u128{});
|
||||||
LOG_INFO(Service_AM,
|
LOG_INFO(Service_AM,
|
||||||
"Application requested frontend show subscription list for EShop, title_id={:016X}, "
|
"Application requested frontend show subscription list for EShop, title_id={:016X}, "
|
||||||
"user_id={:016X}{:016X}",
|
"user_id={:016X}{:016X}",
|
||||||
title_id, user_id.value_or(u128{})[1], user_id.value_or(u128{})[0]);
|
title_id, value[1], value[0]);
|
||||||
finished();
|
finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefaultECommerceApplet::ShowConsumableItemList(std::function<void()> finished, u64 title_id,
|
void DefaultECommerceApplet::ShowConsumableItemList(std::function<void()> finished, u64 title_id,
|
||||||
std::optional<u128> user_id) {
|
std::optional<u128> user_id) {
|
||||||
|
const auto value = user_id.value_or(u128{});
|
||||||
LOG_INFO(
|
LOG_INFO(
|
||||||
Service_AM,
|
Service_AM,
|
||||||
"Application requested frontend show consumable item list for EShop, title_id={:016X}, "
|
"Application requested frontend show consumable item list for EShop, title_id={:016X}, "
|
||||||
"user_id={:016X}{:016X}",
|
"user_id={:016X}{:016X}",
|
||||||
title_id, user_id.value_or(u128{})[1], user_id.value_or(u128{})[0]);
|
title_id, value[1], value[0]);
|
||||||
finished();
|
finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,20 @@ class ParentalControlsApplet {
|
||||||
public:
|
public:
|
||||||
virtual ~ParentalControlsApplet();
|
virtual ~ParentalControlsApplet();
|
||||||
|
|
||||||
|
// Prompts the user to enter a PIN and calls the callback with whether or not it matches the
|
||||||
|
// correct PIN. If the bool is passed, and the PIN was recently entered correctly, the frontend
|
||||||
|
// should not prompt and simply return true.
|
||||||
virtual void VerifyPIN(std::function<void(bool)> finished,
|
virtual void VerifyPIN(std::function<void(bool)> finished,
|
||||||
bool suspend_future_verification_temporarily) = 0;
|
bool suspend_future_verification_temporarily) = 0;
|
||||||
|
|
||||||
|
// Prompts the user to enter a PIN and calls the callback for correctness. Frontends can
|
||||||
|
// optionally alert the user that this is to change parental controls settings.
|
||||||
virtual void VerifyPINForSettings(std::function<void(bool)> finished) = 0;
|
virtual void VerifyPINForSettings(std::function<void(bool)> finished) = 0;
|
||||||
|
|
||||||
|
// Prompts the user to create a new PIN for pctl and stores it with the service.
|
||||||
virtual void RegisterPIN(std::function<void()> finished) = 0;
|
virtual void RegisterPIN(std::function<void()> finished) = 0;
|
||||||
|
|
||||||
|
// Prompts the user to verify the current PIN and then store a new one into pctl.
|
||||||
virtual void ChangePIN(std::function<void()> finished) = 0;
|
virtual void ChangePIN(std::function<void()> finished) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,18 +62,32 @@ class ECommerceApplet {
|
||||||
public:
|
public:
|
||||||
virtual ~ECommerceApplet();
|
virtual ~ECommerceApplet();
|
||||||
|
|
||||||
|
// Shows a page with application icons, description, name, and price.
|
||||||
virtual void ShowApplicationInformation(std::function<void()> finished, u64 title_id,
|
virtual void ShowApplicationInformation(std::function<void()> finished, u64 title_id,
|
||||||
std::optional<u128> user_id = {},
|
std::optional<u128> user_id = {},
|
||||||
std::optional<bool> full_display = {},
|
std::optional<bool> full_display = {},
|
||||||
std::optional<std::string> extra_parameter = {}) = 0;
|
std::optional<std::string> extra_parameter = {}) = 0;
|
||||||
|
|
||||||
|
// Shows a page with all of the add on content available for a game, with name, description, and
|
||||||
|
// price.
|
||||||
virtual void ShowAddOnContentList(std::function<void()> finished, u64 title_id,
|
virtual void ShowAddOnContentList(std::function<void()> finished, u64 title_id,
|
||||||
std::optional<u128> user_id = {},
|
std::optional<u128> user_id = {},
|
||||||
std::optional<bool> full_display = {}) = 0;
|
std::optional<bool> full_display = {}) = 0;
|
||||||
|
|
||||||
|
// Shows a page with all of the subscriptions (recurring payments) for a game, with name,
|
||||||
|
// description, price, and renewal period.
|
||||||
virtual void ShowSubscriptionList(std::function<void()> finished, u64 title_id,
|
virtual void ShowSubscriptionList(std::function<void()> finished, u64 title_id,
|
||||||
std::optional<u128> user_id = {}) = 0;
|
std::optional<u128> user_id = {}) = 0;
|
||||||
|
|
||||||
|
// Shows a page with a list of any additional game related purchasable items (DLC,
|
||||||
|
// subscriptions, etc) for a particular game, with name, description, type, and price.
|
||||||
virtual void ShowConsumableItemList(std::function<void()> finished, u64 title_id,
|
virtual void ShowConsumableItemList(std::function<void()> finished, u64 title_id,
|
||||||
std::optional<u128> user_id = {}) = 0;
|
std::optional<u128> user_id = {}) = 0;
|
||||||
|
|
||||||
|
// Shows the home page of the shop.
|
||||||
virtual void ShowShopHome(std::function<void()> finished, u128 user_id, bool full_display) = 0;
|
virtual void ShowShopHome(std::function<void()> finished, u128 user_id, bool full_display) = 0;
|
||||||
|
|
||||||
|
// Shows the user settings page of the shop.
|
||||||
virtual void ShowSettings(std::function<void()> finished, u128 user_id, bool full_display) = 0;
|
virtual void ShowSettings(std::function<void()> finished, u128 user_id, bool full_display) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,17 @@ enum class ShimKind : u32 {
|
||||||
Lobby = 7,
|
Lobby = 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class ShopWebTarget {
|
||||||
|
ApplicationInfo,
|
||||||
|
AddOnContentList,
|
||||||
|
SubscriptionList,
|
||||||
|
ConsumableItemList,
|
||||||
|
Home,
|
||||||
|
Settings,
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
constexpr std::size_t SHIM_KIND_COUNT = 0x8;
|
constexpr std::size_t SHIM_KIND_COUNT = 0x8;
|
||||||
|
|
||||||
struct WebArgHeader {
|
struct WebArgHeader {
|
||||||
|
@ -148,31 +159,20 @@ enum class OfflineWebSource : u32 {
|
||||||
SystemDataPage = 0x3,
|
SystemDataPage = 0x3,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class ShopWebTarget {
|
|
||||||
ApplicationInfo,
|
|
||||||
AddOnContentList,
|
|
||||||
SubscriptionList,
|
|
||||||
ConsumableItemList,
|
|
||||||
Home,
|
|
||||||
Settings,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
std::map<WebArgTLVType, std::vector<u8>> GetWebArguments(const std::vector<u8>& arg) {
|
std::map<WebArgTLVType, std::vector<u8>> GetWebArguments(const std::vector<u8>& arg) {
|
||||||
WebArgHeader header{};
|
|
||||||
if (arg.size() < sizeof(WebArgHeader))
|
if (arg.size() < sizeof(WebArgHeader))
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
WebArgHeader header{};
|
||||||
std::memcpy(&header, arg.data(), sizeof(WebArgHeader));
|
std::memcpy(&header, arg.data(), sizeof(WebArgHeader));
|
||||||
|
|
||||||
std::map<WebArgTLVType, std::vector<u8>> out;
|
std::map<WebArgTLVType, std::vector<u8>> out;
|
||||||
u64 offset = sizeof(WebArgHeader);
|
u64 offset = sizeof(WebArgHeader);
|
||||||
for (std::size_t i = 0; i < header.count; ++i) {
|
for (std::size_t i = 0; i < header.count; ++i) {
|
||||||
WebArgTLV tlv{};
|
|
||||||
if (arg.size() < (offset + sizeof(WebArgTLV)))
|
if (arg.size() < (offset + sizeof(WebArgTLV)))
|
||||||
return out;
|
return out;
|
||||||
|
|
||||||
|
WebArgTLV tlv{};
|
||||||
std::memcpy(&tlv, arg.data() + offset, sizeof(WebArgTLV));
|
std::memcpy(&tlv, arg.data() + offset, sizeof(WebArgTLV));
|
||||||
offset += sizeof(WebArgTLV);
|
offset += sizeof(WebArgTLV);
|
||||||
|
|
||||||
|
@ -392,7 +392,7 @@ void WebBrowser::InitializeShop() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<std::string, ShopWebTarget> target_map{
|
const std::map<std::string, ShopWebTarget, std::less<>> target_map{
|
||||||
{"product_detail", ShopWebTarget::ApplicationInfo},
|
{"product_detail", ShopWebTarget::ApplicationInfo},
|
||||||
{"aocs", ShopWebTarget::AddOnContentList},
|
{"aocs", ShopWebTarget::AddOnContentList},
|
||||||
{"subscriptions", ShopWebTarget::SubscriptionList},
|
{"subscriptions", ShopWebTarget::SubscriptionList},
|
||||||
|
@ -480,7 +480,7 @@ void WebBrowser::InitializeOffline() {
|
||||||
|
|
||||||
std::string path_additional_directory;
|
std::string path_additional_directory;
|
||||||
if (source == OfflineWebSource::OfflineHtmlPage) {
|
if (source == OfflineWebSource::OfflineHtmlPage) {
|
||||||
path_additional_directory = std::string(DIR_SEP) + "html-document";
|
path_additional_directory = std::string(DIR_SEP).append("html-document");
|
||||||
}
|
}
|
||||||
|
|
||||||
filename =
|
filename =
|
||||||
|
|
|
@ -67,7 +67,7 @@ private:
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
|
||||||
ShopWebTarget shop_web_target;
|
ShopWebTarget shop_web_target;
|
||||||
std::map<std::string, std::string> shop_query;
|
std::map<std::string, std::string, std::less<>> shop_query;
|
||||||
std::optional<u64> title_id = 0;
|
std::optional<u64> title_id = 0;
|
||||||
std::optional<u128> user_id;
|
std::optional<u128> user_id;
|
||||||
std::optional<bool> shop_full_display;
|
std::optional<bool> shop_full_display;
|
||||||
|
|
|
@ -814,13 +814,13 @@ bool GMainWindow::LoadROM(const QString& filename) {
|
||||||
system.SetGPUDebugContext(debug_context);
|
system.SetGPUDebugContext(debug_context);
|
||||||
|
|
||||||
system.SetAppletFrontendSet({
|
system.SetAppletFrontendSet({
|
||||||
nullptr, ///< Parental Controls
|
nullptr, // Parental Controls
|
||||||
std::make_unique<QtErrorDisplay>(*this), ///<
|
std::make_unique<QtErrorDisplay>(*this), //
|
||||||
nullptr, ///< Photo Viewer
|
nullptr, // Photo Viewer
|
||||||
std::make_unique<QtProfileSelector>(*this), ///<
|
std::make_unique<QtProfileSelector>(*this), //
|
||||||
std::make_unique<QtSoftwareKeyboard>(*this), ///<
|
std::make_unique<QtSoftwareKeyboard>(*this), //
|
||||||
std::make_unique<QtWebBrowser>(*this), ///<
|
std::make_unique<QtWebBrowser>(*this), //
|
||||||
nullptr, ///< E-Commerce
|
nullptr, // E-Commerce
|
||||||
});
|
});
|
||||||
|
|
||||||
const Core::System::ResultStatus result{system.Load(*render_window, filename.toStdString())};
|
const Core::System::ResultStatus result{system.Load(*render_window, filename.toStdString())};
|
||||||
|
|
Loading…
Reference in New Issue