From 01ff38cca80c5cf7e64494b129dde8d7c8ebbee5 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Thu, 6 Jun 2019 18:40:59 -0400 Subject: [PATCH] general_frontend: Add documentation for parental controls and ecommerce applets --- .../frontend/applets/general_frontend.cpp | 12 +++++--- src/core/frontend/applets/general_frontend.h | 24 +++++++++++++++ .../hle/service/am/applets/web_browser.cpp | 30 +++++++++---------- src/core/hle/service/am/applets/web_browser.h | 2 +- src/yuzu/main.cpp | 14 ++++----- 5 files changed, 55 insertions(+), 27 deletions(-) diff --git a/src/core/frontend/applets/general_frontend.cpp b/src/core/frontend/applets/general_frontend.cpp index e6cb59b648..c30b36de77 100644 --- a/src/core/frontend/applets/general_frontend.cpp +++ b/src/core/frontend/applets/general_frontend.cpp @@ -60,10 +60,11 @@ DefaultECommerceApplet::~DefaultECommerceApplet() = default; void DefaultECommerceApplet::ShowApplicationInformation( std::function finished, u64 title_id, std::optional user_id, std::optional full_display, std::optional extra_parameter) { + const auto value = user_id.value_or(u128{}); LOG_INFO(Service_AM, "Application requested frontend show application information for EShop, " "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", extra_parameter.value_or("null")); finished(); @@ -72,30 +73,33 @@ void DefaultECommerceApplet::ShowApplicationInformation( void DefaultECommerceApplet::ShowAddOnContentList(std::function finished, u64 title_id, std::optional user_id, std::optional full_display) { + const auto value = user_id.value_or(u128{}); LOG_INFO(Service_AM, "Application requested frontend show add on content list for EShop, " "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"); finished(); } void DefaultECommerceApplet::ShowSubscriptionList(std::function finished, u64 title_id, std::optional user_id) { + const auto value = user_id.value_or(u128{}); LOG_INFO(Service_AM, "Application requested frontend show subscription list for EShop, title_id={: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(); } void DefaultECommerceApplet::ShowConsumableItemList(std::function finished, u64 title_id, std::optional user_id) { + const auto value = user_id.value_or(u128{}); LOG_INFO( Service_AM, "Application requested frontend show consumable item list for EShop, title_id={: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(); } diff --git a/src/core/frontend/applets/general_frontend.h b/src/core/frontend/applets/general_frontend.h index 616112cfcf..4b63f828eb 100644 --- a/src/core/frontend/applets/general_frontend.h +++ b/src/core/frontend/applets/general_frontend.h @@ -14,10 +14,20 @@ class ParentalControlsApplet { public: 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 finished, 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 finished) = 0; + + // Prompts the user to create a new PIN for pctl and stores it with the service. virtual void RegisterPIN(std::function finished) = 0; + + // Prompts the user to verify the current PIN and then store a new one into pctl. virtual void ChangePIN(std::function finished) = 0; }; @@ -52,18 +62,32 @@ class ECommerceApplet { public: virtual ~ECommerceApplet(); + // Shows a page with application icons, description, name, and price. virtual void ShowApplicationInformation(std::function finished, u64 title_id, std::optional user_id = {}, std::optional full_display = {}, std::optional 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 finished, u64 title_id, std::optional user_id = {}, std::optional 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 finished, u64 title_id, std::optional 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 finished, u64 title_id, std::optional user_id = {}) = 0; + + // Shows the home page of the shop. virtual void ShowShopHome(std::function finished, u128 user_id, bool full_display) = 0; + + // Shows the user settings page of the shop. virtual void ShowSettings(std::function finished, u128 user_id, bool full_display) = 0; }; diff --git a/src/core/hle/service/am/applets/web_browser.cpp b/src/core/hle/service/am/applets/web_browser.cpp index 3c3af476c4..3aa8f24688 100644 --- a/src/core/hle/service/am/applets/web_browser.cpp +++ b/src/core/hle/service/am/applets/web_browser.cpp @@ -103,6 +103,17 @@ enum class ShimKind : u32 { Lobby = 7, }; +enum class ShopWebTarget { + ApplicationInfo, + AddOnContentList, + SubscriptionList, + ConsumableItemList, + Home, + Settings, +}; + +namespace { + constexpr std::size_t SHIM_KIND_COUNT = 0x8; struct WebArgHeader { @@ -148,31 +159,20 @@ enum class OfflineWebSource : u32 { SystemDataPage = 0x3, }; -enum class ShopWebTarget { - ApplicationInfo, - AddOnContentList, - SubscriptionList, - ConsumableItemList, - Home, - Settings, -}; - -namespace { - std::map> GetWebArguments(const std::vector& arg) { - WebArgHeader header{}; if (arg.size() < sizeof(WebArgHeader)) return {}; + WebArgHeader header{}; std::memcpy(&header, arg.data(), sizeof(WebArgHeader)); std::map> out; u64 offset = sizeof(WebArgHeader); for (std::size_t i = 0; i < header.count; ++i) { - WebArgTLV tlv{}; if (arg.size() < (offset + sizeof(WebArgTLV))) return out; + WebArgTLV tlv{}; std::memcpy(&tlv, arg.data() + offset, sizeof(WebArgTLV)); offset += sizeof(WebArgTLV); @@ -392,7 +392,7 @@ void WebBrowser::InitializeShop() { return; } - const std::map target_map{ + const std::map> target_map{ {"product_detail", ShopWebTarget::ApplicationInfo}, {"aocs", ShopWebTarget::AddOnContentList}, {"subscriptions", ShopWebTarget::SubscriptionList}, @@ -480,7 +480,7 @@ void WebBrowser::InitializeOffline() { std::string path_additional_directory; if (source == OfflineWebSource::OfflineHtmlPage) { - path_additional_directory = std::string(DIR_SEP) + "html-document"; + path_additional_directory = std::string(DIR_SEP).append("html-document"); } filename = diff --git a/src/core/hle/service/am/applets/web_browser.h b/src/core/hle/service/am/applets/web_browser.h index 42f0a3e8aa..9667dcf6f1 100644 --- a/src/core/hle/service/am/applets/web_browser.h +++ b/src/core/hle/service/am/applets/web_browser.h @@ -67,7 +67,7 @@ private: std::string filename; ShopWebTarget shop_web_target; - std::map shop_query; + std::map> shop_query; std::optional title_id = 0; std::optional user_id; std::optional shop_full_display; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index d1813e8345..47e46f574c 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -814,13 +814,13 @@ bool GMainWindow::LoadROM(const QString& filename) { system.SetGPUDebugContext(debug_context); system.SetAppletFrontendSet({ - nullptr, ///< Parental Controls - std::make_unique(*this), ///< - nullptr, ///< Photo Viewer - std::make_unique(*this), ///< - std::make_unique(*this), ///< - std::make_unique(*this), ///< - nullptr, ///< E-Commerce + nullptr, // Parental Controls + std::make_unique(*this), // + nullptr, // Photo Viewer + std::make_unique(*this), // + std::make_unique(*this), // + std::make_unique(*this), // + nullptr, // E-Commerce }); const Core::System::ResultStatus result{system.Load(*render_window, filename.toStdString())};