[Release] wrt-installer_0.1.57
[framework/web/wrt-installer.git] / src / jobs / widget_install / task_manifest_file.cpp
index 9019b5e..33b1283 100644 (file)
@@ -33,6 +33,8 @@
 #include <widget_install/job_widget_install.h>
 #include <widget_install/widget_install_errors.h>
 #include <widget_install/widget_install_context.h>
+#include <web_provider_livebox_info.h>
+#include <web_provider_plugin_info.h>
 #include <dpl/wrt-dao-ro/global_config.h>
 #include <dpl/log/log.h>
 #include <dpl/file_input.h>
@@ -109,6 +111,7 @@ TaskManifestFile::TaskManifestFile(InstallerContext &inCont) :
         // for widget update.
         AddStep(&TaskManifestFile::stepBackupIconFiles);
         AddStep(&TaskManifestFile::stepCopyIconFiles);
+        AddStep(&TaskManifestFile::stepCreateExecFile);
         AddStep(&TaskManifestFile::stepGenerateManifest);
         AddStep(&TaskManifestFile::stepParseUpgradedManifest);
         AddStep(&TaskManifestFile::stepUpdateFinalize);
@@ -133,10 +136,15 @@ void TaskManifestFile::stepCreateExecFile()
     std::string exec = m_context.locations->getExecFile();
     std::string clientExeStr = GlobalConfig::GetWrtClientExec();
 
+#ifdef MULTIPROCESS_SERVICE_SUPPORT
     //default widget
-    LogInfo("link -s " << clientExeStr << " " << exec);
+    std::stringstream postfix;
+    postfix << AppControlPrefix::PROCESS_PREFIX << 0;
+    std::string controlExec = exec;
+    controlExec.append(postfix.str());
+
     errno = 0;
-    if (symlink(clientExeStr.c_str(), exec.c_str()) != 0)
+    if (symlink(clientExeStr.c_str(), controlExec.c_str()) != 0)
     {
         int error = errno;
         if (error)
@@ -146,29 +154,44 @@ void TaskManifestFile::stepCreateExecFile()
                 "Symbolic link creating is not done.");
     }
 
-#ifdef MULTIPROCESS_SERVICE_SUPPORT
-    //services
-    std::size_t appcontrolCount =
-        m_context.widgetConfig.configInfo.appControlList.size();
-    for (std::size_t i = 0; i < appcontrolCount; ++i) {
+    // app-control widgets
+    unsigned int indexMax = 0;
+    FOREACH(it, m_context.widgetConfig.configInfo.appControlList) {
+        if (it->m_index > indexMax) {
+            indexMax = it->m_index;
+        }
+    }
+
+    for (std::size_t i = 1; i <= indexMax; ++i) {
         std::stringstream postfix;
-        postfix << "-__SERVICE_PROCESS__" << i;
-        std::string serviceExec = exec;
-        serviceExec.append(postfix.str());
+        postfix << AppControlPrefix::PROCESS_PREFIX << i;
+        std::string controlExec = exec;
+        controlExec.append(postfix.str());
         errno = 0;
-        if (symlink(clientExeStr.c_str(), serviceExec.c_str()) != 0)
-        {
+        if (symlink(clientExeStr.c_str(), controlExec.c_str()) != 0) {
             int error = errno;
-            if (error)
+            if (error) {
                 LogPedantic("Failed to make a symbolic name for a file "
-                        << "[" <<  DPL::GetErrnoString(error) << "]");
+                    << "[" <<  DPL::GetErrnoString(error) << "]");
+            }
             ThrowMsg(Exceptions::FileOperationFailed,
-                    "Symbolic link creating is not done.");
+                     "Symbolic link creating is not done.");
         }
-
+    }
+#else
+    //default widget
+    LogInfo("link -s " << clientExeStr << " " << exec);
+    errno = 0;
+    if (symlink(clientExeStr.c_str(), exec.c_str()) != 0)
+    {
+        int error = errno;
+        if (error)
+            LogPedantic("Failed to make a symbolic name for a file "
+                    << "[" <<  DPL::GetErrnoString(error) << "]");
+        ThrowMsg(Exceptions::FileOperationFailed,
+                "Symbolic link creating is not done.");
     }
 #endif
