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";
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,
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<ApplicationListChangedBroker*>(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);
}
}
}
-
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<picojson::object>();
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_) {
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");
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<picojson::object>();
+
+ 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<std::string> app_list_;
std::vector<ApplicationInstance*> app_instance_list_;
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;
}
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.");
}
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.");