Fixed app_keys name.(kAccountKey -> kTizenImeKey)
[platform/core/appfw/wgt-backend.git] / src / wgt / step / configuration / step_parse.cc
index c438598..0295903 100644 (file)
@@ -8,7 +8,7 @@
 #include <boost/filesystem/path.hpp>
 
 #include <common/app_installer.h>
-#include <common/backup_paths.h>
+#include <common/paths.h>
 #include <common/installer_context.h>
 #include <common/step/step.h>
 #include <common/utils/glist_range.h>
@@ -82,8 +82,19 @@ void SetApplicationXDefaults(application_x* application) {
   application->submode = strdup("false");
   application->support_disable = strdup("false");
   application->ui_gadget = strdup("false");
+  application->multiple = strdup("false");
 }
 
+template<typename T>
+void AppendLabel(T* root, const std::string& label,
+                 const std::string& locale) {
+  label_x* label_item = reinterpret_cast<label_x*>(calloc(1, sizeof(label_x)));
+  label_item->name = strdup(label.c_str());
+  label_item->text = strdup(label.c_str());
+  label_item->lang = !locale.empty() ?
+      strdup(locale.c_str()) : strdup(DEFAULT_LOCALE);
+  root->label = g_list_append(root->label, label_item);
+}
 }  // namespace
 
 namespace wgt {
@@ -135,16 +146,16 @@ bool StepParse::FillInstallationInfo(manifest_x* manifest) {
 }
 
 bool StepParse::FillIconPaths(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::TizenApplicationInfo> app_info =
-      std::static_pointer_cast<const wgt::parse::TizenApplicationInfo>(
-          parser_->GetManifestData(app_keys::kTizenApplicationKey));
+  auto app_info =
+      GetManifestDataForKey<const wgt::parse::TizenApplicationInfo>(
+             app_keys::kTizenApplicationKey);
   if (!app_info) {
     LOG(ERROR) << "Application info manifest data has not been found.";
     return false;
   }
-  std::shared_ptr<const wgt::parse::ApplicationIconsInfo> icons_info =
-      std::static_pointer_cast<const wgt::parse::ApplicationIconsInfo>(
-          parser_->GetManifestData(app_keys::kIconsKey));
+  auto icons_info =
+      GetManifestDataForKey<const wgt::parse::ApplicationIconsInfo>(
+             app_keys::kIconsKey);
   if (icons_info.get()) {
     for (auto& application_icon : icons_info->icons()) {
       icon_x* icon = reinterpret_cast<icon_x*> (calloc(1, sizeof(icon_x)));
@@ -159,9 +170,10 @@ bool StepParse::FillIconPaths(manifest_x* manifest) {
 }
 
 bool StepParse::FillWidgetInfo(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::WidgetInfo> wgt_info =
-      std::static_pointer_cast<const wgt::parse::WidgetInfo>(
-          parser_->GetManifestData(app_keys::kWidgetKey));
+  auto wgt_info =
+      GetManifestDataForKey<const wgt::parse::WidgetInfo>(
+             app_keys::kWidgetKey);
+
   if (!wgt_info.get()) {
     LOG(ERROR) << "Widget info manifest data has not been found.";
     return false;
@@ -182,29 +194,20 @@ bool StepParse::FillWidgetInfo(manifest_x* manifest) {
   }
 
   for (auto& item : wgt_info->name_set()) {
-    label_x* label = reinterpret_cast<label_x*>(calloc(1, sizeof(label_x)));
-    label->name = strdup(item.second.c_str());
-    label->text = strdup(item.second.c_str());
-    label->lang = !item.first.empty() ?
-        strdup(item.first.c_str()) : strdup(DEFAULT_LOCALE);
-    manifest->label = g_list_append(manifest->label, label);
+    AppendLabel(manifest, item.second, item.first);
   }
 
   manifest->type = strdup("wgt");
   manifest->appsetting = strdup("false");
   manifest->nodisplay_setting = strdup("false");
   manifest->preload = strdup("false");
+  manifest->installed_storage = strdup("installed_internal");
 
   // For wgt package use the long name
+  application_x* app =
+      reinterpret_cast<application_x*>(manifest->application->data);
   for (auto& item : wgt_info->name_set()) {
-    application_x* app =
-        reinterpret_cast<application_x*>(manifest->application->data);
-    label_x* label = reinterpret_cast<label_x*>(calloc(1, sizeof(label_x)));
-    label->name = strdup(item.second.c_str());
-    label->text = strdup(item.second.c_str());
-    label->lang = !item.first.empty() ?
-        strdup(item.first.c_str()) : strdup(DEFAULT_LOCALE);
-    app->label = g_list_append(app->label, label);
+    AppendLabel(app, item.second, item.first);
   }
 
   author_x* author = reinterpret_cast<author_x*>(calloc(1, sizeof(author_x)));
@@ -217,10 +220,9 @@ bool StepParse::FillWidgetInfo(manifest_x* manifest) {
   author->lang = strdup(DEFAULT_LOCALE);
   manifest->author = g_list_append(manifest->author, author);
 
-  std::shared_ptr<const wgt::parse::SettingInfo> settings_info =
-      std::static_pointer_cast<const wgt::parse::SettingInfo>(
-          parser_->GetManifestData(
-              wgt::application_widget_keys::kTizenSettingKey));
+  auto settings_info =
+      GetManifestDataForKey<const wgt::parse::SettingInfo>(
+             wgt::application_widget_keys::kTizenSettingKey);
   if (settings_info) {
     switch (settings_info->install_location()) {
     case wgt::parse::SettingInfo::InstallLocation::AUTO: {
@@ -244,18 +246,19 @@ bool StepParse::FillWidgetInfo(manifest_x* manifest) {
 }
 
 bool StepParse::FillMainApplicationInfo(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::TizenApplicationInfo> app_info =
-      std::static_pointer_cast<const wgt::parse::TizenApplicationInfo>(
-          parser_->GetManifestData(app_keys::kTizenApplicationKey));
+  auto app_info =
+      GetManifestDataForKey<const wgt::parse::TizenApplicationInfo>(
+             app_keys::kTizenApplicationKey);
   if (!app_info) {
     LOG(ERROR) << "Application info manifest data has not been found.";
     return false;
   }
   bool has_watch_catergory = false;
   bool has_ime = false;
-  std::shared_ptr<const wgt::parse::CategoryInfoList> category_info =
-      std::static_pointer_cast<const wgt::parse::CategoryInfoList>(
-          parser_->GetManifestData(app_keys::kTizenCategoryKey));
+  auto category_info =
+      GetManifestDataForKey<const wgt::parse::CategoryInfoList>(
+             app_keys::kTizenCategoryKey);
+
   if (category_info) {
     has_watch_catergory = std::find_if(category_info->categories.begin(),
                                        category_info->categories.end(),
@@ -265,8 +268,8 @@ bool StepParse::FillMainApplicationInfo(manifest_x* manifest) {
     }) != category_info->categories.end();
     has_ime = std::find(category_info->categories.begin(),
                                        category_info->categories.end(),
-                                       kImeCategoryName
-    ) != category_info->categories.end();
+                                       kImeCategoryName)
+        != category_info->categories.end();
   }
 
   // application data
@@ -275,7 +278,6 @@ bool StepParse::FillMainApplicationInfo(manifest_x* manifest) {
   application->component_type =
       has_watch_catergory ? strdup("watchapp") : strdup("uiapp");
   application->mainapp = strdup("true");
-  application->multiple = strdup("false");
   application->appid = strdup(app_info->id().c_str());
   application->nodisplay = has_ime ? strdup("true") : strdup("false");
   application->taskmanage = has_ime ? strdup("false") : strdup("true");
@@ -302,7 +304,8 @@ bool StepParse::FillMainApplicationInfo(manifest_x* manifest) {
     app_icon->lang = strdup(icon->lang);
     application->icon = g_list_append(application->icon, app_icon);
   }
-  manifest->application = g_list_append(manifest->application, application);
+  // guarantees that the main app will be at the begining of the list
+  manifest->application = g_list_insert(manifest->application, application, 0);
 
   manifest->package = strdup(app_info->package().c_str());
   manifest->mainapp_id = strdup(app_info->id().c_str());
@@ -310,27 +313,16 @@ bool StepParse::FillMainApplicationInfo(manifest_x* manifest) {
 }
 
 bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::ServiceList> service_list =
-      std::static_pointer_cast<const wgt::parse::ServiceList>(
-          parser_->GetManifestData(app_keys::kTizenServiceKey));
+  auto service_list =
+      GetManifestDataForKey<const wgt::parse::ServiceList>(
+             app_keys::kTizenServiceKey);
   if (!service_list)
     return true;
-  bool has_ime = false;
-  std::shared_ptr<const wgt::parse::CategoryInfoList> category_info =
-      std::static_pointer_cast<const wgt::parse::CategoryInfoList>(
-          parser_->GetManifestData(app_keys::kTizenCategoryKey));
-  if (category_info) {
-      has_ime = std::find(category_info->categories.begin(),
-                                      category_info->categories.end(),
-                                      kImeCategoryName
-      ) != category_info->categories.end();
-  }
   for (auto& service_info : service_list->services) {
     application_x* application = reinterpret_cast<application_x*>
         (calloc(1, sizeof(application_x)));
     application->component_type = strdup("svcapp");
     application->mainapp = strdup("false");
-    application->multiple = strdup("false");
     application->appid = strdup(service_info.id().c_str());
     application->exec =
         strdup((context_->root_application_path.get() / manifest->package
@@ -340,24 +332,21 @@ bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) {
         service_info.on_boot() ? strdup("true") : strdup("false");
     application->autorestart =
         service_info.auto_restart() ? strdup("true") : strdup("false");
-    application->nodisplay = has_ime ? strdup("true") : strdup("false");
-    application->taskmanage = has_ime ? strdup("false") : strdup("true");
+    application->nodisplay = strdup("false");
+    application->taskmanage = strdup("true");
     SetApplicationXDefaults(application);
     application->ambient_support = strdup("false");
     application->package = strdup(manifest->package);
 
     for (auto& pair : service_info.names()) {
-      label_x* label = reinterpret_cast<label_x*>(calloc(1, sizeof(label_x)));
-      label->lang = !pair.first.empty() ?
-          strdup(pair.first.c_str()) : strdup(DEFAULT_LOCALE);
-      label->name = strdup(pair.second.c_str());
-      label->text = strdup(pair.second.c_str());
-      application->label = g_list_append(application->label, label);
+      AppendLabel(application, pair.second, pair.first);
     }
 
     if (!service_info.icon().empty()) {
+      bf::path icon_path = context_->root_application_path.get()
+          / manifest->package / "res" / "wgt" / service_info.icon();
       icon_x* icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
-      icon->text = strdup(service_info.icon().c_str());
+      icon->text = strdup(icon_path.c_str());
       icon->lang = strdup(DEFAULT_LOCALE);
       application->icon = g_list_append(application->icon, icon);
     }
@@ -383,6 +372,49 @@ bool StepParse::FillServiceApplicationInfo(manifest_x* manifest) {
   return true;
 }
 
+bool StepParse::FillWidgetApplicationInfo(manifest_x* manifest) {
+  auto appwidget_info =
+      GetManifestDataForKey<const wgt::parse::AppWidgetInfo>(
+             wgt::application_widget_keys::kTizenAppWidgetFullKey);
+  if (!appwidget_info)
+    return true;
+  for (auto& app_widget : appwidget_info->app_widgets()) {
+    application_x* application = reinterpret_cast<application_x*>
+        (calloc(1, sizeof(application_x)));
+    application->component_type = strdup("widgetapp");
+    application->mainapp = strdup("false");
+    application->appid = strdup(app_widget.id.c_str());
+    application->exec =
+        strdup((context_->root_application_path.get() / manifest->package
+                / "bin" / application->appid).c_str());
+    application->type = strdup("webapp");
+    application->nodisplay = strdup("true");
+    application->taskmanage = strdup("false");
+    SetApplicationXDefaults(application);
+    application->ambient_support = strdup("false");
+    application->package = strdup(manifest->package);
+
+    if (!app_widget.label.default_value.empty()) {
+      AppendLabel(application, app_widget.label.default_value, std::string());
+    }
+
+    for (auto& pair : app_widget.label.lang_value_map) {
+      AppendLabel(application, pair.second, pair.first);
+    }
+
+    if (!app_widget.icon_src.empty()) {
+      icon_x* icon = reinterpret_cast<icon_x*>(calloc(1, sizeof(icon_x)));
+      icon->text = strdup(app_widget.icon_src.c_str());
+      icon->lang = strdup(DEFAULT_LOCALE);
+      application->icon = g_list_append(application->icon, icon);
+    }
+
+    manifest->application = g_list_append(manifest->application, application);
+  }
+  return true;
+}
+
+
 bool StepParse::FillBackgroundCategoryInfo(manifest_x* manifest) {
   auto manifest_data = parser_->GetManifestData(
       app_keys::kTizenBackgroundCategoryKey);
@@ -405,9 +437,9 @@ bool StepParse::FillBackgroundCategoryInfo(manifest_x* manifest) {
 }
 
 bool StepParse::FillAppControl(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::AppControlInfoList> app_info_list =
-      std::static_pointer_cast<const wgt::parse::AppControlInfoList>(
-          parser_->GetManifestData(app_keys::kTizenApplicationAppControlsKey));
+  auto app_info_list =
+      GetManifestDataForKey<const wgt::parse::AppControlInfoList>(
+             app_keys::kTizenApplicationAppControlsKey);
 
   application_x* app =
       reinterpret_cast<application_x*>(manifest->application->data);
@@ -425,9 +457,9 @@ bool StepParse::FillAppControl(manifest_x* manifest) {
 }
 
 bool StepParse::FillPrivileges(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::PermissionsInfo> perm_info =
-      std::static_pointer_cast<const wgt::parse::PermissionsInfo>(
-          parser_->GetManifestData(app_keys::kTizenPermissionsKey));
+  auto perm_info =
+      GetManifestDataForKey<const wgt::parse::PermissionsInfo>(
+             app_keys::kTizenPermissionsKey);
   std::set<std::string> privileges;
   if (perm_info)
     privileges = ExtractPrivileges(perm_info);
@@ -440,9 +472,9 @@ bool StepParse::FillPrivileges(manifest_x* manifest) {
 }
 
 bool StepParse::FillCategories(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::CategoryInfoList> category_info =
-      std::static_pointer_cast<const wgt::parse::CategoryInfoList>(
-          parser_->GetManifestData(app_keys::kTizenCategoryKey));
+  auto category_info =
+      GetManifestDataForKey<const wgt::parse::CategoryInfoList>(
+             app_keys::kTizenCategoryKey);
   if (!category_info)
     return true;
 
@@ -456,9 +488,9 @@ bool StepParse::FillCategories(manifest_x* manifest) {
 }
 
 bool StepParse::FillMetadata(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::MetaDataInfo> meta_info =
-      std::static_pointer_cast<const wgt::parse::MetaDataInfo>(
-          parser_->GetManifestData(app_keys::kTizenMetaDataKey));
+  auto meta_info =
+      GetManifestDataForKey<const wgt::parse::MetaDataInfo>(
+             app_keys::kTizenMetaDataKey);
   if (!meta_info)
     return true;
 
@@ -468,10 +500,23 @@ bool StepParse::FillMetadata(manifest_x* manifest) {
   return true;
 }
 
+bool StepParse::FillAppWidget() {
+  // This is needed to store preview icons which are not saved into manifest_x
+  WgtBackendData* backend_data =
+      static_cast<WgtBackendData*>(context_->backend_data.get());
+
+  auto appwidget_info =
+      GetManifestDataForKey<const wgt::parse::AppWidgetInfo>(
+             wgt::application_widget_keys::kTizenAppWidgetFullKey);
+  if (appwidget_info)
+    backend_data->appwidgets.set(*appwidget_info);
+  return true;
+}
+
 bool StepParse::FillAccounts(manifest_x* manifest) {
-  std::shared_ptr<const wgt::parse::AccountInfo> account_info =
-      std::static_pointer_cast<const wgt::parse::AccountInfo>(
-          parser_->GetManifestData(app_keys::kAccountKey));
+  auto account_info =
+      GetManifestDataForKey<const wgt::parse::AccountInfo>(
+             app_keys::kAccountKey);
   if (!account_info)
     return true;
   common_installer::AccountInfo info;
@@ -490,8 +535,9 @@ bool StepParse::FillAccounts(manifest_x* manifest) {
 }
 
 bool StepParse::FillImeInfo() {
-  const auto ime_info = std::static_pointer_cast<const wgt::parse::ImeInfo>(
-      parser_->GetManifestData(app_keys::kTizenImeKey));
+  auto ime_info =
+      GetManifestDataForKey<const wgt::parse::ImeInfo>(
+             app_keys::kTizenImeKey);
   if (!ime_info)
     return true;
 
@@ -507,7 +553,7 @@ bool StepParse::FillImeInfo() {
 }
 
 bool StepParse::FillExtraManifestInfo(manifest_x* manifest) {
-  return FillAccounts(manifest) && FillImeInfo();
+  return FillAccounts(manifest) && FillImeInfo() && FillAppWidget();
 }
 
 bool StepParse::FillManifestX(manifest_x* manifest) {
@@ -530,9 +576,11 @@ bool StepParse::FillManifestX(manifest_x* manifest) {
   // TODO(t.iwanek): fix adding ui application element
   // for now adding application service is added here because rest of code
   // assumes that there is one application at manifest->application
-  // so this must execute last
+  // so this must execute last. Don't move it above any item
   if (!FillServiceApplicationInfo(manifest))
     return false;
+  if (!FillWidgetApplicationInfo(manifest))
+    return false;
   if (!FillBackgroundCategoryInfo(manifest))
     return false;
   if (!FillExtraManifestInfo(manifest))
@@ -595,14 +643,12 @@ common_installer::Step::Status StepParse::process() {
   }
 
   // Copy data from ManifestData to InstallerContext
-  std::shared_ptr<const wgt::parse::TizenApplicationInfo> info =
-      std::static_pointer_cast<const wgt::parse::TizenApplicationInfo>(
-          parser_->GetManifestData(
-              wgt::application_widget_keys::kTizenApplicationKey));
-  std::shared_ptr<const wgt::parse::WidgetInfo> wgt_info =
-      std::static_pointer_cast<const wgt::parse::WidgetInfo>(
-          parser_->GetManifestData(
-              wgt::application_widget_keys::kTizenWidgetKey));
+  auto info =
+      GetManifestDataForKey<const wgt::parse::TizenApplicationInfo>(
+              wgt::application_widget_keys::kTizenApplicationKey);
+  auto wgt_info =
+      GetManifestDataForKey<const wgt::parse::WidgetInfo>(
+              wgt::application_widget_keys::kTizenWidgetKey);
 
   std::string name;
   const auto& name_set = wgt_info->name_set();
@@ -631,10 +677,9 @@ common_installer::Step::Status StepParse::process() {
     context_->recovery_info.get().recovery_file->WriteAndCommitFileContent();
   }
 
-  std::shared_ptr<const wgt::parse::PermissionsInfo> perm_info =
-      std::static_pointer_cast<const wgt::parse::PermissionsInfo>(
-          parser_->GetManifestData(
-              wgt::application_widget_keys::kTizenPermissionsKey));
+  auto perm_info =
+      GetManifestDataForKey<const wgt::parse::PermissionsInfo>(
+              wgt::application_widget_keys::kTizenPermissionsKey);
   parser::PermissionSet permissions;
   if (perm_info)
      permissions = perm_info->GetAPIPermissions();
@@ -642,10 +687,9 @@ common_installer::Step::Status StepParse::process() {
   WgtBackendData* backend_data =
       static_cast<WgtBackendData*>(context_->backend_data.get());
 
-  std::shared_ptr<const wgt::parse::SettingInfo> settings_info =
-      std::static_pointer_cast<const wgt::parse::SettingInfo>(
-          parser_->GetManifestData(
-              wgt::application_widget_keys::kTizenSettingKey));
+  auto settings_info =
+      GetManifestDataForKey<const wgt::parse::SettingInfo>(
+              wgt::application_widget_keys::kTizenSettingKey);
   if (settings_info)
     backend_data->settings.set(*settings_info);