From 786c1f187deee8089bfc3a67880e73e4e51820ad Mon Sep 17 00:00:00 2001 From: Jihoon Chung Date: Sun, 21 Apr 2013 13:17:54 +0900 Subject: [PATCH] Clean-up Multiple process for application control [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 | 55 --------------- src/jobs/widget_install/task_manifest_file.cpp | 95 +++++++++++++++++--------- src/jobs/widget_install/task_widget_config.cpp | 52 +++++++++++++- src/jobs/widget_install/task_widget_config.h | 1 + 4 files changed, 113 insertions(+), 90 deletions(-) diff --git a/src/configuration_parser/widget_parser.cpp b/src/configuration_parser/widget_parser.cpp index 8e25198..e22f4a6 100644 --- a/src/configuration_parser/widget_parser.cpp +++ b/src/configuration_parser/widget_parser.cpp @@ -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), diff --git a/src/jobs/widget_install/task_manifest_file.cpp b/src/jobs/widget_install/task_manifest_file.cpp index 9019b5e..0abe0f1 100644 --- a/src/jobs/widget_install/task_manifest_file.cpp +++ b/src/jobs/widget_install/task_manifest_file.cpp @@ -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"); } diff --git a/src/jobs/widget_install/task_widget_config.cpp b/src/jobs/widget_install/task_widget_config.cpp index 1328f07..ac99419 100644 --- a/src/jobs/widget_install/task_widget_config.cpp +++ b/src/jobs/widget_install/task_widget_config.cpp @@ -20,6 +20,7 @@ * @brief Implementation file for installer task widget config */ +#include #include #include #include @@ -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 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(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::iterator findIt = srcMap.find(src); + if (findIt == srcMap.end()) { + LogDebug("Insert [" << src << "," << index << "]"); + srcMap.insert(std::pair(src, index)); + appControlIt->m_index = index++; + } else { + LogDebug("Exist [" << src << "," << findIt->second << "]"); + appControlIt->m_index = findIt->second; + } + } +} + void TaskWidgetConfig::StepCheckMinVersionInfo() { if (!isMinVersionCompatible( diff --git a/src/jobs/widget_install/task_widget_config.h b/src/jobs/widget_install/task_widget_config.h index e67ddb2..b267257 100644 --- a/src/jobs/widget_install/task_widget_config.h +++ b/src/jobs/widget_install/task_widget_config.h @@ -78,6 +78,7 @@ class TaskWidgetConfig : void ProcessLocalizedIcons(); void ProcessIcon(const WrtDB::ConfigParserData::Icon& icon); void ProcessWidgetInstalledPath(); + void ProcessAppControlInfo(); void StepVerifyFeatures(); void StepCheckMinVersionInfo(); -- 2.7.4