From 57344796cceed6fd90492c9000a754ea500ef830 Mon Sep 17 00:00:00 2001 From: Jihoon Chung Date: Sun, 4 Aug 2013 18:11:01 +0900 Subject: [PATCH] Implement disposition element parser [Issue#] N/A [Problem] N/A [Cause] N/A [Solution] Implement disposition element parser disposition element is sub-element of tizen:app-control. element name : tizen:disposition value : inline - application running with submode window - application running with normal state example : dispostion element requires platform level [SCMRequest] N/A Change-Id: Ib36215380572afffc23ce831d28488903b5dd4f8 --- src/configuration_parser/widget_parser.cpp | 66 ++++++++++++++++++++++++++ src/jobs/widget_install/task_certify_level.cpp | 35 +++++++++++++- src/jobs/widget_install/task_certify_level.h | 2 + src/jobs/widget_install/task_widget_config.cpp | 44 ++++------------- 4 files changed, 109 insertions(+), 38 deletions(-) diff --git a/src/configuration_parser/widget_parser.cpp b/src/configuration_parser/widget_parser.cpp index bb4547e..f4135b8 100644 --- a/src/configuration_parser/widget_parser.cpp +++ b/src/configuration_parser/widget_parser.cpp @@ -1071,6 +1071,64 @@ 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"name") { + if (attribute.value.size() > 0) { + m_value = attribute.value; + NormalizeString(m_value); + } + } + } + + virtual void Verify() + { + if (m_value.IsNull() || *m_value == L"") { + return; + } + + DPL::String windowString(L"window"); + DPL::String inlineString(L"inline"); + + if (*m_value == L"window") { + m_data.m_disposition = + ConfigParserData::AppControlInfo::Disposition::WINDOW; + } else if (*m_value == L"inline") { + m_data.m_disposition = + ConfigParserData::AppControlInfo::Disposition::INLINE; + } else { + LogDebug("Ignoring dispostion value " << + DPL::ToUTF8String(*m_value)); + } + } + + 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) { @@ -1083,6 +1141,9 @@ 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; //ignore unknown according to w3c } @@ -1138,6 +1199,11 @@ 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_certify_level.cpp b/src/jobs/widget_install/task_certify_level.cpp index 1c5c77c..1a2b442 100644 --- a/src/jobs/widget_install/task_certify_level.cpp +++ b/src/jobs/widget_install/task_certify_level.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ /* - * @file task_certify.cpp + * @file task_certify_level.cpp * @author Jihoon Chung (jihoon.chung@samgsung.com) * @version * @brief @@ -61,7 +61,7 @@ TaskCertifyLevel::TaskCertifyLevel(InstallerContext &inCont) : void TaskCertifyLevel::stepCertifyLevel() { LogDebug("================ Step: <> ENTER ==============="); - if (!checkSettingLevel(getCertifyLevel())) { + if (!checkConfigurationLevel(getCertifyLevel())) { ThrowMsg(Exceptions::PrivilegeLevelViolation, "setting level violate"); } LogDebug("================ Step: <> DONE ================"); @@ -169,6 +169,18 @@ TaskCertifyLevel::Level TaskCertifyLevel::getCertifyLevel() return level; } +bool TaskCertifyLevel::checkConfigurationLevel( + TaskCertifyLevel::Level level) +{ + if (!checkSettingLevel(level)) { + return false; + } + if (!checkAppcontrolHasDisposition(level)) { + return false; + } + return true; +} + bool TaskCertifyLevel::checkSettingLevel( TaskCertifyLevel::Level level) { @@ -192,6 +204,25 @@ bool TaskCertifyLevel::checkSettingLevel( return true; } +bool TaskCertifyLevel::checkAppcontrolHasDisposition( + TaskCertifyLevel::Level level) +{ + // tizen:disposition -> platform + FOREACH(it, m_contextData.widgetConfig.configInfo.appControlList) { + if (ConfigParserData::AppControlInfo::Disposition::UNDEFINE != + it->m_disposition) + { + if (level < Level::PLATFORM) { + LogError("\"tizen:disposition\" needs \"" << + enumToString(Level::PLATFORM) << + "\" level"); + return false; + } + } + } + return true; +} + std::string TaskCertifyLevel::enumToString( TaskCertifyLevel::Level level) { diff --git a/src/jobs/widget_install/task_certify_level.h b/src/jobs/widget_install/task_certify_level.h index d340cb0..ddad9e9 100644 --- a/src/jobs/widget_install/task_certify_level.h +++ b/src/jobs/widget_install/task_certify_level.h @@ -64,7 +64,9 @@ class TaskCertifyLevel : void getSignatureFiles(const std::string& path, ValidationCore::SignatureFileInfoSet& file); Level getCertifyLevel(); + bool checkConfigurationLevel(Level level); bool checkSettingLevel(Level level); + bool checkAppcontrolHasDisposition(Level level); std::string enumToString(Level level); Level certTypeToLevel(ValidationCore::CertStoreId::Type type); diff --git a/src/jobs/widget_install/task_widget_config.cpp b/src/jobs/widget_install/task_widget_config.cpp index ed59d54..221fd1c 100644 --- a/src/jobs/widget_install/task_widget_config.cpp +++ b/src/jobs/widget_install/task_widget_config.cpp @@ -367,44 +367,16 @@ 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")) + // In case of dispostion is inline, set the seperate execute + int index = 1; + // 0 index is reserved by default execute + FOREACH(it, m_installContext.widgetConfig.configInfo.appControlList) { + if (it->m_disposition == + ConfigParserData::AppControlInfo::Disposition::INLINE) { - 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++; + it->m_index = index++; } else { - LogDebug("Exist [" << src << "," << findIt->second << "]"); - appControlIt->m_index = findIt->second; + it->m_index = 0; } } } -- 2.7.4