1
1
Fork 0
forked from suyu/suyu

general_frontend: Add documentation for parental controls and ecommerce applets

This commit is contained in:
Zach Hilman 2019-06-06 18:40:59 -04:00
parent 73dcb13619
commit 01ff38cca8
5 changed files with 55 additions and 27 deletions

View file

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

View file

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

View file

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

View file

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

View file

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