From: Piotr Czaja Date: Thu, 16 Jul 2015 06:37:11 +0000 (+0200) Subject: [Application] Application uninstall fix X-Git-Tag: submit/tizen/20150917.111818~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=47a041e78c7643f2a20ec741581cd2f533635f62;p=platform%2Fcore%2Fapi%2Fwebapi-plugins.git [Application] Application uninstall fix Change-Id: I1769fffb46b4aa84d8094e4d0fc1853ed1ddc105 Signed-off-by: Piotr Czaja --- diff --git a/src/application/application_manager.cc b/src/application/application_manager.cc index 806b2480..dc3f180b 100755 --- a/src/application/application_manager.cc +++ b/src/application/application_manager.cc @@ -53,6 +53,8 @@ const char* kInstallEvent = PKGMGR_INSTALLER_INSTALL_EVENT_STR; const char* kUpdateEvent = PKGMGR_INSTALLER_UPGRADE_EVENT_STR; const char* kUninstallEvent = PKGMGR_INSTALLER_UNINSTALL_EVENT_STR; +const char* kAppidKey = "appid"; + const std::string kAction = "action"; const std::string kCallbackId = "callbackId"; const std::string kOnInstalled = "oninstalled"; @@ -63,15 +65,14 @@ const std::string kData = "data"; ApplicationManager::ApplicationManager(ApplicationInstance& instance) : pkgmgr_client_handle_(nullptr), + pkgmgrinfo_client_handle_(nullptr), instance_(instance) { LoggerD("Enter"); } ApplicationManager::~ApplicationManager() { LoggerD("Enter"); - if (pkgmgr_client_handle_) { - StopAppInfoEventListener(); - } + StopAppInfoEventListener(); } void ApplicationManager::GetCurrentApplication(const std::string& app_id, @@ -1108,6 +1109,25 @@ class ApplicationListChangedBroker { return 0; } + static int AppUninstallListener(uid_t target_uid, int id, const char* type, const char* package, const char* key, + const char* val, const void* msg, void* data) { + LoggerD("Entered"); + + ApplicationListChangedBroker* that = static_cast(data); + + if (0 == strcasecmp(key, kStartKey)) { + that->HandleUninstallStart(); + } else if (0 == strcasecmp(key, kAppidKey)) { + that->AddUninstalledAppId(val); + } else if (0 == strcasecmp(key, kEndKey)) { + that->HandleUninstallEnd(); + } else { + LoggerD("Ignored key: %s", key); + } + + return 0; + } + void AddApplicationInstance(ApplicationInstance* app_instance) { LoggerD("Entered"); app_instance_list_.push_back(app_instance); @@ -1122,26 +1142,22 @@ class ApplicationListChangedBroker { } } } - private: void HandleStart(const char* event_type, const char* package) { LoggerD("Entered"); app_list_.clear(); set_event_type(event_type); - - if (Event::kUninstalled == event_type_) { - // we need to get information about application ID before it is uninstalled - GetApplicationIdsFromPackage(package); - } } void HandleEnd(const char* package) { LoggerD("Entered"); - if (Event::kUninstalled != event_type_) { - GetApplicationIdsFromPackage(package); + if (Event::kUninstalled == event_type_) { + return; } + GetApplicationIdsFromPackage(package); + for (auto& app_id : app_list_) { picojson::value value = picojson::value(picojson::object()); picojson::object& data_obj = value.get(); @@ -1154,10 +1170,6 @@ class ApplicationListChangedBroker { case Event::kUpdated: data_obj.insert(std::make_pair(kAction, picojson::value(kOnUpdated))); break; - - case Event::kUninstalled: - data_obj.insert(std::make_pair(kAction, picojson::value(kOnUninstalled))); - break; } switch (event_type_) { @@ -1175,10 +1187,6 @@ class ApplicationListChangedBroker { pkgmgrinfo_appinfo_destroy_appinfo(handle); } break; - - case Event::kUninstalled: - data_obj.insert(std::make_pair(kData, picojson::value(app_id))); - break; } data_obj["listenerId"] = picojson::value("ApplicationEventListener"); @@ -1233,6 +1241,36 @@ class ApplicationListChangedBroker { return true; } + void HandleUninstallStart() { + LoggerD("Entered"); + app_list_.clear(); + set_event_type(kUninstallEvent); + } + + void AddUninstalledAppId(const char* app_id) { + LoggerD("Entered"); + if (nullptr != app_id) { + app_list_.push_back(app_id); + } + } + + void HandleUninstallEnd() { + LoggerD("Entered"); + for (auto& app_id : app_list_) { + picojson::value value = picojson::value(picojson::object()); + picojson::object& data_obj = value.get(); + + data_obj.insert(std::make_pair(kAction, picojson::value(kOnUninstalled))); + data_obj.insert(std::make_pair(kData, picojson::value(app_id))); + + data_obj["listenerId"] = picojson::value("ApplicationEventListener"); + + for (auto instance : app_instance_list_) { + instance->PostMessage(value.serialize().c_str()); + } + } + } + Event event_type_; std::vector app_list_; std::vector app_instance_list_; @@ -1243,11 +1281,25 @@ static ApplicationListChangedBroker g_application_list_changed_broker; void ApplicationManager::StartAppInfoEventListener(picojson::object* out) { LoggerD("Entered"); - if (nullptr == pkgmgr_client_handle_) { - pkgmgr_client_handle_ = pkgmgr_client_new(PC_LISTENING); - + if (nullptr == pkgmgr_client_handle_ || nullptr == pkgmgrinfo_client_handle_) { if (nullptr == pkgmgr_client_handle_) { + pkgmgr_client_handle_ = pkgmgr_client_new(PC_LISTENING); + } + + if (nullptr == pkgmgrinfo_client_handle_) { + pkgmgrinfo_client_handle_ = pkgmgrinfo_client_new(PMINFO_LISTENING); + } + + if (nullptr == pkgmgr_client_handle_ || nullptr == pkgmgrinfo_client_handle_) { LoggerE("Failed to register listener."); + if (nullptr != pkgmgr_client_handle_) { + pkgmgr_client_free(pkgmgr_client_handle_); + pkgmgr_client_handle_ = nullptr; + } + else if (nullptr != pkgmgrinfo_client_handle_) { + pkgmgrinfo_client_free(pkgmgrinfo_client_handle_); + pkgmgrinfo_client_handle_ = nullptr; + } ReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Failed to register listener."), out); return; } @@ -1256,6 +1308,12 @@ void ApplicationManager::StartAppInfoEventListener(picojson::object* out) { pkgmgr_client_listen_status(pkgmgr_client_handle_, ApplicationListChangedBroker::ClientStatusListener, &g_application_list_changed_broker); + + pkgmgrinfo_client_set_status_type(pkgmgrinfo_client_handle_, + PACKAGE_MANAGER_STATUS_TYPE_UNINSTALL); + pkgmgrinfo_client_listen_status(pkgmgrinfo_client_handle_, + ApplicationListChangedBroker::AppUninstallListener, + &g_application_list_changed_broker); } else { LoggerD("Broker callback is already registered."); } @@ -1266,9 +1324,15 @@ void ApplicationManager::StartAppInfoEventListener(picojson::object* out) { void ApplicationManager::StopAppInfoEventListener() { LoggerD("Entered"); - if (nullptr != pkgmgr_client_handle_) { - pkgmgr_client_free(pkgmgr_client_handle_); - pkgmgr_client_handle_ = nullptr; + if (nullptr != pkgmgr_client_handle_ || nullptr != pkgmgrinfo_client_handle_) { + if (nullptr != pkgmgr_client_handle_) { + pkgmgr_client_free(pkgmgr_client_handle_); + pkgmgr_client_handle_ = nullptr; + } + if (nullptr != pkgmgrinfo_client_handle_) { + pkgmgrinfo_client_free(pkgmgrinfo_client_handle_); + pkgmgrinfo_client_handle_ = nullptr; + } g_application_list_changed_broker.RemoveApplicationInstance(&instance_); } else { LoggerD("Broker callback is already unregistered."); diff --git a/src/application/application_manager.h b/src/application/application_manager.h index 1ef1abe6..6229c73b 100755 --- a/src/application/application_manager.h +++ b/src/application/application_manager.h @@ -21,6 +21,8 @@ #include #include +#include +#include #include "common/picojson.h" #include "common/platform_result.h" @@ -56,6 +58,7 @@ class ApplicationManager { char* GetPackageId(const std::string& app_id); pkgmgr_client* pkgmgr_client_handle_; + pkgmgrinfo_client* pkgmgrinfo_client_handle_; ApplicationInstance& instance_; };