Skip to content
Snippets Groups Projects
Commit bdc47693 authored by Zach Hilman's avatar Zach Hilman
Browse files

applets: Save report on stubbed applet

This also reworks the applet data storage to be peekable.
parent 186db894
No related branches found
No related tags found
No related merge requests found
...@@ -35,12 +35,27 @@ AppletDataBroker::AppletDataBroker() { ...@@ -35,12 +35,27 @@ AppletDataBroker::AppletDataBroker() {
AppletDataBroker::~AppletDataBroker() = default; AppletDataBroker::~AppletDataBroker() = default;
AppletDataBroker::RawChannelData AppletDataBroker::PeekDataToAppletForDebug() const {
std::vector<std::vector<u8>> out_normal;
std::vector<std::vector<u8>> out_interactive;
for (const auto& storage : in_channel) {
out_normal.push_back(storage->GetData());
}
for (const auto& storage : in_interactive_channel) {
out_interactive.push_back(storage->GetData());
}
return {out_normal, out_interactive};
}
std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() { std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToGame() {
if (out_channel.empty()) if (out_channel.empty())
return nullptr; return nullptr;
auto out = std::move(out_channel.front()); auto out = std::move(out_channel.front());
out_channel.pop(); out_channel.pop_front();
return out; return out;
} }
...@@ -49,7 +64,7 @@ std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToApplet() { ...@@ -49,7 +64,7 @@ std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToApplet() {
return nullptr; return nullptr;
auto out = std::move(in_channel.front()); auto out = std::move(in_channel.front());
in_channel.pop(); in_channel.pop_front();
return out; return out;
} }
...@@ -58,7 +73,7 @@ std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() { ...@@ -58,7 +73,7 @@ std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() {
return nullptr; return nullptr;
auto out = std::move(out_interactive_channel.front()); auto out = std::move(out_interactive_channel.front());
out_interactive_channel.pop(); out_interactive_channel.pop_front();
return out; return out;
} }
...@@ -67,25 +82,25 @@ std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToApplet() { ...@@ -67,25 +82,25 @@ std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToApplet() {
return nullptr; return nullptr;
auto out = std::move(in_interactive_channel.front()); auto out = std::move(in_interactive_channel.front());
in_interactive_channel.pop(); in_interactive_channel.pop_front();
return out; return out;
} }
void AppletDataBroker::PushNormalDataFromGame(IStorage storage) { void AppletDataBroker::PushNormalDataFromGame(IStorage storage) {
in_channel.push(std::make_unique<IStorage>(storage)); in_channel.push_back(std::make_unique<IStorage>(storage));
} }
void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) { void AppletDataBroker::PushNormalDataFromApplet(IStorage storage) {
out_channel.push(std::make_unique<IStorage>(storage)); out_channel.push_back(std::make_unique<IStorage>(storage));
pop_out_data_event.writable->Signal(); pop_out_data_event.writable->Signal();
} }
void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) { void AppletDataBroker::PushInteractiveDataFromGame(IStorage storage) {
in_interactive_channel.push(std::make_unique<IStorage>(storage)); in_interactive_channel.push_back(std::make_unique<IStorage>(storage));
} }
void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) { void AppletDataBroker::PushInteractiveDataFromApplet(IStorage storage) {
out_interactive_channel.push(std::make_unique<IStorage>(storage)); out_interactive_channel.push_back(std::make_unique<IStorage>(storage));
pop_interactive_out_data_event.writable->Signal(); pop_interactive_out_data_event.writable->Signal();
} }
...@@ -189,7 +204,7 @@ std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id) const { ...@@ -189,7 +204,7 @@ std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id) const {
UNIMPLEMENTED_MSG( UNIMPLEMENTED_MSG(
"No backend implementation exists for applet_id={:02X}! Falling back to stub applet.", "No backend implementation exists for applet_id={:02X}! Falling back to stub applet.",
static_cast<u8>(id)); static_cast<u8>(id));
return std::make_shared<StubApplet>(); return std::make_shared<StubApplet>(id);
} }
} }
......
...@@ -54,6 +54,14 @@ public: ...@@ -54,6 +54,14 @@ public:
AppletDataBroker(); AppletDataBroker();
~AppletDataBroker(); ~AppletDataBroker();
struct RawChannelData {
std::vector<std::vector<u8>> normal;
std::vector<std::vector<u8>> interactive;
};
// Retrieves but does not pop the data sent to applet.
RawChannelData PeekDataToAppletForDebug() const;
std::unique_ptr<IStorage> PopNormalDataToGame(); std::unique_ptr<IStorage> PopNormalDataToGame();
std::unique_ptr<IStorage> PopNormalDataToApplet(); std::unique_ptr<IStorage> PopNormalDataToApplet();
...@@ -76,16 +84,16 @@ private: ...@@ -76,16 +84,16 @@ private:
// Queues are named from applet's perspective // Queues are named from applet's perspective
// PopNormalDataToApplet and PushNormalDataFromGame // PopNormalDataToApplet and PushNormalDataFromGame
std::queue<std::unique_ptr<IStorage>> in_channel; std::deque<std::unique_ptr<IStorage>> in_channel;
// PopNormalDataToGame and PushNormalDataFromApplet // PopNormalDataToGame and PushNormalDataFromApplet
std::queue<std::unique_ptr<IStorage>> out_channel; std::deque<std::unique_ptr<IStorage>> out_channel;
// PopInteractiveDataToApplet and PushInteractiveDataFromGame // PopInteractiveDataToApplet and PushInteractiveDataFromGame
std::queue<std::unique_ptr<IStorage>> in_interactive_channel; std::deque<std::unique_ptr<IStorage>> in_interactive_channel;
// PopInteractiveDataToGame and PushInteractiveDataFromApplet // PopInteractiveDataToGame and PushInteractiveDataFromApplet
std::queue<std::unique_ptr<IStorage>> out_interactive_channel; std::deque<std::unique_ptr<IStorage>> out_interactive_channel;
Kernel::EventPair state_changed_event; Kernel::EventPair state_changed_event;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "core/hle/result.h" #include "core/hle/result.h"
#include "core/hle/service/am/am.h" #include "core/hle/service/am/am.h"
#include "core/hle/service/am/applets/general_backend.h" #include "core/hle/service/am/applets/general_backend.h"
#include "core/reporter.h"
namespace Service::AM::Applets { namespace Service::AM::Applets {
...@@ -83,13 +84,20 @@ void PhotoViewer::ViewFinished() { ...@@ -83,13 +84,20 @@ void PhotoViewer::ViewFinished() {
broker.SignalStateChanged(); broker.SignalStateChanged();
} }
StubApplet::StubApplet() = default; StubApplet::StubApplet(AppletId id) : id(id) {}
StubApplet::~StubApplet() = default; StubApplet::~StubApplet() = default;
void StubApplet::Initialize() { void StubApplet::Initialize() {
LOG_WARNING(Service_AM, "called (STUBBED)"); LOG_WARNING(Service_AM, "called (STUBBED)");
Applet::Initialize(); Applet::Initialize();
const auto data = broker.PeekDataToAppletForDebug();
Core::System::GetInstance().GetReporter().SaveUnimplementedAppletReport(
static_cast<u32>(id), common_args.arguments_version, common_args.library_version,
common_args.theme_color, common_args.play_startup_sound, common_args.system_tick,
data.normal, data.interactive);
LogCurrentStorage(broker, "Initialize"); LogCurrentStorage(broker, "Initialize");
} }
......
...@@ -34,7 +34,7 @@ private: ...@@ -34,7 +34,7 @@ private:
class StubApplet final : public Applet { class StubApplet final : public Applet {
public: public:
StubApplet(); StubApplet(AppletId id);
~StubApplet() override; ~StubApplet() override;
void Initialize() override; void Initialize() override;
...@@ -43,6 +43,9 @@ public: ...@@ -43,6 +43,9 @@ public:
ResultCode GetStatus() const override; ResultCode GetStatus() const override;
void ExecuteInteractive() override; void ExecuteInteractive() override;
void Execute() override; void Execute() override;
private:
AppletId id;
}; };
} // namespace Service::AM::Applets } // namespace Service::AM::Applets
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment