Clean-up Multiple process for application control
authorJihoon Chung <jihoon.chung@samsung.com>
Sun, 21 Apr 2013 04:17:54 +0000 (13:17 +0900)
committerGerrit Code Review <gerrit2@kim11>
Sun, 21 Apr 2013 13:29:29 +0000 (22:29 +0900)
[Issue#] N/A
[Problem] N/A
[Cause] N/A
[Solution] Clean-up Multiple process for application control.
This commit change control_index to alloc each page.
[SCMRequest] must be imported with wrt-commons, wrt

Change-Id: I4529abcc52a2325da9c4b972a97250cf7a4dfb1f

src/configuration_parser/widget_parser.cpp
src/jobs/widget_install/task_manifest_file.cpp
src/jobs/widget_install/task_widget_config.cpp
src/jobs/widget_install/task_widget_config.h

index 8e25198..e22f4a6 100644 (file)
@@ -1133,53 +1133,6 @@ class AppControlParser : public ElementParser
         ConfigParserData::AppControlInfo& m_data;
     };
 
-    struct DispositionParser : public ElementParser
-    {
-      public:
-        virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
-                                            const DPL::String& /*name*/)
-        {
-            return &IgnoringParser::Create;
-        }
-
-        virtual void Accept(const Text& /*text*/)
-        {}
-
-        virtual void Accept(const Element& /*element*/)
-        {}
-
-        virtual void Accept(const XmlAttribute& attribute)
-        {
-            if (attribute.name == L"disposition") {
-                if (attribute.value.size() > 0) {
-                    m_value = attribute.value;
-                    NormalizeString(m_value);
-                }
-            }
-        }
-
-        virtual void Verify()
-        {
-            if (m_value.IsNull() || *m_value != L"inline") {
-                m_data.m_disposition = ConfigParserData::AppControlInfo::Disposition::WINDOW;
-            }
-            else {
-                m_data.m_disposition = ConfigParserData::AppControlInfo::Disposition::INLINE;
-            }
-        }
-
-        DispositionParser(ConfigParserData::AppControlInfo& data) :
-            ElementParser(),
-            m_properNamespace(false),
-            m_data(data)
-        {}
-
-      private:
-        bool m_properNamespace;
-        DPL::OptionalString m_value;
-        ConfigParserData::AppControlInfo& m_data;
-    };
-
     virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
                                         const DPL::String& name)
     {
@@ -1192,9 +1145,6 @@ class AppControlParser : public ElementParser
             return DPL::MakeDelegate(this, &AppControlParser::OnUriElement);
         } else if (name == L"mime") {
             return DPL::MakeDelegate(this, &AppControlParser::OnMimeElement);
-        } else if (name == L"disposition") {
-            return DPL::MakeDelegate(this,
-                                     &AppControlParser::OnDispositionElement);
         } else {
             return &IgnoringParser::Create;
         }
@@ -1252,11 +1202,6 @@ class AppControlParser : public ElementParser
         return ElementParserPtr(new MimeParser(m_appControl));
     }
 
-    ElementParserPtr OnDispositionElement()
-    {
-        return ElementParserPtr(new DispositionParser(m_appControl));
-    }
-
     AppControlParser(ConfigParserData& data) :
         ElementParser(),
         m_data(data),
index 9019b5e..0abe0f1 100644 (file)
@@ -133,10 +133,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 +151,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");
@@ -567,31 +587,28 @@ 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);
     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 +618,32 @@ 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);
-
         manifest.addUiApplication(uiApp);
     }
+#else
+    //default widget content
+    setWidgetExecPath(uiApp);
+    setWidgetName(manifest, uiApp);
+    setWidgetIds(manifest, uiApp);
+    setWidgetIcons(uiApp);
+    setWidgetManifest(manifest);
+    setWidgetOtherInfo(uiApp);
+    setAppControlsInfo(uiApp);
+    setAppCategory(uiApp);
+    setLiveBoxInfo(manifest);
+    setAccount(manifest);
+    setPrivilege(manifest);
+
+    manifest.addUiApplication(uiApp);
 #endif
+
     manifest.generate(path);
     LogDebug("Manifest file serialized");
 }
index 1328f07..ac99419 100644 (file)
@@ -20,6 +20,7 @@
  * @brief   Implementation file for installer task widget config
  */
 
