applets.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include <cstring>
  4. #include "common/assert.h"
  5. #include "core/core.h"
  6. #include "core/frontend/applets/cabinet.h"
  7. #include "core/frontend/applets/controller.h"
  8. #include "core/frontend/applets/error.h"
  9. #include "core/frontend/applets/general.h"
  10. #include "core/frontend/applets/mii_edit.h"
  11. #include "core/frontend/applets/profile_select.h"
  12. #include "core/frontend/applets/software_keyboard.h"
  13. #include "core/frontend/applets/web_browser.h"
  14. #include "core/hle/kernel/k_event.h"
  15. #include "core/hle/service/am/am.h"
  16. #include "core/hle/service/am/applet_ae.h"
  17. #include "core/hle/service/am/applet_data_broker.h"
  18. #include "core/hle/service/am/applet_manager.h"
  19. #include "core/hle/service/am/applet_message_queue.h"
  20. #include "core/hle/service/am/applet_oe.h"
  21. #include "core/hle/service/am/frontend/applet_cabinet.h"
  22. #include "core/hle/service/am/frontend/applet_controller.h"
  23. #include "core/hle/service/am/frontend/applet_error.h"
  24. #include "core/hle/service/am/frontend/applet_general.h"
  25. #include "core/hle/service/am/frontend/applet_mii_edit.h"
  26. #include "core/hle/service/am/frontend/applet_profile_select.h"
  27. #include "core/hle/service/am/frontend/applet_software_keyboard.h"
  28. #include "core/hle/service/am/frontend/applet_web_browser.h"
  29. #include "core/hle/service/am/frontend/applets.h"
  30. #include "core/hle/service/am/storage.h"
  31. #include "core/hle/service/sm/sm.h"
  32. namespace Service::AM::Frontend {
  33. FrontendApplet::FrontendApplet(Core::System& system_, std::shared_ptr<Applet> applet_,
  34. LibraryAppletMode applet_mode_)
  35. : system{system_}, applet{std::move(applet_)}, applet_mode{applet_mode_} {}
  36. FrontendApplet::~FrontendApplet() = default;
  37. void FrontendApplet::Initialize() {
  38. std::shared_ptr<IStorage> common = PopInData();
  39. ASSERT(common != nullptr);
  40. const auto common_data = common->GetData();
  41. ASSERT(common_data.size() >= sizeof(CommonArguments));
  42. std::memcpy(&common_args, common_data.data(), sizeof(CommonArguments));
  43. initialized = true;
  44. }
  45. std::shared_ptr<IStorage> FrontendApplet::PopInData() {
  46. std::shared_ptr<IStorage> ret;
  47. applet.lock()->caller_applet_broker->GetInData().Pop(&ret);
  48. return ret;
  49. }
  50. std::shared_ptr<IStorage> FrontendApplet::PopInteractiveInData() {
  51. std::shared_ptr<IStorage> ret;
  52. applet.lock()->caller_applet_broker->GetInteractiveInData().Pop(&ret);
  53. return ret;
  54. }
  55. void FrontendApplet::PushOutData(std::shared_ptr<IStorage> storage) {
  56. applet.lock()->caller_applet_broker->GetOutData().Push(storage);
  57. }
  58. void FrontendApplet::PushInteractiveOutData(std::shared_ptr<IStorage> storage) {
  59. applet.lock()->caller_applet_broker->GetInteractiveOutData().Push(storage);
  60. }
  61. void FrontendApplet::Exit() {
  62. applet.lock()->caller_applet_broker->SignalCompletion();
  63. }
  64. FrontendAppletSet::FrontendAppletSet() = default;
  65. FrontendAppletSet::FrontendAppletSet(CabinetApplet cabinet_applet,
  66. ControllerApplet controller_applet, ErrorApplet error_applet,
  67. MiiEdit mii_edit_,
  68. ParentalControlsApplet parental_controls_applet,
  69. PhotoViewer photo_viewer_, ProfileSelect profile_select_,
  70. SoftwareKeyboard software_keyboard_, WebBrowser web_browser_)
  71. : cabinet{std::move(cabinet_applet)}, controller{std::move(controller_applet)},
  72. error{std::move(error_applet)}, mii_edit{std::move(mii_edit_)},
  73. parental_controls{std::move(parental_controls_applet)},
  74. photo_viewer{std::move(photo_viewer_)}, profile_select{std::move(profile_select_)},
  75. software_keyboard{std::move(software_keyboard_)}, web_browser{std::move(web_browser_)} {}
  76. FrontendAppletSet::~FrontendAppletSet() = default;
  77. FrontendAppletSet::FrontendAppletSet(FrontendAppletSet&&) noexcept = default;
  78. FrontendAppletSet& FrontendAppletSet::operator=(FrontendAppletSet&&) noexcept = default;
  79. FrontendAppletHolder::FrontendAppletHolder(Core::System& system_) : system{system_} {}
  80. FrontendAppletHolder::~FrontendAppletHolder() = default;
  81. const FrontendAppletSet& FrontendAppletHolder::GetFrontendAppletSet() const {
  82. return frontend;
  83. }
  84. NFP::CabinetMode FrontendAppletHolder::GetCabinetMode() const {
  85. return cabinet_mode;
  86. }
  87. AppletId FrontendAppletHolder::GetCurrentAppletId() const {
  88. return current_applet_id;
  89. }
  90. void FrontendAppletHolder::SetFrontendAppletSet(FrontendAppletSet set) {
  91. if (set.cabinet != nullptr) {
  92. frontend.cabinet = std::move(set.cabinet);
  93. }
  94. if (set.controller != nullptr) {
  95. frontend.controller = std::move(set.controller);
  96. }
  97. if (set.error != nullptr) {
  98. frontend.error = std::move(set.error);
  99. }
  100. if (set.mii_edit != nullptr) {
  101. frontend.mii_edit = std::move(set.mii_edit);
  102. }
  103. if (set.parental_controls != nullptr) {
  104. frontend.parental_controls = std::move(set.parental_controls);
  105. }
  106. if (set.photo_viewer != nullptr) {
  107. frontend.photo_viewer = std::move(set.photo_viewer);
  108. }
  109. if (set.profile_select != nullptr) {
  110. frontend.profile_select = std::move(set.profile_select);
  111. }
  112. if (set.software_keyboard != nullptr) {
  113. frontend.software_keyboard = std::move(set.software_keyboard);
  114. }
  115. if (set.web_browser != nullptr) {
  116. frontend.web_browser = std::move(set.web_browser);
  117. }
  118. }
  119. void FrontendAppletHolder::SetCabinetMode(NFP::CabinetMode mode) {
  120. cabinet_mode = mode;
  121. }
  122. void FrontendAppletHolder::SetCurrentAppletId(AppletId applet_id) {
  123. current_applet_id = applet_id;
  124. }
  125. void FrontendAppletHolder::SetDefaultAppletsIfMissing() {
  126. if (frontend.cabinet == nullptr) {
  127. frontend.cabinet = std::make_unique<Core::Frontend::DefaultCabinetApplet>();
  128. }
  129. if (frontend.controller == nullptr) {
  130. frontend.controller =
  131. std::make_unique<Core::Frontend::DefaultControllerApplet>(system.HIDCore());
  132. }
  133. if (frontend.error == nullptr) {
  134. frontend.error = std::make_unique<Core::Frontend::DefaultErrorApplet>();
  135. }
  136. if (frontend.mii_edit == nullptr) {
  137. frontend.mii_edit = std::make_unique<Core::Frontend::DefaultMiiEditApplet>();
  138. }
  139. if (frontend.parental_controls == nullptr) {
  140. frontend.parental_controls =
  141. std::make_unique<Core::Frontend::DefaultParentalControlsApplet>();
  142. }
  143. if (frontend.photo_viewer == nullptr) {
  144. frontend.photo_viewer = std::make_unique<Core::Frontend::DefaultPhotoViewerApplet>();
  145. }
  146. if (frontend.profile_select == nullptr) {
  147. frontend.profile_select = std::make_unique<Core::Frontend::DefaultProfileSelectApplet>();
  148. }
  149. if (frontend.software_keyboard == nullptr) {
  150. frontend.software_keyboard =
  151. std::make_unique<Core::Frontend::DefaultSoftwareKeyboardApplet>();
  152. }
  153. if (frontend.web_browser == nullptr) {
  154. frontend.web_browser = std::make_unique<Core::Frontend::DefaultWebBrowserApplet>();
  155. }
  156. }
  157. void FrontendAppletHolder::ClearAll() {
  158. frontend = {};
  159. }
  160. std::shared_ptr<FrontendApplet> FrontendAppletHolder::GetApplet(std::shared_ptr<Applet> applet,
  161. AppletId id,
  162. LibraryAppletMode mode) const {
  163. switch (id) {
  164. case AppletId::Auth:
  165. return std::make_shared<Auth>(system, applet, mode, *frontend.parental_controls);
  166. case AppletId::Cabinet:
  167. return std::make_shared<Cabinet>(system, applet, mode, *frontend.cabinet);
  168. case AppletId::Controller:
  169. return std::make_shared<Controller>(system, applet, mode, *frontend.controller);
  170. case AppletId::Error:
  171. return std::make_shared<Error>(system, applet, mode, *frontend.error);
  172. case AppletId::ProfileSelect:
  173. return std::make_shared<ProfileSelect>(system, applet, mode, *frontend.profile_select);
  174. case AppletId::SoftwareKeyboard:
  175. return std::make_shared<SoftwareKeyboard>(system, applet, mode,
  176. *frontend.software_keyboard);
  177. case AppletId::MiiEdit:
  178. return std::make_shared<MiiEdit>(system, applet, mode, *frontend.mii_edit);
  179. case AppletId::Web:
  180. case AppletId::Shop:
  181. case AppletId::OfflineWeb:
  182. case AppletId::LoginShare:
  183. case AppletId::WebAuth:
  184. return std::make_shared<WebBrowser>(system, applet, mode, *frontend.web_browser);
  185. case AppletId::PhotoViewer:
  186. return std::make_shared<PhotoViewer>(system, applet, mode, *frontend.photo_viewer);
  187. default:
  188. UNIMPLEMENTED_MSG(
  189. "No backend implementation exists for applet_id={:02X}! Falling back to stub applet.",
  190. static_cast<u8>(id));
  191. return std::make_shared<StubApplet>(system, applet, id, mode);
  192. }
  193. }
  194. } // namespace Service::AM::Frontend