applets.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <cstring>
  5. #include "common/assert.h"
  6. #include "core/core.h"
  7. #include "core/hle/kernel/event.h"
  8. #include "core/hle/kernel/server_port.h"
  9. #include "core/hle/service/am/am.h"
  10. #include "core/hle/service/am/applets/applets.h"
  11. namespace Service::AM::Applets {
  12. AppletDataBroker::AppletDataBroker() {
  13. auto& kernel = Core::System::GetInstance().Kernel();
  14. state_changed_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
  15. "ILibraryAppletAccessor:StateChangedEvent");
  16. pop_out_data_event = Kernel::Event::Create(kernel, Kernel::ResetType::OneShot,
  17. "ILibraryAppletAccessor:PopDataOutEvent");
  18. pop_interactive_out_data_event = Kernel::Event::Create(
  19. kernel, Kernel::ResetType::OneShot, "ILibraryAppletAccessor:PopInteractiveDataOutEvent");
  20. }
  21. AppletDataBroker::~AppletDataBroker() = default;
  22. std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() {
  23. if (out_channel.empty())
  24. return nullptr;
  25. auto out = std::move(out_channel.front());
  26. out_channel.pop();
  27. return out;
  28. }
  29. std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToApplet() {
  30. if (in_channel.empty())
  31. return nullptr;
  32. auto out = std::move(in_channel.front());
  33. in_channel.pop();
  34. return out;
  35. }
  36. std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() {
  37. if (out_interactive_channel.empty())
  38. return nullptr;
  39. auto out = std::move(out_interactive_channel.front());
  40. out_interactive_channel.pop();
  41. return out;
  42. }
  43. std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToApplet() {
  44. if (in_interactive_channel.empty())
  45. return nullptr;
  46. auto out = std::move(in_interactive_channel.front());
  47. in_interactive_channel.pop();
  48. return out;
  49. }
  50. void AppletDataBroker::PushNormalDataFromGame(IStorage storage) {
  51. in_channel.push(std::make_unique<IStorage>(storage));
  52. }
  53. void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) {
  54. out_channel.push(std::make_unique<IStorage>(storage));
  55. pop_out_data_event->Signal();
  56. }
  57. void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) {
  58. in_interactive_channel.push(std::make_unique<IStorage>(storage));
  59. }
  60. void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) {
  61. out_interactive_channel.push(std::make_unique<IStorage>(storage));
  62. pop_interactive_out_data_event->Signal();
  63. }
  64. void AppletDataBroker::SignalStateChanged() const {
  65. state_changed_event->Signal();
  66. }
  67. Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetNormalDataEvent() const {
  68. return pop_out_data_event;
  69. }
  70. Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetInteractiveDataEvent() const {
  71. return pop_interactive_out_data_event;
  72. }
  73. Kernel::SharedPtr<Kernel::Event> AppletDataBroker::GetStateChangedEvent() const {
  74. return state_changed_event;
  75. }
  76. Applet::Applet() = default;
  77. Applet::~Applet() = default;
  78. void Applet::Initialize(std::shared_ptr<AppletDataBroker> broker_) {
  79. broker = std::move(broker_);
  80. const auto common = broker->PopNormalDataToApplet();
  81. ASSERT(common != nullptr);
  82. const auto common_data = common->GetData();
  83. ASSERT(common_data.size() >= sizeof(CommonArguments));
  84. std::memcpy(&common_args, common_data.data(), sizeof(CommonArguments));
  85. initialized = true;
  86. }
  87. } // namespace Service::AM::Applets