Implement disposition element parser
authorJihoon Chung <jihoon.chung@samsaung.com>
Sun, 4 Aug 2013 09:11:01 +0000 (18:11 +0900)
committerJihoon Chung <jihoon.chung@samsaung.com>
Thu, 8 Aug 2013 14:35:54 +0000 (23:35 +0900)
[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 :
  <tizen:app-control>
    <tizen:src name="test.html"/>
    <tizen:operation name="http://tizen.org/appcontrol/operation/test"/>
    <tizen:disposition name="inline"/>
  </tizen:app-control>
dispostion element requires platform level
[SCMRequest] N/A

Change-Id: Ib36215380572afffc23ce831d28488903b5dd4f8

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

index bb4547e..f4135b8 100644 (file)
@@ -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),
index 1c5c77c..1a2b442 100644 (file)
@@ -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: <<Certify Level>> ENTER ===============");
-    if (!checkSettingLevel(getCertifyLevel())) {
+    if (!checkConfigurationLevel(getCertifyLevel())) {
         ThrowMsg(Exceptions::PrivilegeLevelViolation, "setting level violate");
     }
     LogDebug("================ Step: <<Certify Level>> 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)
 {
index d340cb0..ddad9e9 100644 (file)
@@ -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);
 
index ed59d54..221fd1c 100644 (file)
@@ -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<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++;
+            it->m_index = index++;
         } else {
-            LogDebug("Exist  [" << src << "," << findIt->second << "]");
-            appControlIt->m_index = findIt->second;
+            it->m_index = 0;
         }
     }
 }