Add sharing AppCoreBase context 00/278400/5
authorChanggyu Choi <changyu.choi@samsung.com>
Wed, 20 Jul 2022 06:12:35 +0000 (15:12 +0900)
committerChanggyu Choi <changyu.choi@samsung.com>
Wed, 20 Jul 2022 08:29:23 +0000 (17:29 +0900)
Some app is using different levels of appcore api together.
This patch is for sharing AppCoreBase context with upper level appcore
api.

Change-Id: I9614d6fa1f9ca1f69c3fa1e805c2213e67f7bdbd
Signed-off-by: Changgyu Choi <changyu.choi@samsung.com>
legacy/src/legacy/appcore_base.cc
tizen-cpp/app-core-cpp/app_core_base.cc
tizen-cpp/app-core-cpp/app_core_base.hh
tizen-cpp/app-core-ui-cpp/app_core_ui_base.hh
unittests/mock/app_core_base_mock.h

index a516bdf..edaa91e 100644 (file)
@@ -141,7 +141,6 @@ class AppCore : public AppCoreBase {
   void* data_;
 };
 
-std::unique_ptr<AppCore> __context;
 std::list<std::shared_ptr<AppCoreBase::EventBase>> __event_list;
 
 int __on_control(bundle* b, void* data) {
@@ -182,67 +181,85 @@ int __on_terminate(void* data) {
 using namespace tizen_cpp;
 
 extern "C" EXPORT_API int appcore_base_on_receive(aul_type type, bundle* b) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
-  return __context->AppCoreBase::OnReceive(type, tizen_base::Bundle(b));
+
+  return context->AppCoreBase::OnReceive(type, tizen_base::Bundle(b));
 }
 
 extern "C" EXPORT_API int appcore_base_on_create(void) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
-  return __context->AppCoreBase::OnCreate();
+
+  return context->AppCoreBase::OnCreate();
 }
 
 extern "C" EXPORT_API int appcore_base_on_control(bundle* b) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
-  return __context->AppCoreBase::OnControl(
+
+  return context->AppCoreBase::OnControl(
       b ? tizen_base::Bundle(b) : tizen_base::Bundle());
 }
 
 extern "C" EXPORT_API int appcore_base_on_terminate(void) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
-  return __context->AppCoreBase::OnTerminate();
+
+  return context->AppCoreBase::OnTerminate();
 }
 
 extern "C" EXPORT_API int appcore_base_on_set_i18n(void) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
-  return __context->AppCoreBase::OnSetI18n();
+
+  return context->AppCoreBase::OnSetI18n();
 }
 
 extern "C" EXPORT_API void appcore_base_on_set_event(
     enum appcore_base_event event) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return;
-  __context->AppCoreBase::OnSetEvent(
+
+  context->AppCoreBase::OnSetEvent(
       static_cast<AppCoreBase::IEvent::Type>(event));
 }
 
 extern "C" EXPORT_API void appcore_base_on_unset_event(
     enum appcore_base_event event) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return;
