}
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");
}
}
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,
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;
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