Use GList in manifest_x structures
[platform/core/appfw/app-installers.git] / src / common / step / step_privilege_compatibility.cc
index b1eb396..baef0bc 100644 (file)
@@ -12,7 +12,7 @@
 #include <memory>
 #include <string>
 
-#include "common/utils/clist_helpers.h"
+#include "common/utils/glist_range.h"
 
 namespace {
 
@@ -24,23 +24,6 @@ const char kPrivForPartner[] =
 const char kPrivForPlatform[] =
     "http://tizen.org/privilege/internal/default/platform";
 
-bool AddPrivilegeToList(manifest_x* m, const char* priv_str) {
-  if (!m->privileges) {
-    m->privileges =
-      reinterpret_cast<privileges_x*>(calloc(1, sizeof(privileges_x*)));
-    if (!m->privileges)
-      return false;
-  }
-  privilege_x* priv =
-      reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
-  if (!priv)
-    return false;
-
-  priv->text = strdup(priv_str);
-  LISTADD(m->privileges->privilege, priv);
-  return true;
-}
-
 bool TranslatePrivilegesForCompatibility(manifest_x* m) {
   if (!m->api_version) {
     LOG(WARNING) << "Skipping privileges mapping because api-version "
@@ -50,26 +33,17 @@ bool TranslatePrivilegesForCompatibility(manifest_x* m) {
   if (strcmp(m->api_version, kPlatformVersion) == 0)
     return true;
 
-  // calculate number of privileges
-  size_t size = 0;
-  privileges_x *privileges = nullptr;
-  PKGMGR_LIST_MOVE_NODE_TO_HEAD(m->privileges, privileges);
-  for (; privileges; privileges = privileges->next) {
-    privilege_x* priv = privileges->privilege;
-    size += PKGMGR_LIST_LEN(priv);
+  // No privileges to map
+  if (!m->privileges) {
+    return true;
   }
 
   // prepare input structure
-  std::unique_ptr<const char*[]> input_privileges(new const char*[size]);
+  std::unique_ptr<const char*[]> input_privileges(
+      new const char*[g_list_length(m->privileges)]);
   size_t input_size = 0;
-  privileges = nullptr;
-  PKGMGR_LIST_MOVE_NODE_TO_HEAD(m->privileges, privileges);
-  for (; privileges; privileges = privileges->next) {
-    privilege_x* priv = nullptr;
-    PKGMGR_LIST_MOVE_NODE_TO_HEAD(privileges->privilege, priv);
-    for (; priv; priv = priv->next) {
-      input_privileges[input_size++] = priv->text;
-    }
+  for (const char* priv : GListRange<char*>(m->privileges)) {
+    input_privileges[input_size++] = priv;
   }
 
   // get mapping
@@ -82,32 +56,11 @@ bool TranslatePrivilegesForCompatibility(manifest_x* m) {
     return false;
   }
 
-  // delete pkgmgr old list
-  privileges = nullptr;
-  privileges_x* privileges_next = nullptr;
-  PKGMGR_LIST_MOVE_NODE_TO_HEAD(m->privileges, privileges);
-  for (; privileges; privileges = privileges_next) {
-    privileges_next = privileges->next;
-    privilege_x* priv = nullptr;
-    privilege_x* next = nullptr;
-    PKGMGR_LIST_MOVE_NODE_TO_HEAD(privileges->privilege, priv);
-    for (; priv; priv = next) {
-      next = priv->next;
-      // mark as const but we actually have ownership
-      free(const_cast<char*>(priv->text));
-      free(priv);
-    }
-    free(privileges);
-  }
-
   // set pkgmgr new list
-  m->privileges =
-      reinterpret_cast<privileges_x*>(calloc(1, sizeof(privileges_x)));
+  g_list_free_full(m->privileges, free);
+  m->privileges = nullptr;
   for (size_t i = 0; i < output_size; ++i) {
-    privilege_x* priv =
-        reinterpret_cast<privilege_x*>(calloc(1, sizeof(privilege_x)));
-    priv->text = strdup(output_privileges[i]);
-    LISTADD(m->privileges->privilege, priv);
+    m->privileges = g_list_append(m->privileges, strdup(output_privileges[i]));
   }
 
   security_manager_privilege_mapping_free(output_privileges, output_size);
@@ -132,16 +85,19 @@ Step::Status StepPrivilegeCompatibility::process() {
   bool ret = true;
   switch (context_->privilege_level.get()) {
     case common_installer::PrivilegeLevel::PUBLIC:
-      ret = AddPrivilegeToList(context_->manifest_data.get(),
-                               kPrivForPublic);
+      context_->manifest_data.get()->privileges =
+          g_list_append(context_->manifest_data.get()->privileges,
+                        strdup(kPrivForPublic));
       break;
     case common_installer::PrivilegeLevel::PARTNER:
-      ret = AddPrivilegeToList(context_->manifest_data.get(),
-                               kPrivForPartner);
+      context_->manifest_data.get()->privileges =
+          g_list_append(context_->manifest_data.get()->privileges,
+                        strdup(kPrivForPartner));
       break;
     case common_installer::PrivilegeLevel::PLATFORM:
-      ret = AddPrivilegeToList(context_->manifest_data.get(),
-                               kPrivForPlatform);
+      context_->manifest_data.get()->privileges =
+          g_list_append(context_->manifest_data.get()->privileges,
+                        strdup(kPrivForPlatform));
       break;
     default:
       // No default privileges for untrusted application.