-  __context->AppCoreBase::OnUnsetEvent(
+
+  context->AppCoreBase::OnUnsetEvent(
       static_cast<AppCoreBase::IEvent::Type>(event));
 }
 
 extern "C" EXPORT_API int appcore_base_on_trim_memory(void) {
-  if (__context.get() == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
-  return __context->AppCoreBase::OnTrimMemory();
+
+  return context->AppCoreBase::OnTrimMemory();
 }
 
+static std::unique_ptr<AppCore> context;
+
 extern "C" EXPORT_API int appcore_base_init(appcore_base_ops ops,
     int argc, char** argv, void* data) {
-  __context.reset(new AppCore(ops, data));
+  context.reset(new AppCore(ops, data));
   try {
     for (auto& event : __event_list)
-      __context->AddEvent(std::move(event));
+      context->AddEvent(std::move(event));
 
     __event_list.clear();
-    __context->Init(argc, argv);
+    context->Init(argc, argv);
   } catch (const std::runtime_error&) {
     return -1;
   }
@@ -251,10 +268,10 @@ extern "C" EXPORT_API int appcore_base_init(appcore_base_ops ops,
 }
 
 extern "C" EXPORT_API void appcore_base_fini(void) {
-  if (__context.get() == nullptr)
+  if (!context)
     return;
-  __context->Fini();
-  __context.reset();
+  context->Fini();
+  context.reset();
 }
 
 extern "C" EXPORT_API appcore_base_ops appcore_base_get_default_ops(void) {
@@ -285,10 +302,11 @@ extern "C" EXPORT_API appcore_base_event_h appcore_base_add_event(
   if (ev == nullptr)
     return nullptr;
 
-  if (__context == nullptr) {
+  auto* context = AppCoreBase::GetContext();
+  if (!context) {
     __event_list.push_back(*ev);
   } else {
-    __context->AddEvent(*ev);
+    context->AddEvent(*ev);
   }
 
   return static_cast<appcore_base_event_h>(ev);
@@ -301,8 +319,10 @@ extern "C" EXPORT_API int appcore_base_remove_event(
     return -1;
 
   int ret;
-  if (__context == nullptr) {
+  auto* context = AppCoreBase::GetContext();
+  if (!context) {
     ret = -1;
+
     for (auto it = __event_list.begin(); it != __event_list.end(); ++it) {
       if (*it == *ev) {
         it = __event_list.erase(it);
@@ -311,7 +331,7 @@ extern "C" EXPORT_API int appcore_base_remove_event(
       }
     }
   } else {
-    ret = (__context->RemoveEvent(*ev) ? 0 : -1);
+    ret = (context->RemoveEvent(*ev) ? 0 : -1);
   }
 
   delete ev;
@@ -322,91 +342,103 @@ extern "C" DEPRECATED EXPORT_API int appcore_base_raise_event(
     void* event,
     enum appcore_base_event type) {
   LOGE("This api was deprecated since 7.0");
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
 
   return 0;
 }
 
 extern "C" EXPORT_API int appcore_base_flush_memory(void) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
 
-  __context->FlushMemory();
+  context->FlushMemory();
   return 0;
 }
 
 extern "C" DEPRECATED EXPORT_API int appcore_base_get_rotation_state(
     enum appcore_base_rm* curr) {
   LOGE("This api was deprecated since 7.0");
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
 
   return 0;
 }
 
 extern "C" EXPORT_API bool appcore_base_is_bg_allowed(void) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return false;
 
-  return __context->IsBgAllowed();
+  return context->IsBgAllowed();
 }
 
 extern "C" EXPORT_API bool appcore_base_is_suspended(void) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return false;
 
-  return __context->IsSuspended();
+  return context->IsSuspended();
 }
 
 extern "C" EXPORT_API void appcore_base_toggle_suspended_state(void) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return;
 
-  __context->ToggleSuspendedState();
+  context->ToggleSuspendedState();
 }
 
 extern "C" EXPORT_API int appcore_base_set_i18n(const char* domain_name,
                                                 const char* dir_name) {
-  if (__context == nullptr || domain_name == nullptr || dir_name == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context || domain_name == nullptr || dir_name == nullptr)
     return -1;
 
-  return __context->SetI18n(domain_name, dir_name);
+  return context->SetI18n(domain_name, dir_name);
 }
 
 extern "C" EXPORT_API void appcore_base_exit(void) {
   aul_status_update(STATUS_DYING);
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return;
 
-  __context->Exit();
+  context->Exit();
 }
 
 extern "C" EXPORT_API void appcore_base_add_suspend_timer(void) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return;
 
-  __context->AddSuspendTimer();
+  context->AddSuspendTimer();
 }
 
 extern "C" EXPORT_API void appcore_base_remove_suspend_timer(void) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return;
 
-  __context->RemoveSuspendTimer();
+  context->RemoveSuspendTimer();
 }
 
 extern "C" EXPORT_API void appcore_base_set_display_state(int display_state) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return;
 
-  __context->SetDisplayState(
+  context->SetDisplayState(
       static_cast<AppCoreBase::DisplayState>(display_state));
 }
 
 extern "C" EXPORT_API int appcore_base_get_display_state(void) {
-  if (__context == nullptr)
+  auto* context = AppCoreBase::GetContext();
+  if (!context)
     return -1;
 
-  return __context->GetDisplayState();
+  return context->GetDisplayState();
 }
index 5bceb80..466c22d 100644 (file)
 #include <cstring>
 #include <list>
 #include <map>
+#include <memory>
 #include <set>
 #include <sstream>
+#include <utility>
 
 #include "app-core-cpp/app_core_base.hh"
 #include "common/glib_private.hh"
 #include "common/log_private.hh"
 
 extern "C" void aul_finalize();
-
 namespace tizen_cpp {
+
+AppCoreBase* AppCoreBase::context_ = nullptr;
+
 namespace {
 
 enum TizenProfile {
@@ -236,9 +240,26 @@ void AppCoreBase::EventBase::SetVal(int val) {
   impl_->val_ = std::move(val);
 }
 
-AppCoreBase::AppCoreBase() : impl_(std::make_unique<AppCoreBase::Impl>(this)) {}
+AppCoreBase::AppCoreBase()
+    : impl_(std::make_unique<AppCoreBase::Impl>(this)) {
+  if (context_ != nullptr) {
+    _E("Context is already initialized");
+  }
+
+  context_ = this;
+}
+
 AppCoreBase::~AppCoreBase() = default;
 
+AppCoreBase* AppCoreBase::GetContext() {
+  if (context_ == nullptr) {
+    _E("Context is not initialized.");
+    return nullptr;
+  }
+
+  return context_;
+}
+
 void AppCoreBase::Impl::ChangeLang() {
   const char* lang = getenv("LANG");
   if (lang == nullptr)
index ebe1d97..815c6ff 100644 (file)
@@ -71,6 +71,7 @@ class EXPORT_API AppCoreBase : public IAppCore, public IMainLoop {
 
   AppCoreBase();
   virtual ~AppCoreBase();
+  static AppCoreBase* GetContext();
 
   virtual void Run(int argc, char** argv);
   virtual void Exit();
@@ -108,6 +109,7 @@ class EXPORT_API AppCoreBase : public IAppCore, public IMainLoop {
  protected:
   void SetCoreDelegator(IAppCore* delegator);
   void SetLoopDelegator(IMainLoop* delegator);
+  static AppCoreBase* context_;
 
  private:
   class Impl;
index 310665b..7ccb6b4 100644 (file)
@@ -42,7 +42,7 @@ class EXPORT_API AppCoreUiBase : public AppCoreBase,
   constexpr static int HINT_WINDOW_ID_CONTROL = 0x40;
   constexpr static int HINT_DUAL_THREAD = 0x80;
 
-  AppCoreUiBase(unsigned int hint);
+  explicit AppCoreUiBase(unsigned int hint);
   virtual ~AppCoreUiBase();
 
   int OnPause() override;
index a80515a..941616d 100644 (file)
@@ -84,4 +84,3 @@ class AppCoreBaseMock : public tizen_cpp::AppCoreBase {
 };
 
 #endif  // UNIT_TESTS_MOCK_APP_CORE_BASE_MOCK_H_
-