-
     m_context.job->UpdateProgress(
             InstallerContext::INSTALL_CREATE_EXECFILE,
             "Widget execfile creation Finished");
@@ -285,8 +308,7 @@ void TaskManifestFile::stepBackupIconFiles()
 {
     LogDebug("Backup Icon Files");
 
-    backup_dir << m_context.locations->getPackageInstallationDir();
-    backup_dir << "/" << "backup" << "/";
+    backup_dir << m_context.locations->getBackupDir() << "/";
 
     backupIconFiles();
 
@@ -522,18 +544,22 @@ void TaskManifestFile::stepParseManifest()
 
 void TaskManifestFile::stepParseUpgradedManifest()
 {
-    int code = pkgmgr_parser_parse_manifest_for_upgrade(
-            DPL::ToUTF8String(manifest_file).c_str(), NULL);
+    if (m_context.widgetConfig.packagingType !=
+            PKG_TYPE_HYBRID_WEB_APP)
+    {
+        int code = pkgmgr_parser_parse_manifest_for_upgrade(
+                DPL::ToUTF8String(manifest_file).c_str(), NULL);
 
-    if (code != 0) {
-        LogError("Manifest parser error: " << code);
-        ThrowMsg(Exceptions::ManifestInvalid, "Parser returncode: " << code);
-    }
+        if (code != 0) {
+            LogError("Manifest parser error: " << code);
+            ThrowMsg(Exceptions::ManifestInvalid, "Parser returncode: " << code);
+        }
 
-    m_context.job->UpdateProgress(
-        InstallerContext::INSTALL_CREATE_MANIFEST,
-        "Widget Manifest Parsing Finished");
-    LogDebug("Manifest parsed");
+        m_context.job->UpdateProgress(
+                InstallerContext::INSTALL_CREATE_MANIFEST,
+                "Widget Manifest Parsing Finished");
+        LogDebug("Manifest parsed");
+    }
 }
 
 void TaskManifestFile::commitManifest()
@@ -541,9 +567,7 @@ void TaskManifestFile::commitManifest()
     LogDebug("Commiting manifest file : " << manifest_file);
 
     std::ostringstream destFile;
-    if (m_context.job->getInstallerStruct().m_installMode
-            == InstallMode::INSTALL_MODE_PRELOAD)
-    {
+    if (m_context.mode.rootPath == InstallMode::RootPath::RO) {
         destFile << "/usr/share/packages" << "/"; //TODO constant with path
     } else {
         destFile << "/opt/share/packages" << "/"; //TODO constant with path
@@ -567,31 +591,29 @@ void TaskManifestFile::writeManifest(const DPL::String & path)
     Manifest manifest;
     UiApplication uiApp;
 
+#ifdef MULTIPROCESS_SERVICE_SUPPORT
     //default widget content
-    setWidgetExecPath(uiApp);
+    std::stringstream postfix;
+    // index 0 is reserved
+    postfix << AppControlPrefix::PROCESS_PREFIX << 0;
+    setWidgetExecPath(uiApp, postfix.str());
     setWidgetName(manifest, uiApp);
     setWidgetIds(manifest, uiApp);
     setWidgetIcons(uiApp);
     setWidgetDescription(manifest);
     setWidgetManifest(manifest);
     setWidgetOtherInfo(uiApp);
-#ifndef MULTIPROCESS_SERVICE_SUPPORT
-    setAppControlsInfo(uiApp);
-#endif
     setAppCategory(uiApp);
+    setMetadata(uiApp);
     setLiveBoxInfo(manifest);
     setAccount(manifest);
     setPrivilege(manifest);
-
     manifest.addUiApplication(uiApp);
-#ifdef MULTIPROCESS_SERVICE_SUPPORT
-    //services AppControl tag
+
+    //app-control content
     ConfigParserData::AppControlInfoList appControlList =
         m_context.widgetConfig.configInfo.appControlList;
-    unsigned count = 0;
-
     FOREACH(it, appControlList) {
-        it->m_index = count;
         UiApplication uiApp;
 
         uiApp.setTaskmanage(true);
@@ -601,20 +623,35 @@ void TaskManifestFile::writeManifest(const DPL::String & path)
         uiApp.setMultiple(ConfigParserData::AppControlInfo::Disposition::INLINE == it->m_disposition);
 #endif
         std::stringstream postfix;
-        postfix << "-__SERVICE_PROCESS__" << count++;
-
+        postfix << AppControlPrefix::PROCESS_PREFIX << it->m_index;
         setWidgetExecPath(uiApp, postfix.str());
         setWidgetName(manifest, uiApp);
-        setWidgetIds(manifest, uiApp, postfix.str());
+        setWidgetIds(manifest, uiApp);
         setWidgetIcons(uiApp);
         setAppControlInfo(uiApp, *it);
         setAppCategory(uiApp);
-        setAccount(manifest);
-        setPrivilege(manifest);
-
+        setMetadata(uiApp);
         manifest.addUiApplication(uiApp);
     }
+#else
+    //default widget content
+    setWidgetExecPath(uiApp);
+    setWidgetName(manifest, uiApp);
+    setWidgetIds(manifest, uiApp);
+    setWidgetIcons(uiApp);
+    setWidgetDescription(manifest);
+    setWidgetManifest(manifest);
+    setWidgetOtherInfo(uiApp);
+    setAppControlsInfo(uiApp);
+    setAppCategory(uiApp);
+    setMetadata(uiApp);
+    setLiveBoxInfo(manifest);
+    setAccount(manifest);
+    setPrivilege(manifest);
+
+    manifest.addUiApplication(uiApp);
 #endif
+
     manifest.generate(path);
     LogDebug("Manifest file serialized");
 }
@@ -913,6 +950,21 @@ void TaskManifestFile::setAppCategory(UiApplication &uiApp)
     }
 }
 
