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

applets: Save report on stubbed applet
This also reworks the applet data storage to be peekable.

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

+ 24 - 9
src/core/hle/service/am/applets/applets.cpp

@@ -35,12 +35,27 @@ AppletDataBroker::AppletDataBroker() {
 
 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() {
     if (out_channel.empty())
         return nullptr;
 
     auto out = std::move(out_channel.front());
-    out_channel.pop();
+    out_channel.pop_front();
     return out;
 }
 
@@ -49,7 +64,7 @@ std::unique_ptr<IStorage> AppletDataBroker::PopNormalDataToApplet() {
         return nullptr;
 
     auto out = std::move(in_channel.front());
-    in_channel.pop();
+    in_channel.pop_front();
     return out;
 }
 
@@ -58,7 +73,7 @@ std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToGame() {
         return nullptr;
 
     auto out = std::move(out_interactive_channel.front());
-    out_interactive_channel.pop();
+    out_interactive_channel.pop_front();
     return out;
 }
 
@@ -67,25 +82,25 @@ std::unique_ptr<IStorage> AppletDataBroker::PopInteractiveDataToApplet() {
         return nullptr;
 
     auto out = std::move(in_interactive_channel.front());
-    in_interactive_channel.pop();
+    in_interactive_channel.pop_front();
     return out;
 }
 
 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) {
-    out_channel.push(std::make_unique<IStorage>(storage));
+    out_channel.push_back(std::make_unique<IStorage>(storage));
     pop_out_data_event.writable->Signal();
 }
 
 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) {
-    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();
 }
 
@@ -189,7 +204,7 @@ std::shared_ptr<Applet> AppletManager::GetApplet(AppletId id) const {
         UNIMPLEMENTED_MSG(
             "No backend implementation exists for applet_id={:02X}! Falling back to stub applet.",
             static_cast<u8>(id));
-        return std::make_shared<StubApplet>();
+        return std::make_shared<StubApplet>(id);
     }
 }
 

+ 12 - 4
src/core/hle/service/am/applets/applets.h

@@ -54,6 +54,14 @@ public:
     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> PopNormalDataToApplet();
 
@@ -76,16 +84,16 @@ private:
     // Queues are named from applet's perspective
 
     // PopNormalDataToApplet and PushNormalDataFromGame
-    std::queue<std::unique_ptr<IStorage>> in_channel;
+    std::deque<std::unique_ptr<IStorage>> in_channel;
 
     // PopNormalDataToGame and PushNormalDataFromApplet
-    std::queue<std::unique_ptr<IStorage>> out_channel;
+    std::deque<std::unique_ptr<IStorage>> out_channel;
 
     // PopInteractiveDataToApplet and PushInteractiveDataFromGame
-    std::queue<std::unique_ptr<IStorage>> in_interactive_channel;
+    std::deque<std::unique_ptr<IStorage>> in_interactive_channel;
 
     // 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;
 

+ 9 - 1
src/core/hle/service/am/applets/general_backend.cpp

@@ -13,6 +13,7 @@
 #include "core/hle/result.h"
 #include "core/hle/service/am/am.h"
 #include "core/hle/service/am/applets/general_backend.h"
+#include "core/reporter.h"
 
 namespace Service::AM::Applets {
 
@@ -83,13 +84,20 @@ void PhotoViewer::ViewFinished() {
     broker.SignalStateChanged();
 }
 
-StubApplet::StubApplet() = default;
+StubApplet::StubApplet(AppletId id) : id(id) {}
 
 StubApplet::~StubApplet() = default;
 
 void StubApplet::Initialize() {
     LOG_WARNING(Service_AM, "called (STUBBED)");
     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");
 }
 

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

@@ -34,7 +34,7 @@ private:
 
 class StubApplet final : public Applet {
 public:
-    StubApplet();
+    StubApplet(AppletId id);
     ~StubApplet() override;
 
     void Initialize() override;
@@ -43,6 +43,9 @@ public:
     ResultCode GetStatus() const override;
     void ExecuteInteractive() override;
     void Execute() override;
+
+private:
+    AppletId id;
 };
 
 } // namespace Service::AM::Applets