general_frontend: Add documentation for parental controls and ecommerce applets
This commit is contained in:
		| @@ -60,10 +60,11 @@ DefaultECommerceApplet::~DefaultECommerceApplet() = default; | ||||
| void DefaultECommerceApplet::ShowApplicationInformation( | ||||
|     std::function<void()> finished, u64 title_id, std::optional<u128> user_id, | ||||
|     std::optional<bool> full_display, std::optional<std::string> 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<void()> finished, u64 title_id, | ||||
|                                                   std::optional<u128> user_id, | ||||
|                                                   std::optional<bool> 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<void()> finished, u64 title_id, | ||||
|                                                   std::optional<u128> 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<void()> finished, u64 title_id, | ||||
|                                                     std::optional<u128> 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(); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -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<void(bool)> 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<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; | ||||
|  | ||||
|     // Prompts the user to verify the current PIN and then store a new one into pctl. | ||||
|     virtual void ChangePIN(std::function<void()> 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<void()> finished, u64 title_id, | ||||
|                                             std::optional<u128> user_id = {}, | ||||
|                                             std::optional<bool> full_display = {}, | ||||
|                                             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, | ||||
|                                       std::optional<u128> user_id = {}, | ||||
|                                       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, | ||||
|                                       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, | ||||
|                                         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; | ||||
|  | ||||
|     // Shows the user settings page of the shop. | ||||
|     virtual void ShowSettings(std::function<void()> finished, u128 user_id, bool full_display) = 0; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -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<WebArgTLVType, std::vector<u8>> GetWebArguments(const std::vector<u8>& arg) { | ||||
|     WebArgHeader header{}; | ||||
|     if (arg.size() < sizeof(WebArgHeader)) | ||||
|         return {}; | ||||
|  | ||||
|     WebArgHeader header{}; | ||||
|     std::memcpy(&header, arg.data(), sizeof(WebArgHeader)); | ||||
|  | ||||
|     std::map<WebArgTLVType, std::vector<u8>> 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<std::string, ShopWebTarget> target_map{ | ||||
|     const std::map<std::string, ShopWebTarget, std::less<>> 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 = | ||||
|   | ||||
| @@ -67,7 +67,7 @@ private: | ||||
|     std::string filename; | ||||
|  | ||||
|     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<u128> user_id; | ||||
|     std::optional<bool> shop_full_display; | ||||
|   | ||||
| @@ -814,13 +814,13 @@ bool GMainWindow::LoadROM(const QString& filename) { | ||||
|     system.SetGPUDebugContext(debug_context); | ||||
|  | ||||
|     system.SetAppletFrontendSet({ | ||||
|         nullptr,                                     ///< Parental Controls | ||||
|         std::make_unique<QtErrorDisplay>(*this),     ///< | ||||
|         nullptr,                                     ///< Photo Viewer | ||||
|         std::make_unique<QtProfileSelector>(*this),  ///< | ||||
|         std::make_unique<QtSoftwareKeyboard>(*this), ///< | ||||
|         std::make_unique<QtWebBrowser>(*this),       ///< | ||||
|         nullptr,                                     ///< E-Commerce | ||||
|         nullptr,                                     // Parental Controls | ||||
|         std::make_unique<QtErrorDisplay>(*this),     // | ||||
|         nullptr,                                     // Photo Viewer | ||||
|         std::make_unique<QtProfileSelector>(*this),  // | ||||
|         std::make_unique<QtSoftwareKeyboard>(*this), // | ||||
|         std::make_unique<QtWebBrowser>(*this),       // | ||||
|         nullptr,                                     // E-Commerce | ||||
|     }); | ||||
|  | ||||
|     const Core::System::ResultStatus result{system.Load(*render_window, filename.toStdString())}; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user