[Widget-manifest-parser] Remove LocalManifestData
[platform/core/appfw/app-installers.git] / src / widget-manifest-parser / widget_manifest_parser.cc
index a24903b..dc99aca 100644 (file)
@@ -28,6 +28,7 @@
 
 namespace bf = boost::filesystem;
 namespace keys = common_installer::application_widget_keys;
+namespace parser = common_installer::widget_manifest_parser;
 
 namespace {
 
@@ -47,208 +48,63 @@ const char kErrMsgNoMandatoryKey[] =
 const char kName[] = "name";
 const char kShortName[] = "shortName";
 const char kVersion[] = "version";
-const char kWidgetPrivilegeFullKey[] = "widget.privilege";
-const char kWidgetPrivilegeNameKey[] = "@name";
 const char kWidgetIconFullKey[] = "widget.icon";
 const char kWidgetIconSrcKey[] = "@src";
 
-class LocalManifestData {
- public:
-  LocalManifestData() {
-    data_.package = package_.c_str();
-    data_.id = id_.c_str();
-    data_.name = name_.c_str();
-    data_.short_name = short_name_.c_str();
-    data_.version = version_.c_str();
-    data_.icon = icon_.c_str();
-    data_.api_version = api_version_.c_str();
-    data_.privilege_count = privilege_list_.size();
-    data_.privilege_list = privilege_list_.data();
-  }
-
-  void SetPackage(const std::string& value) {
-    package_ = value;
-    data_.package = package_.c_str();
-  }
-
-  void SetId(const std::string& value) {
-    id_ = value;
-    data_.id = id_.c_str();
-  }
-
-  void SetName(const std::string& value) {
-    name_ = value;
-    data_.name = name_.c_str();
-  }
-
-  void SetShortName(const std::string& value) {
-    short_name_ = value;
-    data_.short_name = short_name_.c_str();
-  }
-
-  void SetVersion(const std::string& value) {
-    version_ = value;
-    data_.version = version_.c_str();
-  }
-
-  void SetIcon(const std::string& value) {
-    icon_ = value;
-    data_.icon = icon_.c_str();
-  }
-
-  void SetApiVersion(const std::string& value) {
-    api_version_ = value;
-    data_.api_version = api_version_.c_str();
-  }
-
-  void SetPrivileges(const std::set<std::string>& value) {
-    std::copy(value.begin(), value.end(), std::back_inserter(privileges_));
-    privilege_list_.clear();
-    for (const std::string& p : privileges_)
-      privilege_list_.push_back(p.c_str());
-    data_.privilege_count = privilege_list_.size();
-    data_.privilege_list = privilege_list_.data();
-  }
-
-  const ManifestData* GetManifestData() const {
-    return &data_;
-  }
-
- private:
-  std::string package_;
-  std::string id_;
-  std::string name_;
-  std::string short_name_;
-  std::string version_;
-  std::string icon_;
-  std::string api_version_;
-  std::vector<std::string> privileges_;
-  std::vector<const char*> privilege_list_;
-  ManifestData data_;
-
-  DISALLOW_COPY_AND_ASSIGN(LocalManifestData);
-};
-
 typedef std::string LocalError;
 
-class LocalStorage {
- public:
-  static LocalStorage* GetInstance() {
-    static LocalStorage instance;
-    return &instance;
-  }
-
-  const ManifestData* Add(std::shared_ptr<LocalManifestData> data) {
-    const ManifestData* result = data->GetManifestData();
-    data_vector_.push_back(data);
-    return result;
-  }
-
-  bool Remove(const ManifestData* data) {
-    LocalManifestDataVector::iterator it;
-    for (it = data_vector_.begin(); it != data_vector_.end(); ++it)
-      if ((*it)->GetManifestData() == data) {
-        data_vector_.erase(it);
-        return true;
-      }
-    return false;
-  }
-
-  const char* Add(LocalError* error) {
-    const char* result = error->c_str();
-    error_vector_.push_back(std::shared_ptr<LocalError>(error));
-    return result;
-  }
-
-  bool Remove(const char* error) {
-    ErrorVector::iterator it;
-    for (it = error_vector_.begin(); it != error_vector_.end(); ++it)
-      if ((*it)->c_str() == error) {
-        error_vector_.erase(it);
-        return true;
-      }
-    return false;
-  }
-
- private:
-  typedef std::vector<std::shared_ptr<LocalManifestData>>
-      LocalManifestDataVector;
-  typedef std::vector<std::shared_ptr<LocalError>> ErrorVector;
-
-  LocalManifestDataVector data_vector_;
-  ErrorVector error_vector_;
-
-  LocalStorage() { }
-
-  DISALLOW_COPY_AND_ASSIGN(LocalStorage);
-};
-
 void SetError(const std::string& message, const char** error) {
   if (error)
-    *error = LocalStorage::GetInstance()->Add(new std::string(message));
+    *error = strdup(message.c_str());
 }
 
 void SetError(const std::string& message, const std::string& arg,
     const char** error) {
   if (error)
-    *error = LocalStorage::GetInstance()->Add(new std::string(message + arg));
+    *error = strdup((message + arg).c_str());
 }
 
 bool ExtractPackage(
-    const common_installer::widget_manifest_parser::ApplicationData& app_data,
-    std::string* value) {
-  common_installer::widget_manifest_parser::TizenApplicationInfo* info =
-      static_cast<
-      common_installer::widget_manifest_parser::TizenApplicationInfo*>(
+    const parser::ApplicationData& app_data, std::string* value) {
+  parser::TizenApplicationInfo* info =
+      static_cast<parser::TizenApplicationInfo*>(
           app_data.GetManifestData(keys::kTizenApplicationKey));
-  if (!info)
-    return false;
-  *value = info->package();
-  return true;
+  if (info)
+    *value = info->package();
+  return info;
 }
 
 bool ExtractId(
-    const common_installer::widget_manifest_parser::ApplicationData& app_data,
-    std::string* value) {
-  common_installer::widget_manifest_parser::TizenApplicationInfo* info =
-    static_cast<
-        common_installer::widget_manifest_parser::TizenApplicationInfo*>(
-        app_data.GetManifestData(keys::kTizenApplicationKey));
-  if (!info)
-    return false;
-  *value = info->id();
-  return true;
+    const parser::ApplicationData& app_data, std::string* value) {
+  parser::TizenApplicationInfo* info =
+      static_cast<parser::TizenApplicationInfo*>(
+          app_data.GetManifestData(keys::kTizenApplicationKey));
+  if (info)
+    *value = info->id();
+  return info;
 }
 
-bool ExtractName(
-    const common_installer::widget_manifest_parser::ApplicationData& app_data,
-    std::string* value) {
-  common_installer::widget_manifest_parser::WidgetInfo* info =
-    static_cast<common_installer::widget_manifest_parser::WidgetInfo*>(
-        app_data.GetManifestData(keys::kWidgetKey));
+bool ExtractName(const parser::ApplicationData& app_data, std::string* value) {
+  parser::WidgetInfo* info = static_cast<parser::WidgetInfo*>(
+      app_data.GetManifestData(keys::kWidgetKey));
   if (!info)
     return false;
-
   return info->GetWidgetInfo()->GetString(kName, value);
 }
 
-bool ExtractShortName(
-    const common_installer::widget_manifest_parser::ApplicationData& app_data,
-    std::string* value) {
-  common_installer::widget_manifest_parser::WidgetInfo* info =
-    static_cast<common_installer::widget_manifest_parser::WidgetInfo*>(
-        app_data.GetManifestData(keys::kWidgetKey));
+bool ExtractShortName(const parser::ApplicationData& app_data,
+                      std::string* value) {
+  parser::WidgetInfo* info = static_cast<parser::WidgetInfo*>(
+      app_data.GetManifestData(keys::kWidgetKey));
   if (!info)
     return false;
   return info->GetWidgetInfo()->GetString(kShortName, value);
 }
 
-bool ExtractVersion(
-    const common_installer::widget_manifest_parser::ApplicationData& app_data,
-    std::string* value) {
-  common_installer::widget_manifest_parser::WidgetInfo* info =
-    static_cast<common_installer::widget_manifest_parser::WidgetInfo*>(
-        app_data.GetManifestData(keys::kWidgetKey));
+bool ExtractVersion(const parser::ApplicationData& app_data,
+                    std::string* value) {
+  parser::WidgetInfo* info = static_cast<parser::WidgetInfo*>(
+      app_data.GetManifestData(keys::kWidgetKey));
   if (!info)
     return false;
   return info->GetWidgetInfo()->GetString(kVersion, value);
@@ -270,9 +126,8 @@ bool ExtractIconSrc(const common_installer::utils::Value& dict,
   return  true;
 }
 
-bool ExtractIcons(
-    const common_installer::widget_manifest_parser::Manifest& manifest,
-    std::vector<std::string>* value, const char** error) {
+bool ExtractIcons(const parser::Manifest& manifest,
+                  std::vector<std::string>* value, const char** error) {
   common_installer::utils::Value* key_value;
   if (!manifest.Get(kWidgetIconFullKey, &key_value)) {
     value->clear();
@@ -303,12 +158,10 @@ bool ExtractIcons(
   return true;
 }
 
-bool ExtractApiVersion(
-    const common_installer::widget_manifest_parser::ApplicationData& app_data,
-    std::string* value) {
-  common_installer::widget_manifest_parser::TizenApplicationInfo* info =
-    static_cast<
-        common_installer::widget_manifest_parser::TizenApplicationInfo*>(
+bool ExtractApiVersion(const parser::ApplicationData& app_data,
+                       std::string* value) {
+  parser::TizenApplicationInfo* info =
+      static_cast<parser::TizenApplicationInfo*>(
         app_data.GetManifestData(keys::kTizenApplicationKey));
   if (!info)
     return false;
@@ -316,15 +169,13 @@ bool ExtractApiVersion(
   return true;
 }
 
-bool ExtractPrivileges(
-    const common_installer::widget_manifest_parser::ApplicationData& app_data,
-    std::set<std::string>* value, const char** error) {
-    const common_installer::widget_manifest_parser::PermissionsInfo* perm_info =
-        static_cast<common_installer::widget_manifest_parser::PermissionsInfo*>(
+bool ExtractPrivileges(const parser::ApplicationData& app_data,
+                       std::set<std::string>* value, const char** error) {
+  const parser::PermissionsInfo* perm_info =
+       static_cast<parser::PermissionsInfo*>(
             app_data.GetManifestData(keys::kTizenPermissionsKey));
-    common_installer::widget_manifest_parser::PermissionSet permissions =
-         perm_info->GetAPIPermissions();
-    *value = permissions;
+  parser::PermissionSet permissions = perm_info->GetAPIPermissions();
+  *value = permissions;
   return true;
 }
 
@@ -346,21 +197,17 @@ API_EXPORT bool ParseManifest(const char* path,
 
   std::string local_error;
 
-  std::unique_ptr<common_installer::widget_manifest_parser::Manifest> manifest =
-      common_installer::widget_manifest_parser::LoadManifest(
-          path, common_installer::widget_manifest_parser::Manifest::TYPE_WIDGET,
-          &local_error);
+  std::unique_ptr<parser::Manifest> manifest = parser::LoadManifest(
+      path, parser::Manifest::TYPE_WIDGET, &local_error);
   if (!manifest) {
     SetError(local_error, error);
     return false;
   }
 
-  std::shared_ptr<common_installer::widget_manifest_parser::ApplicationData>
-      app_data =
-      common_installer::widget_manifest_parser::ApplicationData::Create(
-          bf::path(), std::string(),
-          common_installer::widget_manifest_parser::ApplicationData::INTERNAL,
-          std::move(manifest), &local_error);
+  std::shared_ptr<parser::ApplicationData> app_data =
+      parser::ApplicationData::Create(bf::path(), std::string(),
+                                      parser::ApplicationData::INTERNAL,
+                                      std::move(manifest), &local_error);
   if (!app_data.get()) {
     SetError(local_error, error);
     return false;
@@ -411,29 +258,41 @@ API_EXPORT bool ParseManifest(const char* path,
     return false;
 
   if (data) {
-    std::shared_ptr<LocalManifestData> local_manifest_data(
-        new LocalManifestData);
-    local_manifest_data->SetPackage(package);
-    local_manifest_data->SetId(id);
-    local_manifest_data->SetName(name);
-    local_manifest_data->SetShortName(short_name);
-    local_manifest_data->SetVersion(version);
-    local_manifest_data->SetIcon(icons.empty() ? "" : icons.front());
-    local_manifest_data->SetApiVersion(api_version);
-    local_manifest_data->SetPrivileges(privileges);
-    *data = LocalStorage::GetInstance()->Add(local_manifest_data);
+    ManifestData* manifest_data = new ManifestData;
+    manifest_data->package = strdup(package.c_str());
+    manifest_data->id = strdup(id.c_str());
+    manifest_data->name = strdup(name.c_str());
+    manifest_data->short_name = strdup(short_name.c_str());
+    manifest_data->version = strdup(version.c_str());
+    manifest_data->icon =
+        icons.empty() ? strdup("") : strdup(icons.front().c_str());
+    manifest_data->api_version = strdup(api_version.c_str());
+    manifest_data->privilege_count = privileges.size();
+    manifest_data->privilege_list = new char*[privileges.size()];
+    char** privileges_it = manifest_data->privilege_list;
+    for (const std::string& p : privileges) {
+      *privileges_it = strdup(p.c_str());
+      ++privileges_it;
+    }
+    *data = manifest_data;
   }
 
   return true;
 }
 
-API_EXPORT bool ReleaseData(const ManifestData* data, const char* error) {
-  bool result = true;
-  if (data)
-    result = result && LocalStorage::GetInstance()->Remove(data);
-  if (error)
-    result = result && LocalStorage::GetInstance()->Remove(error);
-  return result;
+API_EXPORT void ReleaseData(const ManifestData* data, const char* error) {
+  free(data->package);
+  free(data->id);
+  free(data->name);
+  free(data->short_name);
+  free(data->version);
+  free(data->icon);
+  free(data->api_version);
+  for (int i = 0; i < data->privilege_count; ++i)
+    free(data->privilege_list[i]);
+  delete[] data->privilege_list;
+  delete data;
+  free((void*)error);
 }
 
 }  // extern "C"