Keep 'preload' attribute in update case 38/125838/9
authorSangyoon Jang <s89.jang@samsung.com>
Thu, 27 Apr 2017 02:47:10 +0000 (11:47 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Fri, 28 Apr 2017 02:19:15 +0000 (11:19 +0900)
In case of ReadonlyUpdateInstall, ReadonlyUpdateUninstall and
Update preload-rw should keep preload value.

Change-Id: I7f307db3c3dbaf792c9d0806512c11b9dbfc5db7
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
src/common/pkgmgr_query.cc
src/common/pkgmgr_query.h
src/common/step/configuration/step_parse_preload.cc

index 422b25b..e74ed73 100644 (file)
@@ -295,4 +295,24 @@ bool QueryIsUpdatedReadonlyPackage(const std::string& pkg_id, uid_t uid) {
   return is_update;
 }
 
+bool QueryIsPreloadPackage(const std::string& pkg_id, uid_t uid) {
+  pkgmgrinfo_pkginfo_h handle;
+  int ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkg_id.c_str(), uid, &handle);
+  if (ret != PMINFO_R_OK) {
+    if (ret != PMINFO_R_ENOENT)
+      LOG(ERROR) << "Failed to call pkgmgrinfo_pkginfo_get_usr_pkginfo";
+    return false;
+  }
+
+  bool is_preload = false;
+  if (pkgmgrinfo_pkginfo_is_preload(handle, &is_preload) != PMINFO_R_OK) {
+    LOG(ERROR) << "pkgmgrinfo_pkginfo_is_preload failed";
+    pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+    return false;
+  }
+
+  pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+  return is_preload;
+}
+
 }  // namespace common_installer
index 9391780..8c77e5c 100644 (file)
@@ -151,6 +151,17 @@ bool QueryIsDisabledPackage(const std::string& pkg_id, uid_t uid);
  */
 bool QueryIsUpdatedReadonlyPackage(const std::string& pkg_id, uid_t uid);
 
+/**
+ * \brief Adapter interface for external PkgMgr module used for checking
+ *        if given package is preloaded package
+ *
+ * \param pkg_id package id
+ * \param uid user id
+ *
+ * \return true if package is preloaded
+ */
+bool QueryIsPreloadPackage(const std::string& pkg_id, uid_t uid);
+
 }  // namespace common_installer
 
 #endif  // COMMON_PKGMGR_QUERY_H_
index f8218d3..8926e3e 100644 (file)
@@ -14,6 +14,7 @@
 #include <string>
 
 #include "common/pkgmgr_interface.h"
+#include "common/pkgmgr_query.h"
 #include "common/utils/file_util.h"
 
 namespace bf = boost::filesystem;
@@ -44,11 +45,23 @@ ci::Step::Status StepParsePreload::process() {
   if (!preload_val || (preload_val && strlen(preload_val) == 0)) {
     if (preload_val)
       free(context_->manifest_data.get()->preload);
-    if (context_->is_readonly_package.get() ||
-        context_->is_preload_rw_package.get())
-      context_->manifest_data.get()->preload = strdup("true");
-    else
-      context_->manifest_data.get()->preload = strdup("false");
+    RequestType req_type = context_->request_type.get();
+    if (req_type == RequestType::Update ||
+        req_type == RequestType::ManifestDirectUpdate ||
+        req_type == RequestType::ManifestPartialUpdate ||
+        req_type == RequestType::ReadonlyUpdateInstall) {
+      // In case of update, keep preload value
+      bool is_preload = QueryIsPreloadPackage(context_->pkgid.get(),
+          context_->uid.get());
+      context_->manifest_data.get()->preload =
+          strdup(is_preload ? "true" : "false");
+    } else {
+      if (context_->is_readonly_package.get() ||
+          context_->is_preload_rw_package.get())
+        context_->manifest_data.get()->preload = strdup("true");
+      else
+        context_->manifest_data.get()->preload = strdup("false");
+    }
   }
 
   const char* removable_val = context_->manifest_data.get()->removable;