[Common] Changed configuration for common profile build
[platform/core/api/webapi-plugins.git] / src / application / application_manager.cc
index c1d84d2..c8c7c25 100644 (file)
@@ -99,13 +99,16 @@ const std::map<std::string, std::string> event_map_ = {
     {SYSTEM_EVENT_DATA_ROAMING_STATE, EVENT_KEY_DATA_ROAMING_STATE},
     {SYSTEM_EVENT_FONT_SET, EVENT_KEY_FONT_SET}};
 
-#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE)
+#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE) || defined(TIZEN_COMMON)
 const int kMaximumBatteryRetrievedObjects = 30;
 const int kMaximumAppsRetrievedObjects = 10;
 const int kDefaultPeriodOfTime = 30;
 #endif
 }
 
+std::set<LaunchAppControlCallbackData*> ApplicationManager::launch_app_control_set_global_{};
+std::mutex ApplicationManager::launch_app_control_set_mutex_{};
+
 ApplicationManager::ApplicationManager(ApplicationInstance& instance)
     : pkgmgr_client_handle_(nullptr),
       pkgmgr_client_uninstall_handle_(nullptr),
@@ -138,10 +141,12 @@ ApplicationManager::~ApplicationManager() {
   // cannot be determined, reply_callback depends on application scenario, which
   // cannot be predicted. Moreover reply_callback is optional and can be called or not,
   // thus callback_data is relesed here at the end of application lifetime.
-  std::for_each(launch_app_control_set.begin(), launch_app_control_set.end(),
+  std::lock_guard<std::mutex> lock(launch_app_control_set_mutex_);
+  std::for_each(launch_app_control_set_.begin(), launch_app_control_set_.end(),
                 [](LaunchAppControlCallbackData* const& data) {
                   LoggerD("Releasing callback data: %p", data);
                   delete data;
+                  launch_app_control_set_global_.erase(data);
                 });
 }
 
@@ -481,8 +486,10 @@ void ApplicationManager::LaunchAppControl(const picojson::value& args) {
 
       LaunchAppControlCallbackData* callback_data =
           static_cast<LaunchAppControlCallbackData*>(user_data);
-      if (!callback_data) {
-        LoggerD("reply_callback failed: user_data is nullptr");
+
+      std::lock_guard<std::mutex> lock(launch_app_control_set_mutex_);
+      if (!launch_app_control_set_global_.count(callback_data)) {
+        LoggerE("Invalid callback_data: %p", callback_data);
         return;
       }
 
@@ -517,6 +524,12 @@ void ApplicationManager::LaunchAppControl(const picojson::value& args) {
     LaunchAppControlCallbackData* callback_data =
         static_cast<LaunchAppControlCallbackData*>(user_data);
 
+    std::lock_guard<std::mutex> lock(launch_app_control_set_mutex_);
+    if (!launch_app_control_set_global_.count(callback_data)) {
+      LoggerE("Invalid callback_data: %p", callback_data);
+      return;
+    }
+
     auto result = utils::TranslateAppControlError(launch_result);
 
     if (result.IsError()) {
@@ -552,7 +565,12 @@ void ApplicationManager::LaunchAppControl(const picojson::value& args) {
     // Moreover reply_callback is optional and can be called or not,
     // thus callback_data is stored for releasing in destructor of ApplicationManager
     // at the end of application lifetime.
-    launch_app_control_set.insert(launch_app_user_data);
+    // We can not be sure whether callbach will not fire after instance destruction,
+    // we store all user_data pointers in static launch_app_control_set_global_ to check
+    // if they are still valid.
+    std::lock_guard<std::mutex> lock(launch_app_control_set_mutex_);
+    launch_app_control_set_.insert(launch_app_user_data);
+    launch_app_control_set_global_.insert(launch_app_user_data);
     LoggerD("App launched, data %p stored for later release", launch_app_user_data);
   }
 }
@@ -1177,7 +1195,7 @@ void ApplicationManager::GetAppSharedUri(const std::string& app_id, picojson::ob
   ReportSuccess(result, *out);
 }
 
-#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE)
+#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE) || defined(TIZEN_COMMON)
 PlatformResult ApplicationManager::BatteryUsageFilter(const picojson::value& args,
                                                       const context_history_filter_h filter,
                                                       context_history_data_e* data_type_out) {
@@ -1365,7 +1383,7 @@ PlatformResult ApplicationManager::AppsUsageAttributes(const context_history_rec
 void ApplicationManager::GetBatteryUsageInfo(const picojson::value& args, picojson::object* out) {
   ScopeLogger();
 
-#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE)
+#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE) || defined(TIZEN_COMMON)
   int callback_id = -1;
   const auto& callback = args.get(kCallbackId);
   if (callback.is<double>()) {
@@ -1404,7 +1422,7 @@ void ApplicationManager::GetBatteryUsageInfo(const picojson::value& args, picojs
 void ApplicationManager::GetAppsUsageInfo(const picojson::value& args, picojson::object* out) {
   ScopeLogger();
 
-#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE)
+#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE) || defined(TIZEN_COMMON)
   int callback_id = static_cast<int>(args.get(kCallbackId).get<double>());
 
   auto get_apps_usage = [args](const std::shared_ptr<picojson::value>& response) -> void {
@@ -1968,7 +1986,7 @@ void ApplicationManager::OnStatusEvent(const char* type, const char* app_id,
   manager->status_callback_(&event);
 }
 
-#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE)
+#if defined(TIZEN_MOBILE) || defined(TIZEN_WEARABLE) || defined(TIZEN_COMMON)
 PlatformResult ApplicationManager::GetContextHistory(
     const picojson::value& args, picojson::object* out,
     common::PlatformResult (*modify_filter_cb)(const picojson::value&,