Fix provider's OnVanish sender info management logic 91/194091/3
authorhyunho <hhstark.kang@samsung.com>
Thu, 29 Nov 2018 02:55:52 +0000 (11:55 +0900)
committerhyunho <hhstark.kang@samsung.com>
Thu, 29 Nov 2018 08:32:46 +0000 (17:32 +0900)
Change-Id: Iec25052a1460b4a22e9001842cd73c996e5554f6
Signed-off-by: hyunho <hhstark.kang@samsung.com>
watchface-complication-provider/complication-provider-implementation.h
watchface-complication-provider/complication-provider.cc

index 0082f7c..97e6da3 100644 (file)
@@ -68,6 +68,7 @@ class ComplicationProvider::Impl : IGDBus::IGDBusEvent {
     std::list<std::string> sender_privileges_;
     cynara_result privilege_result_;
   };
+  SenderInfo* GetSenderInfo(std::string sender_name, std::string sender_app_id);
 
  private:
   ComplicationProvider* parent_;
index 461fe76..1b3ea43 100644 (file)
@@ -134,17 +134,14 @@ std::list<std::string>& ComplicationProvider::Impl::GetRequiredPrivileges() {
 }
 
 void ComplicationProvider::Impl::OnVanish(const std::string& name) {
-  LOGI("OnVanish %s", name.c_str());
-  auto sender_info = sender_info_.begin();
-
-  for (; sender_info != sender_info_.end(); sender_info++) {
+  LOGW("OnVanish %s", name.c_str());
+  auto sender_info = sender_info_.find(name);
+  if (sender_info != sender_info_.end()) {
     auto si = sender_info->second;
-    if (name.compare(si->GetWatchName()) == 0) {
-      gdbus_.get()->UnWatch(si->GetWatcherID());
-      sender_info_.erase(name);
-      delete si;
-      return;
-    }
+    gdbus_.get()->UnWatch(si->GetWatcherID());
+    sender_info_.erase(name);
+    delete si;
+    LOGW("delete sender info done");
   }
 }
 
@@ -152,6 +149,38 @@ void ComplicationProvider::Impl::OnAppear(const std::string& name,
     const std::string& name_owner) {
 }
 
+ComplicationProvider::Impl::SenderInfo* ComplicationProvider::Impl::GetSenderInfo(
+      std::string sender_name, std::string sender_app_id) {
+  std::string watch_name = util::EncodeStr(util::EncodeType::Name, sender_app_id);
+  if (watch_name.empty()) {
+    LOGE("fail to get watch name");
+    return NULL;
+  }
+
+  auto iter = sender_info_.find(watch_name);
+  SenderInfo* si;
+  if (iter == sender_info_.end()) {
+    int watcher_id = 0;
+    watcher_id = gdbus_.get()->Watch(std::string(sender_app_id), this);
+    try {
+      if (trusted_ && !util::CheckCertificate(sender_app_id)) {
+        LOGE("Permission denied");
+        return NULL;
+      }
+      si = new SenderInfo(sender_name, sender_app_id.c_str(), watcher_id, watch_name);
+      sender_info_[watch_name] = si;
+      LOGI("sender_info added (%s) ", watch_name.c_str());
+    } catch (const std::bad_alloc &ba) {
+      LOGE("SenderInfo::Exception bad_alloc");
+      return NULL;
+    }
+    LOGI("create new sender_info_ ");
+  } else {
+    si = iter->second;
+  }
+  return si;
+}
+
 void ComplicationProvider::Impl::OnSignal(GDBusConnection* connection,
     const std::string& sender_name,
     const std::string& object_path,
@@ -159,7 +188,6 @@ void ComplicationProvider::Impl::OnSignal(GDBusConnection* connection,
     const std::string& signal_name,
     GVariant* parameters) {
   LOGI("%s, %s", sender_name.c_str(), signal_name.c_str());
-  char* sender_app_id;
   int complication_id;
   char* context_raw = NULL;
   int type;
@@ -169,38 +197,19 @@ void ComplicationProvider::Impl::OnSignal(GDBusConnection* connection,
   bool is_valid;
   char num_str[32] = {0, };
   char* shared_data_type;
-  std::string watch_name;
-
-  auto sender_info = sender_info_.find(sender_name);
-  auto si = sender_info->second;
+  char* sender_app_id = NULL;
 
-  if (sender_info == sender_info_.end()) {
-    char* sender_app_id = NULL;
-    int watcher_id = 0;
-
-    g_variant_get_child(parameters, 0, "&s", &sender_app_id);
-    if (sender_app_id == NULL  ||
-        !util::CheckSender(sender_app_id, sender_name, connection)) {
-      LOGE("sender_app_id %s", sender_app_id);
-      return;
-    }
-
-    watcher_id = gdbus_.get()->Watch(std::string(sender_app_id), this);
-    try {
-      if (trusted_ && !util::CheckCertificate(sender_app_id)) {
-        LOGE("Permission denied");
-        return;
-      }
-      watch_name = util::EncodeStr(util::EncodeType::Name, std::string(sender_app_id));
-      si = new SenderInfo(sender_name, sender_app_id, watcher_id, watch_name);
-    } catch (const std::bad_alloc &ba) {
-      LOGE("SenderInfo::Exception bad_alloc");
-      return;
-    }
-    sender_info_[sender_name] = si;
-    LOGI("create new sender_info_ ");
+  g_variant_get_child(parameters, 0, "&s", &sender_app_id);
+  if (sender_app_id == NULL  ||
+      !util::CheckSender(sender_app_id, sender_name, connection)) {
+    LOGE("invalid sender_app_id %s", sender_app_id);
+    return;
   }
 
+  SenderInfo* si = GetSenderInfo(sender_name, std::string(sender_app_id));
+  if (si == NULL)
+    return;
+
   if (si->GetPrivilegeResult() == COMPLICATION_CYNARA_DENIED) {
     /* For performance, the senderInfo does not delete
        Probably the sender will connect again