Fix implementation 33/276233/3
authorChanggyu Choi <changyu.choi@samsung.com>
Mon, 13 Jun 2022 08:02:25 +0000 (17:02 +0900)
committerChanggyu Choi <changyu.choi@samsung.com>
Mon, 13 Jun 2022 09:18:59 +0000 (09:18 +0000)
appcore_base_add_event() & appcore_base_remove_event() should be
performed even before calling appcore_base_init().

Change-Id: I5312c339780078a75200b2606e2c5fd48bd6b6ef
Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
legacy/src/legacy/appcore_base.cc

index 0017eec..a516bdf 100644 (file)
@@ -20,6 +20,7 @@
 #include <aul_app_lifecycle.h>
 #include <dlog.h>
 
+#include <list>
 #include <memory>
 #include <string>
 
@@ -141,6 +142,7 @@ class AppCore : public AppCoreBase {
 };
 
 std::unique_ptr<AppCore> __context;
+std::list<std::shared_ptr<AppCoreBase::EventBase>> __event_list;
 
 int __on_control(bundle* b, void* data) {
   return appcore_base_on_control(b);
@@ -236,6 +238,10 @@ extern "C" EXPORT_API int appcore_base_init(appcore_base_ops ops,
     int argc, char** argv, void* data) {
   __context.reset(new AppCore(ops, data));
   try {
+    for (auto& event : __event_list)
+      __context->AddEvent(std::move(event));
+
+    __event_list.clear();
     __context->Init(argc, argv);
   } catch (const std::runtime_error&) {
     return -1;
@@ -274,27 +280,42 @@ extern "C" EXPORT_API appcore_base_event_h appcore_base_add_event(
     enum appcore_base_event event,
     appcore_base_event_cb cb,
     void* data) {
-  if (__context == nullptr)
-    return nullptr;
-
   auto* ev = new std::shared_ptr<AppCore::AppCoreEvent>(
       std::make_shared<AppCore::AppCoreEvent>(event, cb, data));
   if (ev == nullptr)
     return nullptr;
 
-  __context->AddEvent(*ev);
+  if (__context == nullptr) {
+    __event_list.push_back(*ev);
+  } else {
+    __context->AddEvent(*ev);
+  }
+
   return static_cast<appcore_base_event_h>(ev);
 }
 
 extern "C" EXPORT_API int appcore_base_remove_event(
     appcore_base_event_h handle) {
   auto* ev = static_cast<std::shared_ptr<AppCoreBase::EventBase>*>(handle);
-  if (ev == nullptr || __context == nullptr)
+  if (ev == nullptr)
     return -1;
 
-  bool ret = __context->RemoveEvent(*ev);
+  int ret;
+  if (__context == nullptr) {
+    ret = -1;
+    for (auto it = __event_list.begin(); it != __event_list.end(); ++it) {
+      if (*it == *ev) {
+        it = __event_list.erase(it);
+        ret = 0;
+        break;
+      }
+    }
+  } else {
+    ret = (__context->RemoveEvent(*ev) ? 0 : -1);
+  }
+
   delete ev;
-  return ret ? 0 : -1;
+  return ret;
 }
 
 extern "C" DEPRECATED EXPORT_API int appcore_base_raise_event(