Просмотр исходного кода

general_frontend: Add documentation for parental controls and ecommerce applets

Zach Hilman 7 лет назад
Родитель
Сommit
01ff38cca8

+ 8 - 4
src/core/frontend/applets/general_frontend.cpp

@@ -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();
 }
 }
 
 

+ 24 - 0
src/core/frontend/applets/general_frontend.h

@@ -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;
 };
 };
 
 

+ 15 - 15
src/core/hle/service/am/applets/web_browser.cpp

@@ -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 =

+ 1 - 1
src/core/hle/service/am/applets/web_browser.h

@@ -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;

+ 7 - 7
src/yuzu/main.cpp

@@ -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
-        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())};
     const Core::System::ResultStatus result{system.Load(*render_window, filename.toStdString())};