+void TaskManifestFile::setMetadata(UiApplication &uiApp)
+{
+    WrtDB::ConfigParserData::MetadataList metadataList =
+        m_context.widgetConfig.configInfo.metadataList;
+
+    if (metadataList.empty()) {
+        LogInfo("Web application doesn't contain metadata");
+        return;
+    }
+    FOREACH(it, metadataList) {
+        MetadataType metadataType(it->key, it->value);
+        uiApp.addMetadata(metadataType);
+    }
+}
+
 void TaskManifestFile::stepAbortParseManifest()
 {
     LogError("[Parse Manifest] Abroting....");
@@ -995,13 +1047,28 @@ void TaskManifestFile::setLiveBoxInfo(Manifest& manifest)
             }
 
             if (ConfigInfo->m_boxInfo.m_boxMouseEvent == L"true") {
-                box.boxMouseEvent = ConfigInfo->m_boxInfo.m_boxMouseEvent;
+                std::string boxType;
+                if (ConfigInfo->m_type == L"") {
+                    // in case of default livebox
+                    boxType = web_provider_livebox_get_default_type();
+                } else {
+                    boxType = DPL::ToUTF8String(ConfigInfo->m_type);
+                }
+
+                int box_scrollable =
+                    web_provider_plugin_get_box_scrollable(boxType.c_str());
+
+                if (box_scrollable) {
+                    box.boxMouseEvent = L"true";
+                } else {
+                    box.boxMouseEvent = L"false";
+                }
             } else {
                 box.boxMouseEvent = L"false";
             }
 
             if (ConfigInfo->m_boxInfo.m_boxTouchEffect == L"true") {
-                box.boxTouchEffect = ConfigInfo->m_boxInfo.m_boxTouchEffect;
+                box.boxTouchEffect = L"true";
             } else {
                 box.boxTouchEffect= L"false";
             }