[Release] wrt-installer_0.1.26
[framework/web/wrt-installer.git] / src / jobs / widget_install / task_manifest_file.cpp
index a5124a0..009b315 100644 (file)
@@ -133,18 +133,43 @@ void TaskManifestFile::stepCreateExecFile()
     std::string exec = m_context.locations->getExecFile();
     std::string clientExeStr = GlobalConfig::GetWrtClientExec();
 
+    //default widget
     LogInfo("link -s " << clientExeStr << " " << exec);
-
     errno = 0;
-    if (symlink(clientExeStr.c_str(), exec.c_str()) !=  0)
+    if (symlink(clientExeStr.c_str(), exec.c_str()) != 0)
     {
         int error = errno;
-        if(error)
+        if (error)
             LogPedantic("Failed to make a symbolic name for a file "
                     << "[" <<  DPL::GetErrnoString(error) << "]");
         ThrowMsg(Exceptions::FileOperationFailed,
                 "Symbolic link creating is not done.");
     }
+
+#ifdef MULTIPROCESS_SERVICE_SUPPORT
+    //services
+    std::size_t serviceCount =
+        m_context.widgetConfig.configInfo.appControlList.size();
+    serviceCount += m_context.widgetConfig.configInfo.appServiceList.size();
+    for (std::size_t i = 0; i < serviceCount; ++i) {
+        std::stringstream postfix;
+        postfix << "-__SERVICE_PROCESS__" << i;
+        std::string serviceExec = exec;
+        serviceExec.append(postfix.str());
+        errno = 0;
+        if (symlink(clientExeStr.c_str(), serviceExec.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");
@@ -572,29 +597,100 @@ void TaskManifestFile::writeManifest(const DPL::String & path)
     Manifest manifest;
     UiApplication uiApp;
 
+    //default widget content
     setWidgetExecPath(uiApp);
     setWidgetName(manifest, uiApp);
+    setWidgetIds(manifest, uiApp);
     setWidgetIcons(uiApp);
     setWidgetManifest(manifest);
     setWidgetOtherInfo(uiApp);
-    setAppServiceInfo(uiApp);
-    setAppControlInfo(uiApp);
+#ifndef MULTIPROCESS_SERVICE_SUPPORT
+    setAppServicesInfo(uiApp);
+    setAppControlsInfo(uiApp);
+#endif
     setAppCategory(uiApp);
     setLiveBoxInfo(manifest);
     setAccount(manifest);
     setPrivilege(manifest);
 
     manifest.addUiApplication(uiApp);
+#ifdef MULTIPROCESS_SERVICE_SUPPORT
+    //services AppControl tag
+    ConfigParserData::AppControlInfoList appControlList =
+        m_context.widgetConfig.configInfo.appControlList;
+    unsigned count = 0;
+
+    FOREACH(it, appControlList) {
+        it->m_index = count;
+        UiApplication uiApp;
+
+        uiApp.setTaskmanage(true);
+        uiApp.setNodisplay(true);
+#ifdef MULTIPROCESS_SERVICE_SUPPORT_INLINE
+        uiApp.setTaskmanage(ConfigParserData::AppControlInfo::Disposition::INLINE != it->m_disposition);
+        uiApp.setMultiple(ConfigParserData::AppControlInfo::Disposition::INLINE == it->m_disposition);
+#endif
+        std::stringstream postfix;
+        postfix << "-__SERVICE_PROCESS__" << count++;
+
+        setWidgetExecPath(uiApp, postfix.str());
+        setWidgetName(manifest, uiApp);
+        setWidgetIds(manifest, uiApp, postfix.str());
+        setWidgetIcons(uiApp);
+        setAppControlInfo(uiApp, *it);
+        setAppCategory(uiApp);
+        setAccount(manifest);
+        setPrivilege(manifest);
+
+        manifest.addUiApplication(uiApp);
+    }
+    //TODO: AppService tag will be removed
+    //services AppService tag
+    WrtDB::ConfigParserData::ServiceInfoList appServiceList =
+        m_context.widgetConfig.configInfo.appServiceList;
+    FOREACH(it, appServiceList) {
+        it->m_index = count;
+        UiApplication uiApp;
+
+        uiApp.setTaskmanage(true);
+        uiApp.setNodisplay(true);
+#ifdef MULTIPROCESS_SERVICE_SUPPORT_INLINE
+        uiApp.setTaskmanage(ConfigParserData::ServiceInfo::Disposition::INLINE != it->m_disposition);
+        uiApp.setMultiple(ConfigParserData::ServiceInfo::Disposition::INLINE == it->m_disposition);
+#endif
+
+        std::stringstream postfix;
+        postfix << "-__SERVICE_PROCESS__" << count++;
+
+        setWidgetExecPath(uiApp, postfix.str());
+        setWidgetName(manifest, uiApp);
+        setWidgetIds(manifest, uiApp, postfix.str());
+        setWidgetIcons(uiApp);
+        setAppServiceInfo(uiApp, *it);
+        setAppCategory(uiApp);
+        setAccount(manifest);
+        setPrivilege(manifest);
+
+        manifest.addUiApplication(uiApp);
+    }
+#endif
     manifest.generate(path);
     LogDebug("Manifest file serialized");
 }
 
-void TaskManifestFile::setWidgetExecPath(UiApplication & uiApp)
+void TaskManifestFile::setWidgetExecPath(UiApplication & uiApp,
+                                         const std::string &postfix)
 {
-    uiApp.setExec(DPL::FromASCIIString(m_context.locations->getExecFile()));
+    std::string exec = m_context.locations->getExecFile();
+    if (!postfix.empty()) {
+        exec.append(postfix);
+    }
+    LogDebug("exec = " << exec);
+    uiApp.setExec(DPL::FromASCIIString(exec));
 }
 
-void TaskManifestFile::setWidgetName(Manifest & manifest, UiApplication & uiApp)
+void TaskManifestFile::setWidgetName(Manifest & manifest,
+                                     UiApplication & uiApp)
 {
     bool defaultNameSaved = false;
 
@@ -627,8 +723,17 @@ void TaskManifestFile::setWidgetName(Manifest & manifest, UiApplication & uiApp)
                            name,
                            defaultNameSaved);
     }
+}
+
+void TaskManifestFile::setWidgetIds(Manifest & manifest,
+                                    UiApplication & uiApp,
+                                    const std::string &postfix)
+{
     //appid
     TizenAppId appid = m_context.widgetConfig.tzAppid;
+    if (!postfix.empty()) {
+        appid = DPL::FromUTF8String(DPL::ToUTF8String(appid).append(postfix));
+    }
     uiApp.setAppid(appid);
 
     //extraid
@@ -781,7 +886,7 @@ void TaskManifestFile::setWidgetOtherInfo(UiApplication & uiApp)
     //that were in desktop file
 }
 