+#include <map>
 #include <sstream>
 #include <string>
 #include <sys/stat.h>
@@ -76,6 +77,7 @@ TaskWidgetConfig::TaskWidgetConfig(InstallerContext& installContext) :
     AddStep(&TaskWidgetConfig::ProcessBackgroundPageFile);
     AddStep(&TaskWidgetConfig::ProcessLocalizedIcons);
     AddStep(&TaskWidgetConfig::ProcessWidgetInstalledPath);
+    AddStep(&TaskWidgetConfig::ProcessAppControlInfo);
     AddStep(&TaskWidgetConfig::StepVerifyFeatures);
     AddStep(&TaskWidgetConfig::StepCheckMinVersionInfo);
 }
@@ -167,8 +169,7 @@ void TaskWidgetConfig::ProcessLocalizedStartFiles()
     ProcessStartFile(S(L"index.svg"), S(L"image/svg+xml"));
     ProcessStartFile(S(L"index.xhtml"), S(L"application/xhtml+xml"));
     ProcessStartFile(S(L"index.xht"), S(L"application/xhtml+xml"));
-    // TODO: (l.wrzosek) we need better check if in current locales widget is
-    // valid.
+    // TODO: we need better check if in current locales widget is valid
     FOREACH(it, m_installContext.widgetConfig.localizationData.startFiles) {
         if (it->propertiesForLocales.size() > 0) {
             return;
@@ -360,6 +361,53 @@ void TaskWidgetConfig::ProcessWidgetInstalledPath()
             m_installContext.locations->getPackageInstallationDir());
 }
 
+void TaskWidgetConfig::ProcessAppControlInfo()
+{
+    LogDebug("ProcessAppControlInfo");
+    using namespace WrtDB;
+
+    WrtDB::ConfigParserData::AppControlInfo::Disposition disposition =
+        WrtDB::ConfigParserData::AppControlInfo::Disposition::WINDOW;
+    FOREACH(it, m_installContext.widgetConfig.configInfo.settingsList) {
+        if (!strcmp(DPL::ToUTF8String(it->m_name).c_str(), "nodisplay") &&
+            !strcmp(DPL::ToUTF8String(it->m_value).c_str(), "true"))
+        {
+            disposition =
+                WrtDB::ConfigParserData::AppControlInfo::Disposition::INLINE;
+        }
+    }
+
+    std::map<std::string, int> srcMap;
+    int index = 0;
+    // index = 0 is reserved for start file
+    FOREACH(startFileIt, m_installContext.widgetConfig.localizationData.startFiles)
+    {
+        if (!startFileIt->propertiesForLocales.empty()) {
+            std::string src = DPL::ToUTF8String(startFileIt->path);
+             if (srcMap.find(src) == srcMap.end()) {
+                LogDebug("Insert [" << src << "," << index << "]");
+                srcMap.insert(std::pair<std::string, int>(src, index++));
+            }
+        }
+    }
+
+    FOREACH(appControlIt, m_installContext.widgetConfig.configInfo.appControlList)
+    {
+        appControlIt->m_disposition = disposition;
+        std::string src = DPL::ToUTF8String(appControlIt->m_src);
+        LogDebug("src = [" << src << "]");
+        std::map<std::string, int>::iterator findIt = srcMap.find(src);
+        if (findIt == srcMap.end()) {
+            LogDebug("Insert [" << src << "," << index << "]");
+            srcMap.insert(std::pair<std::string, int>(src, index));
+            appControlIt->m_index = index++;
+        } else {
+            LogDebug("Exist  [" << src << "," << findIt->second << "]");
+            appControlIt->m_index = findIt->second;
+        }
+    }
+}
+
 void TaskWidgetConfig::StepCheckMinVersionInfo()
 {
     if (!isMinVersionCompatible(
index e67ddb2..b267257 100644 (file)
@@ -78,6 +78,7 @@ class TaskWidgetConfig :
     void ProcessLocalizedIcons();
     void ProcessIcon(const WrtDB::ConfigParserData::Icon& icon);
     void ProcessWidgetInstalledPath();
+    void ProcessAppControlInfo();
     void StepVerifyFeatures();
     void StepCheckMinVersionInfo();