-void TaskManifestFile::setAppServiceInfo(UiApplication & uiApp)
+void TaskManifestFile::setAppServicesInfo(UiApplication & uiApp)
 {
     WrtDB::ConfigParserData::ServiceInfoList appServiceList =
         m_context.widgetConfig.configInfo.appServiceList;
@@ -793,21 +898,11 @@ void TaskManifestFile::setAppServiceInfo(UiApplication & uiApp)
 
     // x-tizen-svc=http://tizen.org/appcontrol/operation/pick|NULL|image;
     FOREACH(it, appServiceList) {
-        AppControl appControl;
-        if (!it->m_operation.empty()) {
-            appControl.addOperation(it->m_operation); //TODO: encapsulation?
-        }
-        if (!it->m_scheme.empty()) {
-            appControl.addUri(it->m_scheme);
-        }
-        if (!it->m_mime.empty()) {
-            appControl.addMime(it->m_mime);
-        }
-        uiApp.addAppControl(appControl);
-    }
-}
+        setAppServiceInfo(uiApp, *it);
+     }
+ }
 
-void TaskManifestFile::setAppControlInfo(UiApplication & uiApp)
+void TaskManifestFile::setAppControlsInfo(UiApplication & uiApp)
 {
     WrtDB::ConfigParserData::AppControlInfoList appControlList =
         m_context.widgetConfig.configInfo.appControlList;
@@ -817,24 +912,47 @@ void TaskManifestFile::setAppControlInfo(UiApplication & uiApp)
         return;
     }
 
-    // x-tizen-svc=http://tizen.org/appcontrol/operation/pick|NULL|image;
+     // x-tizen-svc=http://tizen.org/appcontrol/operation/pick|NULL|image;
     FOREACH(it, appControlList) {
-        AppControl appControl;
-        if (!it->m_operation.empty()) {
-            appControl.addOperation(it->m_operation); //TODO: encapsulation?
-        }
-        if (!it->m_uriList.empty()) {
-            FOREACH(uri, it->m_uriList) {
-                appControl.addUri(*uri);
-            }
+        setAppControlInfo(uiApp, *it);
+    }
+}
+
+void TaskManifestFile::setAppServiceInfo(UiApplication & uiApp,
+                                         const ConfigParserData::ServiceInfo & service)
+{
+    AppControl appControl;
+    if (!service.m_operation.empty()) {
+        appControl.addOperation(service.m_operation); //TODO: encapsulation?
+    }
+    if (!service.m_scheme.empty()) {
+        appControl.addUri(service.m_scheme);
+    }
+    if (!service.m_mime.empty()) {
+        appControl.addMime(service.m_mime);
+    }
+    uiApp.addAppControl(appControl);
+}
+
+void TaskManifestFile::setAppControlInfo(UiApplication & uiApp,
+                                         const WrtDB::ConfigParserData::AppControlInfo & service)
+{
+    // x-tizen-svc=http://tizen.org/appcontrol/operation/pick|NULL|image;
+    AppControl appControl;
+    if (!service.m_operation.empty()) {
+        appControl.addOperation(service.m_operation); //TODO: encapsulation?
+    }
+    if (!service.m_uriList.empty()) {
+        FOREACH(uri, service.m_uriList) {
+            appControl.addUri(*uri);
         }
-        if (!it->m_mimeList.empty()) {
-            FOREACH(mime, it->m_mimeList) {
-                appControl.addMime(*mime);
-            }
+    }
+    if (!service.m_mimeList.empty()) {
+        FOREACH(mime, service.m_mimeList) {
+            appControl.addMime(*mime);
         }
-        uiApp.addAppControl(appControl);
     }
+    uiApp.addAppControl(appControl);
 }
 
 void TaskManifestFile::setAppCategory(UiApplication &uiApp)