2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 * This file have been implemented in compliance with W3C WARP SPEC.
18 * but there are some patent issue between W3C WARP SPEC and APPLE.
19 * so if you want to use this file, refer to the README file in root directory
22 * @file widget_parser.cpp
23 * @author Lukasz Wrzosek (l.wrzosek@samsung.com)
27 #include "widget_parser.h"
28 #include "ignoring_parser.h"
29 #include "deny_all_parser.h"
30 #include <dpl/wrt-dao-ro/config_parser_data.h>
31 #include "libiriwrapper.h"
32 #include <dpl/utils/warp_iri.h>
33 #include <dpl/utils/mime_type_utils.h>
34 #include <language_subtag_rst_tree.h>
37 #include <dpl/log/log.h>
38 #include <dpl/fast_delegate.h>
39 #include <dpl/foreach.h>
44 using namespace WrtDB;
47 static const DPL::String UTF_LRE = L"\x0202a";
48 static const DPL::String UTF_LRO = L"\x0202d";
49 static const DPL::String UTF_RLE = L"\x0202b";
50 static const DPL::String UTF_RLO = L"\x0202e";
51 static const DPL::String UTF_PDF = L"\x0202c";
53 Direction ParseDirAttribute(const XmlAttribute& attribute)
55 Assert(L"dir" == attribute.name);
56 if (L"ltr" == attribute.value) {
58 } else if (L"rtl" == attribute.value) {
60 } else if (L"lro" == attribute.value) {
62 } else if (L"rlo" == attribute.value) {
65 LogWarning("dir attribute has wrong value:" << attribute.value);
70 void UpdateTextWithDirectionMark(Direction direction,
76 *text = UTF_RLO + *text + UTF_PDF;
79 *text = UTF_RLE + *text + UTF_PDF;
82 *text = UTF_LRE + *text + UTF_PDF;
85 *text = UTF_LRO + *text + UTF_PDF;
94 } // namespace Unicode
96 class InnerElementsParser : public ElementParser
99 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
100 const DPL::String& /*name*/)
102 return DPL::MakeDelegate(this, &InnerElementsParser::Other);
105 virtual void Accept(const Element& /*element*/)
108 virtual void Accept(const Text& text)
110 if (m_text.IsNull()) {
113 m_text->value += text.value;
117 virtual void Accept(const XmlAttribute& attribute)
119 if (attribute.name == L"dir") {
120 m_textDirection = Unicode::ParseDirAttribute(attribute);
124 virtual void Verify()
126 if (!m_text.IsNull()) {
127 Unicode::UpdateTextWithDirectionMark(m_textDirection,
129 m_parentParser->Accept(*m_text);
133 InnerElementsParser(ElementParserPtr parent) :
134 m_parentParser(parent),
135 m_textDirection(Unicode::EMPTY)
138 ElementParserPtr Other()
140 return ElementParserPtr(new InnerElementsParser(
141 std::static_pointer_cast<ElementParser>(
142 shared_from_this())));
146 DPL::Optional<Text> m_text;
147 ElementParserPtr m_parentParser;
148 Unicode::Direction m_textDirection;
151 class NameParser : public ElementParser
154 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
155 const DPL::String& /*name*/)
157 return DPL::MakeDelegate(this, &NameParser::Other);
160 virtual void Accept(const Element& element)
162 m_lang = element.lang;
166 virtual void Accept(const Text& text)
168 if (m_name.IsNull()) {
171 *m_name += text.value;
175 virtual void Accept(const XmlAttribute& attribute)
177 if (attribute.name == L"short") {
178 if (m_shortName.IsNull()) {
179 m_shortName = attribute.value;
181 } else if (attribute.name == L"dir") {
182 m_textDirection = Unicode::ParseDirAttribute(attribute);
186 virtual void Verify()
188 ConfigParserData::LocalizedData& data = m_data.localizedDataSet[m_lang];
189 if (data.name.IsNull()) {
190 NormalizeString(m_name);
191 NormalizeString(m_shortName);
192 if (!m_name.IsNull()) {
193 Unicode::UpdateTextWithDirectionMark(m_textDirection, &*m_name);
196 if (!m_shortName.IsNull()) {
197 Unicode::UpdateTextWithDirectionMark(m_textDirection,
200 data.shortName = m_shortName;
204 NameParser(Unicode::Direction direction,
205 ConfigParserData& data) :
207 m_textDirection(direction)
210 ElementParserPtr Other()
212 return ElementParserPtr(new InnerElementsParser(
213 std::static_pointer_cast<ElementParser>(
214 shared_from_this())));
218 ConfigParserData& m_data;
219 DPL::OptionalString m_name;
220 DPL::OptionalString m_shortName;
221 DPL::OptionalString m_dir;
223 Unicode::Direction m_textDirection;
226 class AccessParser : public ElementParser
235 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
236 const DPL::String& /*name*/)
238 return DPL::MakeDelegate(this, &AccessParser::Other);
241 virtual void Accept(const Element& element)
243 // for tizen web apps WARP should be used
244 if (element.ns == ConfigurationNamespace::W3CWidgetNamespaceName ||
245 element.ns == ConfigurationNamespace::TizenWebAppNamespaceName)
247 m_standardType = STANDARD_TYPE_WARP;
251 virtual void Accept(const Text& /*text*/)
254 void AcceptWac(const XmlAttribute& attribute)
256 if (attribute.name == L"origin") {
257 m_strIRIOrigin = attribute.value;
258 NormalizeString(m_strIRIOrigin);
259 } else if (attribute.name == L"subdomains") {
260 DPL::String normalizedValue = attribute.value;
261 NormalizeString(normalizedValue);
263 if (normalizedValue == L"true") {
264 m_bSubDomainAccess = true;
265 } else if (normalizedValue == L"false") {
266 m_bSubDomainAccess = false;
271 virtual void Accept(const XmlAttribute& attribute)
273 switch (m_standardType) {
274 case STANDARD_TYPE_WARP:
275 AcceptWac(attribute);
278 LogError("Error in Access tag - unknown standard.");
286 iri.set(m_strIRIOrigin, false);
288 if (!iri.isAccessDefinition()) {
289 LogWarning("Access list element: " <<
291 " is not acceptable by WARP" <<
292 "standard and will be ignored!");
296 ConfigParserData::AccessInfo accessInfo(m_strIRIOrigin,
298 //std::pair <ConfigParserData::AccessInfoSet::iterator, bool> ret =
299 m_data.accessInfoSet.insert(accessInfo);
302 virtual void Verify()
304 switch (m_standardType) {
305 case STANDARD_TYPE_WARP:
309 LogError("Error in Access tag - unknown standard.");
314 AccessParser(ConfigParserData& data) :
316 m_bSubDomainAccess(false),
317 m_standardType(STANDARD_TYPE_NONE),
322 ElementParserPtr Other()
324 return ElementParserPtr(new InnerElementsParser(
325 ElementParserPtr(shared_from_this())));
329 DPL::String m_strIRIOrigin;
330 bool m_bSubDomainAccess;
331 StandardType m_standardType;
333 ConfigParserData& m_data;
336 class DescriptionParser : public ElementParser
339 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
340 const DPL::String& /*name*/)
342 return DPL::MakeDelegate(this, &DescriptionParser::Other);
345 virtual void Accept(const Element& element)
347 m_lang = element.lang;
351 ElementParserPtr Other()
353 return ElementParserPtr(new InnerElementsParser(
354 std::static_pointer_cast<ElementParser>(
355 shared_from_this())));
358 virtual void Accept(const Text& text)
360 if (m_description.IsNull()) {
361 m_description = text.value;
363 *m_description += text.value;
367 virtual void Accept(const XmlAttribute& attribute)
369 if (attribute.name == L"dir") {
370 m_textDirection = Unicode::ParseDirAttribute(attribute);
374 virtual void Verify()
376 ConfigParserData::LocalizedData& data = m_data.localizedDataSet[m_lang];
377 if (data.description.IsNull()) {
378 if (!m_description.IsNull()) {
379 Unicode::UpdateTextWithDirectionMark(m_textDirection,
382 data.description = m_description;
386 DescriptionParser(Unicode::Direction direction,
387 ConfigParserData& data) :
391 m_textDirection(direction)
395 ConfigParserData& m_data;
397 DPL::OptionalString m_description;
398 Unicode::Direction m_textDirection;
401 class AuthorParser : public ElementParser
404 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
405 const DPL::String& /*name*/)
407 return DPL::MakeDelegate(this, &AuthorParser::Other);
410 AuthorParser(Unicode::Direction direction,
411 ConfigParserData& data) :
413 m_textDirection(direction)
416 virtual void Accept(const Element& /*element*/)
421 virtual void Accept(const Text& text)
423 *(m_authorName) += text.value;
426 virtual void Accept(const XmlAttribute& attribute)
428 if (attribute.name == L"href") {
429 //Validate href IRI and ignore it if invalid
430 //See also test: ta-argMozRiC-an
431 LibIri::Wrapper iri(DPL::ToUTF8String(attribute.value).c_str());
432 if (iri.Validate()) {
433 m_authorHref = attribute.value;
435 } else if (attribute.name == L"email") {
436 m_authorEmail = attribute.value;
437 } else if (attribute.name == L"dir") {
438 m_textDirection = Unicode::ParseDirAttribute(attribute);
442 virtual void Verify()
444 if (!m_data.authorName && !m_data.authorHref && !m_data.authorEmail) {
445 NormalizeString(m_authorName);
446 NormalizeString(m_authorHref);
447 NormalizeString(m_authorEmail);
448 if (!!m_authorName) {
449 Unicode::UpdateTextWithDirectionMark(m_textDirection,
451 m_data.authorName = m_authorName;
453 if (!!m_authorHref) {
454 m_data.authorHref = m_authorHref;
456 if (!!m_authorEmail) {
457 m_data.authorEmail = m_authorEmail;
462 ElementParserPtr Other()
464 return ElementParserPtr(new InnerElementsParser(
465 std::static_pointer_cast<ElementParser>(
466 shared_from_this())));
470 ConfigParserData& m_data;
471 DPL::OptionalString m_authorEmail;
472 DPL::OptionalString m_authorHref;
473 DPL::OptionalString m_authorName;
474 Unicode::Direction m_textDirection;
477 class LicenseParser : public ElementParser
480 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
481 const DPL::String& /*name*/)
483 return DPL::MakeDelegate(this, &LicenseParser::Other);
486 LicenseParser(Unicode::Direction direction,
487 ConfigParserData& data) :
490 m_textDirection(direction)
493 virtual void Accept(const Element& element)
495 if (m_license.IsNull()) {
496 m_lang = element.lang;
502 virtual void Accept(const Text& text)
505 *m_license += text.value;
509 virtual void Accept(const XmlAttribute& attribute)
512 if (attribute.name == L"href" && m_licenseHref.IsNull()) {
513 m_licenseHref = attribute.value;
514 } else if (attribute.name == L"file" && m_licenseFile.IsNull()) {
515 m_licenseFile = attribute.value;
516 } else if (attribute.name == L"dir") {
517 m_textDirection = Unicode::ParseDirAttribute(attribute);
522 virtual void Verify()
524 ConfigParserData::LocalizedData& data = m_data.localizedDataSet[m_lang];
525 if (data.license.IsNull()) {
526 if (!m_license.IsNull()) {
527 Unicode::UpdateTextWithDirectionMark(m_textDirection,
530 data.license = m_license;
531 data.licenseHref = m_licenseHref;
532 data.licenseFile = m_licenseFile;
536 ElementParserPtr Other()
538 return ElementParserPtr(new InnerElementsParser(
539 ElementParserPtr(shared_from_this())));
543 ConfigParserData& m_data;
547 DPL::OptionalString m_license;
548 DPL::OptionalString m_licenseFile;
549 DPL::OptionalString m_licenseHref;
550 Unicode::Direction m_textDirection;
553 class IconParser : public ElementParser
555 DECLARE_EXCEPTION_TYPE(ElementParser::Exception::ParseError, BadSrcError)
558 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
559 const DPL::String& /*name*/)
561 return &IgnoringParser::Create;
564 IconParser(ConfigParserData& data) : ElementParser(),
568 virtual void Accept(const Element& /*element*/)
571 virtual void Accept(const XmlAttribute& attribute)
573 if (attribute.name == L"src") {
574 if (attribute.value.size() > 0) {
575 m_src = attribute.value;
577 } else if (attribute.name == L"width") {
578 m_width = ParseSizeAttributeValue(attribute.value);
579 } else if (attribute.name == L"height") {
580 m_height = ParseSizeAttributeValue(attribute.value);
584 virtual void Accept(const Text& /*text*/)
586 ThrowMsg(Exception::ParseError, "Icon element must be empty");
589 virtual void Verify()
591 if (m_src.IsNull()) {
592 LogWarning("src attribute of icon element is mandatory - ignoring");
598 ConfigParserData::Icon icon(delocalizeSrcPath(*m_src));
599 icon.width = m_width;
600 icon.height = m_height;
602 ConfigParserData::IconsList::iterator it = std::find(
603 m_data.iconsList.begin(), m_data.iconsList.end(), icon);
604 if (it == m_data.iconsList.end()) {
605 m_data.iconsList.push_front(icon);
610 LogWarning("src attribute is invalid: " << m_src);
615 ConfigParserData& m_data;
616 DPL::OptionalString m_src;
617 DPL::OptionalInt m_width;
618 DPL::OptionalInt m_height;
620 static DPL::OptionalInt ParseSizeAttributeValue(const DPL::String& value)
622 DPL::OptionalString normalizedValue = value;
623 NormalizeString(normalizedValue);
624 if (!(*normalizedValue).empty()) {
628 strtol(DPL::ToUTF8String(value).c_str(), &reterr, 10);
630 std::string(reterr) == DPL::ToUTF8String(value) ||
633 return DPL::OptionalInt::Null;
638 return DPL::OptionalInt::Null;
642 * @brief delocalizePath removes locales folder from relative path if
644 * @param source source string
646 * @throw BadSrcError if string is bad value of src attribute
648 * @return corrected string
650 static DPL::String delocalizeSrcPath(const DPL::String & source)
652 static const DPL::String localeFolder(L"locales/");
653 static const int index = localeFolder.size();
655 DPL::String result = source;
657 if (source.substr(0, index) == localeFolder) {
658 size_t pos = result.find_first_of('/', index);
659 if (pos != std::string::npos && pos + 1 < source.size()) {
660 result = result.substr(pos + 1, source.size());
669 class ContentParser : public ElementParser
672 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
673 const DPL::String& /*name*/)
675 return &IgnoringParser::Create;
678 ContentParser(ConfigParserData& data) :
683 virtual void Accept(const Element& /*element*/)
686 virtual void Accept(const Text& /*text*/)
689 virtual void Accept(const XmlAttribute& attribute)
691 DPL::String value = attribute.value;
692 NormalizeString(value);
694 if (attribute.name == L"src") {
696 } else if (attribute.name == L"type") {
698 MimeTypeUtils::MimeAttributes mimeAttributes =
699 MimeTypeUtils::getMimeAttributes(value);
700 if (mimeAttributes.count(L"charset") > 0) {
701 m_encoding = mimeAttributes[L"charset"];
703 } else if (attribute.name == L"encoding") {
704 if (!value.empty()) {
710 virtual void Verify()
712 if (m_data.startFileEncountered) {
713 LogWarning("This is not the first encountered "
714 "'content' element - ignoring.");
718 m_data.startFileEncountered = true;
720 //we're consciously setting startFile even if m_src is null or invalid.
721 //WidgetConfigurationManager will deal with this.
722 m_data.startFile = m_src;
725 m_data.startFileContentType = m_type;
727 m_data.startFileEncoding = m_encoding;
729 m_data.startFileEncoding = L"UTF-8";
735 DPL::OptionalString m_src;
736 DPL::OptionalString m_type;
737 DPL::OptionalString m_encoding;
738 ConfigParserData& m_data;
741 class FeatureParser : public ElementParser
744 struct ParamParser : public ElementParser
746 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
747 const DPL::String& /*name*/)
749 return &IgnoringParser::Create;
752 virtual void Accept(const XmlAttribute& attribute)
754 if (attribute.name == L"name") {
755 m_name = attribute.value;
756 NormalizeString(m_name);
757 } else if (attribute.name == L"value") {
758 m_value = attribute.value;
759 NormalizeString(m_value);
763 virtual void Accept(const Element& /*element*/)
766 virtual void Accept(const Text& /*text*/)
768 ThrowMsg(Exception::ParseError, "param element must be empty");
771 virtual void Verify()
773 if (m_name.IsNull() || *m_name == L"") {
776 if (m_value.IsNull() || *m_value == L"") {
780 ConfigParserData::Param param(*m_name);
781 param.value = *m_value;
783 if (m_data.paramsList.find(param) == m_data.paramsList.end()) {
784 m_data.paramsList.insert(param);
788 ParamParser(ConfigParserData::Feature& data) :
794 DPL::OptionalString m_name;
795 DPL::OptionalString m_value;
796 ConfigParserData::Feature& m_data;
799 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
800 const DPL::String& name)
802 if (name == L"param") {
803 return DPL::MakeDelegate(this, &FeatureParser::OnParamElement);
805 return &IgnoringParser::Create;
809 virtual void Accept(const Text& /*text*/)
812 virtual void Accept(const Element& /*element*/)
815 virtual void Accept(const XmlAttribute& attribute)
817 if (attribute.name == L"name") {
818 m_feature.name = attribute.value;
819 } else if (attribute.name == L"required") {
820 if (attribute.value == L"false") {
821 m_feature.required = false;
823 m_feature.required = true;
828 virtual void Verify()
830 LibIri::Wrapper iri(DPL::ToUTF8String(m_feature.name).c_str());
832 if (m_feature.name != L"") {
833 if (iri.Validate()) {
834 if (m_data.featuresList.find(m_feature) ==
835 m_data.featuresList.end())
837 m_data.featuresList.insert(m_feature);
839 LogDebug("Ignoring feature with name" <<
840 DPL::ToUTF8String(m_feature.name));
843 if (m_feature.required) {
844 //Throw only if required
845 ThrowMsg(Exception::ParseError, "invalid feature IRI");
851 ElementParserPtr OnParamElement()
853 return ElementParserPtr(new ParamParser(m_feature));
856 FeatureParser(ConfigParserData& data) :
863 ConfigParserData& m_data;
864 ConfigParserData::Feature m_feature;
867 class PreferenceParser : public ElementParser
870 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
871 const DPL::String& /*name*/)
873 return &IgnoringParser::Create;
876 virtual void Accept(const XmlAttribute& attribute)
878 if (attribute.name == L"name") {
879 m_name = attribute.value;
880 } else if (attribute.name == L"value") {
881 m_value = attribute.value;
882 } else if (attribute.name == L"readonly") {
883 if (attribute.value == L"true") {
891 virtual void Accept(const Element& /*element*/)
894 virtual void Accept(const Text& /*text*/)
896 ThrowMsg(Exception::ParseError, "param element must be empty");
899 virtual void Verify()
901 if (m_name.IsNull()) {
902 LogWarning("preference element must have name attribute");
905 NormalizeString(m_name);
906 NormalizeString(m_value);
907 ConfigParserData::Preference preference(*m_name, m_required);
908 preference.value = m_value;
909 if (m_data.preferencesList.find(preference) ==
910 m_data.preferencesList.end())
912 m_data.preferencesList.insert(preference);
916 PreferenceParser(ConfigParserData& data) :
923 DPL::OptionalString m_name;
924 DPL::OptionalString m_value;
926 ConfigParserData& m_data;
929 class LinkParser : public ElementParser
932 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
933 const DPL::String& /*name*/)
935 return &DenyAllParser::Create;
938 virtual void Accept(const XmlAttribute& attribute)
940 if (m_properNamespace) {
941 LogDebug("attribute");
942 if (attribute.name == L"rel") {
943 if (attribute.value != L"describedby") {
944 ThrowMsg(Exception::ParseError,
945 "rel attribute must have describedby value");
947 } else if (attribute.name == L"type") {} else if (attribute.name ==
950 LogDebug("here is href");
951 m_href = attribute.value;
953 ThrowMsg(Exception::ParseError,
954 "unknown attribute '" +
955 DPL::ToUTF8String(attribute.name) +
956 "' in link element");
961 virtual void Accept(const Element& element)
964 ConfigurationNamespace::WacWidgetNamespaceNameForLinkElement)
966 m_properNamespace = true;
971 virtual void Accept(const Text&)
973 if (m_properNamespace) {
975 ThrowMsg(Exception::ParseError, "link element must be empty");
979 virtual void Verify()
982 ThrowMsg(Exception::ParseError,
983 "link element must have href attribute");
986 LibIri::Wrapper iri(DPL::ToUTF8String(*m_href).c_str());
987 if (!iri.Validate()) { // TODO: Better uri validator ?
988 ThrowMsg(Exception::ParseError,
989 "href attribute must be a valid iri/uri/url");
993 LinkParser(ConfigParserData& data) :
995 m_properNamespace(false),
997 m_href(DPL::OptionalString::Null)
1001 bool m_properNamespace;
1002 ConfigParserData& m_data;
1003 DPL::OptionalString m_href;
1006 class SettingParser : public ElementParser
1009 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1010 const DPL::String& /*name*/)
1012 return &IgnoringParser::Create;
1015 virtual void Accept(const Text& /*text*/)
1018 virtual void Accept(const Element& /*element*/)
1021 virtual void Accept(const XmlAttribute& attribute)
1023 m_setting.m_name = attribute.name;
1024 m_setting.m_value = attribute.value;
1025 m_data.settingsList.insert(m_setting);
1028 virtual void Verify()
1031 SettingParser(ConfigParserData& data) :
1038 ConfigParserData& m_data;
1039 ConfigParserData::Setting m_setting;
1042 class AppServiceParser : public ElementParser
1045 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1046 const DPL::String& /*name*/)
1048 return &IgnoringParser::Create;
1051 virtual void Accept(const XmlAttribute& attribute)
1053 if (attribute.name == L"src") {
1054 m_src = attribute.value;
1055 } else if (attribute.name == L"operation") {
1056 m_operation = attribute.value;
1057 } else if (attribute.name == L"scheme") {
1058 m_scheme = attribute.value;
1059 } else if (attribute.name == L"mime") {
1060 m_mime = attribute.value;
1061 } else if (attribute.name == L"disposition") {
1062 if (attribute.value == L"inline")
1064 ConfigParserData::ServiceInfo::Disposition::INLINE;
1068 virtual void Accept(const Element& element)
1070 LogWarning("namespace for app service = " << element.ns);
1071 if (element.ns == ConfigurationNamespace::W3CWidgetNamespaceName) {
1072 ThrowMsg(Exception::ParseError,
1073 "Wrong xml namespace for widget element");
1077 virtual void Accept(const Text& /*text*/)
1079 ThrowMsg(Exception::ParseError, "param element must be empty");
1082 virtual void Verify()
1084 if (m_src.IsNull()) {
1085 LogWarning("service element must have target attribute");
1087 } else if (m_operation.IsNull()) {
1088 LogWarning("service element must have operation attribute");
1091 NormalizeString(m_src);
1092 NormalizeString(m_operation);
1093 NormalizeString(m_scheme);
1094 NormalizeString(m_mime);
1097 DPL::String ignoreUri(L"file");
1099 if (!m_scheme.IsNull() && *m_scheme == ignoreUri)
1101 LogInfo("exception : '" << *m_scheme << "' scheme will be ignored.");
1102 m_scheme = DPL::OptionalString::Null;
1105 // verify duplicate element
1106 DPL::String wildString(L"*/*");
1107 DPL::String nullString(L"");
1108 ConfigParserData::ServiceInfo serviceInfo(
1109 m_src.IsNull() ? nullString : *m_src,
1110 m_operation.IsNull() ? nullString : *m_operation,
1111 m_scheme.IsNull() ? nullString : *m_scheme,
1112 m_mime.IsNull() ? nullString : *m_mime,
1115 FOREACH(iterator, m_data.appServiceList) {
1116 if (iterator->m_operation == serviceInfo.m_operation &&
1118 (iterator->m_scheme == serviceInfo.m_scheme ||
1119 // check input scheme is "*/*" case
1120 (iterator->m_scheme == wildString &&
1121 serviceInfo.m_scheme != nullString) ||
1122 // check iterator scheme is "*/*" case
1123 (serviceInfo.m_scheme == wildString &&
1124 iterator->m_scheme != nullString)) &&
1126 (iterator->m_mime == serviceInfo.m_mime ||
1127 // check input mime is "*/*" case
1128 (iterator->m_mime == wildString &&
1129 serviceInfo.m_mime != nullString) ||
1130 // check iterator mime is "*/*" case
1131 (serviceInfo.m_mime == wildString &&
1132 iterator->m_mime != nullString)))
1134 ThrowMsg(Exception::ParseError,
1135 "service operation is duplicated " +
1136 DPL::ToUTF8String(*m_operation));
1139 m_data.appServiceList.push_back(serviceInfo);
1142 AppServiceParser(ConfigParserData& data) :
1144 m_src(DPL::OptionalString::Null),
1145 m_operation(DPL::OptionalString::Null),
1146 m_scheme(DPL::OptionalString::Null),
1147 m_mime(DPL::OptionalString::Null),
1148 m_disposition(ConfigParserData::ServiceInfo::Disposition::WINDOW),
1153 DPL::OptionalString m_src;
1154 DPL::OptionalString m_operation;
1155 DPL::OptionalString m_scheme;
1156 DPL::OptionalString m_mime;
1157 ConfigParserData::ServiceInfo::Disposition m_disposition;
1158 ConfigParserData& m_data;
1161 class AppControlParser : public ElementParser
1164 struct SourceParser : public ElementParser
1167 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1168 const DPL::String& /*name*/)
1170 return &IgnoringParser::Create;
1173 virtual void Accept(const Text& /*text*/)
1176 virtual void Accept(const Element& /*element*/)
1179 virtual void Accept(const XmlAttribute& attribute)
1181 if (attribute.name == L"name") {
1182 if (attribute.value.size() > 0) {
1183 m_value = attribute.value;
1184 NormalizeString(m_value);
1189 virtual void Verify()
1191 if (m_value.IsNull() || *m_value == L"") {
1195 m_data.m_src = *m_value;
1198 SourceParser(ConfigParserData::AppControlInfo& data) :
1200 m_properNamespace(false),
1205 bool m_properNamespace;
1206 DPL::OptionalString m_value;
1207 ConfigParserData::AppControlInfo& m_data;
1210 struct OperationParser : public ElementParser
1213 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1214 const DPL::String& /*name*/)
1216 return &IgnoringParser::Create;
1219 virtual void Accept(const Text& /*text*/)
1222 virtual void Accept(const Element& /*element*/)
1225 virtual void Accept(const XmlAttribute& attribute)
1227 if (attribute.name == L"name") {
1228 if (attribute.value.size() > 0) {
1229 m_value = attribute.value;
1230 NormalizeString(m_value);
1235 virtual void Verify()
1237 if (m_value.IsNull() || *m_value == L"") {
1241 m_data.m_operation = *m_value;
1244 OperationParser(ConfigParserData::AppControlInfo& data) :
1246 m_properNamespace(false),
1251 bool m_properNamespace;
1252 DPL::OptionalString m_value;
1253 ConfigParserData::AppControlInfo& m_data;
1256 struct UriParser : public ElementParser
1259 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1260 const DPL::String& /*name*/)
1262 return &IgnoringParser::Create;
1265 virtual void Accept(const Text& /*text*/)
1268 virtual void Accept(const Element& /*element*/)
1271 virtual void Accept(const XmlAttribute& attribute)
1273 if (attribute.name == L"name") {
1274 if (attribute.value.size() > 0) {
1275 m_value = attribute.value;
1276 NormalizeString(m_value);
1281 virtual void Verify()
1284 DPL::String ignoreUri(L"file");
1286 if (!m_value.IsNull() && *m_value == ignoreUri)
1288 LogInfo("exception : '" << *m_value << "' scheme will be ignored.");
1289 m_value = DPL::OptionalString::Null;
1292 if (m_value.IsNull() || *m_value == L"") {
1296 DPL::String wildString(L"*/*");
1297 if ((m_data.m_uriList.find(wildString) == m_data.m_uriList.end())
1298 && (m_data.m_uriList.find(*m_value) == m_data.m_uriList.end()))
1300 m_data.m_uriList.insert(*m_value);
1302 LogDebug("Ignoring uri with name" <<
1303 DPL::ToUTF8String(*m_value));
1307 UriParser(ConfigParserData::AppControlInfo& data) :
1309 m_properNamespace(false),
1314 bool m_properNamespace;
1315 DPL::OptionalString m_value;
1316 ConfigParserData::AppControlInfo& m_data;
1319 struct MimeParser : public ElementParser
1322 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1323 const DPL::String& /*name*/)
1325 return &IgnoringParser::Create;
1328 virtual void Accept(const Text& /*text*/)
1331 virtual void Accept(const Element& /*element*/)
1334 virtual void Accept(const XmlAttribute& attribute)
1336 if (attribute.name == L"name") {
1337 if (attribute.value.size() > 0) {
1338 m_value = attribute.value;
1339 NormalizeString(m_value);
1344 virtual void Verify()
1346 if (m_value.IsNull() || *m_value == L"") {
1350 DPL::String wildString(L"*/*");
1351 if ((m_data.m_mimeList.find(wildString) ==
1352 m_data.m_mimeList.end())
1353 && (m_data.m_mimeList.find(*m_value) ==
1354 m_data.m_mimeList.end()))
1356 m_data.m_mimeList.insert(*m_value);
1358 LogDebug("Ignoring mime with name" <<
1359 DPL::ToUTF8String(*m_value));
1363 MimeParser(ConfigParserData::AppControlInfo& data) :
1365 m_properNamespace(false),
1370 bool m_properNamespace;
1371 DPL::OptionalString m_value;
1372 ConfigParserData::AppControlInfo& m_data;
1375 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1376 const DPL::String& name)
1378 if (name == L"src") {
1379 return DPL::MakeDelegate(this, &AppControlParser::OnSourceElement);
1380 } else if (name == L"operation") {
1381 return DPL::MakeDelegate(this,
1382 &AppControlParser::OnOperationElement);
1383 } else if (name == L"uri") {
1384 return DPL::MakeDelegate(this, &AppControlParser::OnUriElement);
1385 } else if (name == L"mime") {
1386 return DPL::MakeDelegate(this, &AppControlParser::OnMimeElement);
1388 return &IgnoringParser::Create;
1392 virtual void Accept(const XmlAttribute& /*attribute*/)
1395 virtual void Accept(const Element& element)
1397 LogWarning("namespace for app service = " << element.ns);
1398 if (element.ns == ConfigurationNamespace::W3CWidgetNamespaceName) {
1399 ThrowMsg(Exception::ParseError,
1400 "Wrong xml namespace for widget element");
1404 virtual void Accept(const Text& /*text*/)
1406 ThrowMsg(Exception::ParseError, "param element must be empty");
1409 virtual void Verify()
1411 if (m_appControl.m_src == L"") {
1412 LogWarning("service element must have src element");
1416 if (m_appControl.m_operation == L"") {
1417 LogWarning("service element must have operation element");
1421 m_data.appControlList.push_back(m_appControl);
1424 ElementParserPtr OnSourceElement()
1426 return ElementParserPtr(new SourceParser(m_appControl));
1429 ElementParserPtr OnOperationElement()
1431 return ElementParserPtr(new OperationParser(m_appControl));
1434 ElementParserPtr OnUriElement()
1436 return ElementParserPtr(new UriParser(m_appControl));
1439 ElementParserPtr OnMimeElement()
1441 return ElementParserPtr(new MimeParser(m_appControl));
1444 AppControlParser(ConfigParserData& data) :
1451 ConfigParserData& m_data;
1452 ConfigParserData::AppControlInfo m_appControl;
1455 class ApplicationParser : public ElementParser
1458 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1459 const DPL::String& /*name*/)
1461 return &IgnoringParser::Create;
1464 virtual void Accept(const Text& /*text*/)
1466 if (m_properNamespace) {
1468 ThrowMsg(Exception::ParseError, "application element must be empty");
1472 virtual void Accept(const Element& element)
1475 ConfigurationNamespace::TizenWebAppNamespaceName)
1477 m_properNamespace = true;
1479 LogDebug("element");
1482 virtual void Accept(const XmlAttribute& attribute)
1484 if (m_properNamespace) {
1485 LogDebug("attribute");
1486 if (attribute.name == L"id") {
1487 m_id = attribute.value;
1488 NormalizeAndTrimSpaceString(m_id);
1489 } else if (attribute.name == L"package") {
1490 m_package = attribute.value;
1491 } else if (attribute.name == L"required_version") {
1492 m_version = attribute.value;
1493 NormalizeString(m_version);
1495 ThrowMsg(Exception::ParseError,
1496 "unknown attribute '" +
1497 DPL::ToUTF8String(attribute.name) +
1498 "' in application element");
1503 virtual void Verify()
1506 ThrowMsg(Exception::ParseError,
1507 "application element must have id attribute");
1511 m_data.tizenPkgId = m_package;
1515 ThrowMsg(Exception::ParseError,
1516 "application element must have required_version attribute");
1519 //TODO check if id and version format is right
1520 m_data.tizenAppId = m_id;
1521 m_data.tizenMinVersionRequired = m_version;
1524 ApplicationParser(ConfigParserData& data) :
1527 m_id(DPL::OptionalString::Null),
1528 m_version(DPL::OptionalString::Null),
1529 m_properNamespace(false)
1533 ConfigParserData& m_data;
1534 DPL::OptionalString m_id;
1535 DPL::OptionalString m_package;
1536 DPL::OptionalString m_version;
1537 bool m_properNamespace;
1540 class SplashParser : public ElementParser
1543 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1544 const DPL::String& /*name*/)
1546 return &IgnoringParser::Create;
1549 virtual void Accept(const XmlAttribute& attribute)
1551 if (attribute.name == L"src") {
1552 if (attribute.value.size() > 0) {
1553 m_src = attribute.value;
1558 virtual void Accept(const Element& /*element*/)
1561 virtual void Accept(const Text& /*text*/)
1564 virtual void Verify()
1566 if (m_src.IsNull()) {
1568 "src attribute of splash element is mandatory - ignoring");
1572 m_data.splashImgSrc = m_src;
1575 SplashParser(ConfigParserData& data) :
1581 DPL::OptionalString m_src;
1582 ConfigParserData& m_data;
1585 class BackgroundParser : public ElementParser
1588 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1589 const DPL::String& /*name*/)
1591 return &IgnoringParser::Create;
1594 virtual void Accept(const XmlAttribute& attribute)
1596 if (attribute.name == L"src") {
1597 if (attribute.value.size() > 0) {
1598 m_src = attribute.value;
1603 virtual void Accept(const Element& /*element*/)
1606 virtual void Accept(const Text& /*text*/)
1609 virtual void Verify()
1611 if (m_src.IsNull()) {
1613 "src attribute of background element is mandatory - ignoring");
1617 m_data.backgroundPage = m_src;
1620 explicit BackgroundParser(ConfigParserData& data) :
1625 DPL::OptionalString m_src;
1626 ConfigParserData& m_data;
1629 class PrivilegeParser : public ElementParser
1632 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1633 const DPL::String& /*name*/)
1635 return &IgnoringParser::Create;
1638 virtual void Accept(const Text& /*text*/)
1641 virtual void Accept(const Element& element)
1644 ConfigurationNamespace::TizenWebAppNamespaceName)
1646 m_properNamespace = true;
1648 LogDebug("element");
1651 virtual void Accept(const XmlAttribute& attribute)
1653 if (m_properNamespace) {
1654 if (attribute.name == L"name") {
1655 m_feature.name = attribute.value;
1656 m_privilege.name = attribute.value;
1659 m_feature.required = false;
1662 virtual void Verify()
1664 LibIri::Wrapper iri(DPL::ToUTF8String(m_feature.name).c_str());
1666 if (m_feature.name != L"") {
1667 if (iri.Validate()) {
1668 if (m_data.featuresList.find(m_feature) ==
1669 m_data.featuresList.end())
1671 m_data.featuresList.insert(m_feature);
1673 LogDebug("Ignoring feature with name" <<
1674 DPL::ToUTF8String(m_feature.name));
1679 LibIri::Wrapper iriPrivilege(
1680 DPL::ToUTF8String(m_privilege.name).c_str());
1682 if (m_privilege.name != L"") {
1683 if (iriPrivilege.Validate()) {
1684 if (m_data.privilegeList.find(m_privilege) ==
1685 m_data.privilegeList.end())
1687 m_data.privilegeList.insert(m_privilege);
1689 LogDebug("Ignoring privilege with name" <<
1690 DPL::ToUTF8String(m_privilege.name));
1696 PrivilegeParser(ConfigParserData& data) :
1701 m_properNamespace(false)
1705 ConfigParserData& m_data;
1706 ConfigParserData::Feature m_feature;
1707 ConfigParserData::Privilege m_privilege;
1708 bool m_properNamespace;
1711 class CategoryParser : public ElementParser
1714 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1715 const DPL::String& /*name*/)
1717 return &IgnoringParser::Create;
1720 virtual void Accept(const XmlAttribute& attribute)
1722 if (attribute.name == L"name") {
1723 if (attribute.value.size() > 0) {
1724 m_name = attribute.value;
1729 virtual void Accept(const Element& /*element*/)
1732 virtual void Accept(const Text& /*text*/)
1735 virtual void Verify()
1737 if (m_name.IsNull()) {
1739 "name attribute of category element is mandatory - ignoring");
1743 if (m_data.categoryList.find(*m_name) ==
1744 m_data.categoryList.end())
1746 m_data.categoryList.insert(*m_name);
1750 explicit CategoryParser(ConfigParserData& data) :
1755 DPL::OptionalString m_name;
1756 ConfigParserData& m_data;
1759 class LiveboxParser : public ElementParser
1763 struct BoxLabelParser : public ElementParser
1765 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1766 const DPL::String& /*name*/)
1768 return &IgnoringParser::Create;
1771 virtual void Accept(const XmlAttribute& /*attribute*/)
1774 virtual void Accept(const Element& element)
1777 ConfigurationNamespace::TizenWebAppNamespaceName)
1779 m_properNamespace = true;
1783 virtual void Accept(const Text& text)
1785 if (m_properNamespace) {
1786 m_label = text.value;
1790 virtual void Verify()
1792 m_data.m_label = m_label;
1795 BoxLabelParser(ConfigParserData::LiveboxInfo& data) :
1797 m_properNamespace(false),
1802 DPL::String m_label;
1803 bool m_properNamespace;
1804 ConfigParserData::LiveboxInfo& m_data;
1807 struct BoxIconParser : public ElementParser
1809 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1810 const DPL::String& /*name*/)
1812 return &IgnoringParser::Create;
1815 virtual void Accept(const XmlAttribute& attribute)
1817 if (m_properNamespace) {
1818 if (attribute.name == L"src") {
1819 m_icon = attribute.value;
1824 virtual void Accept(const Element& element)
1827 ConfigurationNamespace::TizenWebAppNamespaceName)
1829 m_properNamespace = true;
1833 virtual void Accept(const Text& /*text*/)
1836 virtual void Verify()
1838 m_data.m_icon = m_icon;
1841 explicit BoxIconParser(ConfigParserData::LiveboxInfo& data) :
1843 m_properNamespace(false),
1849 bool m_properNamespace;
1850 ConfigParserData::LiveboxInfo& m_data;
1853 struct BoxContentParser : public ElementParser
1855 struct BoxSizeParser : public ElementParser
1857 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1858 const DPL::String& /*name*/)
1860 return &IgnoringParser::Create;
1863 virtual void Accept(const XmlAttribute& attribute)
1865 if (m_properNamespace) {
1866 if (attribute.name == L"preview") {
1867 m_preview = attribute.value;
1872 virtual void Accept(const Element& element)
1875 ConfigurationNamespace::TizenWebAppNamespaceName)
1877 m_properNamespace = true;
1881 virtual void Accept(const Text& text)
1883 if (m_properNamespace) {
1884 m_size = text.value;
1888 virtual void Verify()
1890 std::pair<DPL::String, DPL::String> boxSize;
1891 boxSize.first = m_size;
1892 boxSize.second = m_preview;
1893 m_data.m_boxSize.push_back(boxSize);
1896 explicit BoxSizeParser(
1897 ConfigParserData::LiveboxInfo::BoxContentInfo& data) :
1899 m_properNamespace(false),
1905 DPL::String m_preview;
1906 bool m_properNamespace;
1907 ConfigParserData::LiveboxInfo::BoxContentInfo& m_data;
1910 struct PdParser : public ElementParser
1912 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1913 const DPL::String& /*name*/)
1915 return &IgnoringParser::Create;
1918 virtual void Accept(const XmlAttribute& attribute)
1920 if (m_properNamespace) {
1921 if (attribute.name == L"src") {
1922 m_src = attribute.value;
1923 } else if (attribute.name == L"width") {
1924 m_width = attribute.value;
1925 } else if (attribute.name == L"height") {
1926 m_height = attribute.value;
1931 virtual void Accept(const Element& element)
1934 ConfigurationNamespace::TizenWebAppNamespaceName)
1936 m_properNamespace = true;
1940 virtual void Accept(const Text& /*text*/)
1943 virtual void Verify()
1945 m_data.m_pdSrc = m_src;
1946 m_data.m_pdWidth = m_width;
1947 m_data.m_pdHeight = m_height;
1951 ConfigParserData::LiveboxInfo::BoxContentInfo& data) :
1953 m_properNamespace(false),
1959 DPL::String m_width;
1960 DPL::String m_height;
1962 bool m_properNamespace;
1963 ConfigParserData::LiveboxInfo::BoxContentInfo& m_data;
1966 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
1967 const DPL::String& name)
1969 if (name == L"box-size") {
1970 return DPL::MakeDelegate(
1972 &LiveboxParser::BoxContentParser::
1974 } else if (name == L"pd") {
1975 return DPL::MakeDelegate(
1977 &LiveboxParser::BoxContentParser::
1980 ThrowMsg(Exception::ParseError,
1981 "No element parser for name: " << name);
1985 virtual void Accept(const XmlAttribute& attribute)
1987 if (m_properNamespace) {
1988 if (attribute.name == L"src") {
1989 m_box.m_boxSrc = attribute.value;
1991 if (attribute.name == L"mouse-event") {
1992 m_box.m_boxMouseEvent = attribute.value;
1997 virtual void Accept(const Element& element)
2000 ConfigurationNamespace::TizenWebAppNamespaceName)
2002 m_properNamespace = true;
2006 virtual void Accept(const Text& /*text*/)
2009 virtual void Verify()
2011 m_data.m_boxInfo = m_box;
2014 explicit BoxContentParser(ConfigParserData::LiveboxInfo& data) :
2016 m_properNamespace(false),
2020 ElementParserPtr OnBoxSizeElement()
2022 return ElementParserPtr(new BoxSizeParser(m_box));
2025 ElementParserPtr OnPdElement()
2027 return ElementParserPtr(new PdParser(m_box));
2032 bool m_properNamespace;
2033 ConfigParserData::LiveboxInfo& m_data;
2034 ConfigParserData::LiveboxInfo::BoxContentInfo m_box;
2037 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
2038 const DPL::String& name)
2040 if (name == L"box-label") {
2041 return DPL::MakeDelegate(this, &LiveboxParser::OnBoxLabelElement);
2042 } else if (name == L"box-icon") {
2043 return DPL::MakeDelegate(this, &LiveboxParser::OnBoxIconElement);
2044 } else if (name == L"box-content") {
2045 return DPL::MakeDelegate(this, &LiveboxParser::OnBoxContentElement);
2047 return &IgnoringParser::Create;
2051 virtual void Accept(const XmlAttribute& attribute)
2053 if (m_properNamespace) {
2054 if (attribute.name == L"id") {
2055 m_liveboxId = attribute.value;
2056 } else if (attribute.name == L"primary") {
2057 m_primary = attribute.value;
2058 } else if (attribute.name == L"auto-launch") {
2059 m_autoLaunch = attribute.value;
2060 } else if (attribute.name == L"update-period") {
2061 m_updatePeriod = attribute.value;
2062 } else if (attribute.name == L"type") {
2063 m_type = attribute.value;
2068 virtual void Accept(const Element& element)
2071 ConfigurationNamespace::TizenWebAppNamespaceName)
2073 m_properNamespace = true;
2077 virtual void Accept(const Text& /*text*/)
2080 virtual void Verify()
2082 m_livebox.m_liveboxId = m_liveboxId;
2083 m_livebox.m_primary = m_primary;
2084 m_livebox.m_autoLaunch = m_autoLaunch;
2085 m_livebox.m_updatePeriod = m_updatePeriod;
2086 m_livebox.m_type = m_type;
2088 m_data.m_livebox.push_back(m_livebox);
2091 explicit LiveboxParser(ConfigParserData& data) :
2094 m_properNamespace(false)
2096 m_livebox = ConfigParserData::LiveboxInfo();
2099 ElementParserPtr OnBoxLabelElement()
2101 return ElementParserPtr(new BoxLabelParser(m_livebox));
2104 ElementParserPtr OnBoxIconElement()
2106 return ElementParserPtr(new BoxIconParser(m_livebox));
2109 ElementParserPtr OnBoxContentElement()
2111 return ElementParserPtr(new BoxContentParser(m_livebox));
2115 ConfigParserData& m_data;
2116 ConfigParserData::LiveboxInfo m_livebox;
2117 DPL::String m_liveboxId;
2118 DPL::String m_primary;
2119 DPL::String m_autoLaunch;
2120 DPL::String m_updatePeriod;
2122 bool m_properNamespace;
2125 class CspParser : public ElementParser
2128 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
2129 const DPL::String& /*name*/)
2131 return &IgnoringParser::Create;
2134 CspParser(ConfigParserData& data) :
2137 m_properNamespace(false)
2140 virtual void Accept(const Element& element)
2142 if (element.ns == ConfigurationNamespace::TizenWebAppNamespaceName) {
2143 m_properNamespace = true;
2147 virtual void Accept(const XmlAttribute& /*attribute*/)
2150 virtual void Accept(const Text& text)
2152 if (m_properNamespace) {
2153 m_policy = text.value;
2157 virtual void Verify()
2159 if (!m_policy.IsNull()) {
2160 m_data.cspPolicy = *m_policy;
2165 ConfigParserData& m_data;
2166 bool m_properNamespace;
2167 DPL::OptionalString m_policy;
2170 class CspReportOnlyParser : public ElementParser
2173 virtual ActionFunc GetElementParser(const DPL::String& /*ns*/,
2174 const DPL::String& /*name*/)
2176 return &IgnoringParser::Create;
2179 CspReportOnlyParser(ConfigParserData& data) :
2182 m_properNamespace(false)
2185 virtual void Accept(const Element& element)
2187 if (element.ns == ConfigurationNamespace::TizenWebAppNamespaceName) {
2188 m_properNamespace = true;
2192 virtual void Accept(const XmlAttribute& /*attribute*/)
2195 virtual void Accept(const Text& text)
2197 if (m_properNamespace) {
2198 m_policy = text.value;
2202 virtual void Verify()
2204 if (!m_policy.IsNull()) {
2205 m_data.cspPolicyReportOnly = *m_policy;
2210 ConfigParserData& m_data;
2211 bool m_properNamespace;
2212 DPL::OptionalString m_policy;
2215 ElementParser::ActionFunc WidgetParser::GetElementParser(
2216 const DPL::String& /*ns*/,
2220 FuncMap::const_iterator it = m_map.find(name);
2221 if (it != m_map.end()) {
2224 return &IgnoringParser::Create;
2228 WidgetParser::WidgetParser(ConfigParserData& data) :
2230 m_textDirection(Unicode::EMPTY)
2232 m_map[L"name"] = DPL::MakeDelegate(this, &WidgetParser::OnNameElement);
2233 m_map[L"access"] = DPL::MakeDelegate(this, &WidgetParser::OnAccessElement);
2234 m_map[L"description"] =
2235 DPL::MakeDelegate(this, &WidgetParser::OnDescriptionElement);
2236 m_map[L"author"] = DPL::MakeDelegate(this, &WidgetParser::OnAuthorElement);
2238 DPL::MakeDelegate(this, &WidgetParser::OnLicenseElement);
2239 m_map[L"icon"] = DPL::MakeDelegate(this, &WidgetParser::OnIconElement);
2241 DPL::MakeDelegate(this, &WidgetParser::OnContentElement);
2243 DPL::MakeDelegate(this, &WidgetParser::OnFeatureElement);
2244 m_map[L"preference"] =
2245 DPL::MakeDelegate(this, &WidgetParser::OnPreferenceElement);
2246 m_map[L"link"] = DPL::MakeDelegate(this, &WidgetParser::OnLinkElement);
2248 DPL::MakeDelegate(this, &WidgetParser::OnSettingElement);
2249 // TODO: appservice will be removed
2250 m_map[L"appservice"] = DPL::MakeDelegate(this,
2251 &WidgetParser::OnAppServiceElement);
2252 m_map[L"application"] = DPL::MakeDelegate(
2255 OnApplicationElement);
2256 m_map[L"splash"] = DPL::MakeDelegate(this, &WidgetParser::OnSplashElement);
2257 m_map[L"background"] = DPL::MakeDelegate(this,
2258 &WidgetParser::OnBackgroundElement);
2259 m_map[L"privilege"] = DPL::MakeDelegate(this,
2260 &WidgetParser::OnPrivilegeElement);
2261 m_map[L"app-control"] = DPL::MakeDelegate(
2264 OnAppControlElement);
2265 m_map[L"category"] = DPL::MakeDelegate(this,
2266 &WidgetParser::OnCategoryElement);
2267 m_map[L"livebox"] = DPL::MakeDelegate(this, &WidgetParser::OnLiveboxElement);
2269 m_map[L"Content-Security-Policy"] = DPL::MakeDelegate(
2273 m_map[L"Content-Security-Policy-Report-Only"] = DPL::MakeDelegate(
2276 OnCspReportOnlyElement);
2280 ElementParserPtr WidgetParser::OnNameElement()
2282 return ElementParserPtr(new NameParser(m_textDirection, m_data));
2285 ElementParserPtr WidgetParser::OnAccessElement()
2287 return ElementParserPtr(new AccessParser(m_data));
2290 ElementParserPtr WidgetParser::OnDescriptionElement()
2292 return ElementParserPtr(new DescriptionParser(m_textDirection, m_data));
2295 ElementParserPtr WidgetParser::OnAuthorElement()
2297 return ElementParserPtr(new AuthorParser(m_textDirection, m_data));
2300 ElementParserPtr WidgetParser::OnLicenseElement()
2302 return ElementParserPtr(new LicenseParser(m_textDirection, m_data));
2305 ElementParserPtr WidgetParser::OnIconElement()
2307 return ElementParserPtr(new IconParser(m_data));
2310 ElementParserPtr WidgetParser::OnContentElement()
2312 return ElementParserPtr(new ContentParser(m_data));
2315 ElementParserPtr WidgetParser::OnFeatureElement()
2317 return ElementParserPtr(new FeatureParser(m_data));
2320 ElementParserPtr WidgetParser::OnPreferenceElement()
2322 return ElementParserPtr(new PreferenceParser(m_data));
2325 ElementParserPtr WidgetParser::OnLinkElement()
2327 return ElementParserPtr(new LinkParser(m_data));
2330 ElementParserPtr WidgetParser::OnSettingElement()
2332 return ElementParserPtr(new SettingParser(m_data));
2335 ElementParserPtr WidgetParser::OnApplicationElement()
2337 return ElementParserPtr(new ApplicationParser(m_data));
2340 ElementParserPtr WidgetParser::OnSplashElement()
2342 return ElementParserPtr(new SplashParser(m_data));
2345 ElementParserPtr WidgetParser::OnBackgroundElement()
2347 return ElementParserPtr(new BackgroundParser(m_data));
2350 ElementParserPtr WidgetParser::OnPrivilegeElement()
2352 return ElementParserPtr(new PrivilegeParser(m_data));
2355 ElementParserPtr WidgetParser::OnAppServiceElement()
2357 return ElementParserPtr(new AppServiceParser(m_data));
2360 ElementParserPtr WidgetParser::OnAppControlElement()
2362 return ElementParserPtr(new AppControlParser(m_data));
2365 ElementParserPtr WidgetParser::OnCategoryElement()
2367 return ElementParserPtr(new CategoryParser(m_data));
2370 ElementParserPtr WidgetParser::OnLiveboxElement()
2372 return ElementParserPtr(new LiveboxParser(m_data));
2375 ElementParserPtr WidgetParser::OnCspElement()
2377 return ElementParserPtr(new CspParser(m_data));
2380 ElementParserPtr WidgetParser::OnCspReportOnlyElement()
2382 return ElementParserPtr(new CspReportOnlyParser(m_data));
2385 void WidgetParser::Accept(const Element& element)
2387 if (element.ns != ConfigurationNamespace::W3CWidgetNamespaceName &&
2388 element.ns != ConfigurationNamespace::TizenWebAppNamespaceName)
2390 ThrowMsg(Exception::ParseError,
2391 "Wrong xml namespace for widget element");
2395 void WidgetParser::Accept(const Text& /*text*/)
2397 ThrowMsg(Exception::ParseError, "widged element must be empty");
2400 void WidgetParser::Accept(const XmlAttribute& attribute)
2402 if (attribute.name == L"id") {
2403 LibIri::Wrapper iri(DPL::ToUTF8String(attribute.value).c_str());
2404 //If may important tests starts to fail this test we will have
2405 //to consider commenting this test out again.
2406 if (iri.Validate()) {
2407 m_data.widget_id = attribute.value;
2408 NormalizeString(m_data.widget_id);
2410 LogWarning("Widget id validation failed: " << attribute.value);
2412 } else if (attribute.name == L"version") {
2413 m_version = attribute.value;
2414 NormalizeString(m_version);
2415 } else if (attribute.name == L"min-version") {
2416 LogInfo("min-version attribute was found. Value: " << attribute.value);
2417 m_minVersion = attribute.value;
2418 NormalizeString(m_minVersion);
2419 m_data.minVersionRequired = m_minVersion;
2420 } else if (attribute.name == L"height") {
2421 DPL::OptionalString value = attribute.value;
2422 NormalizeString(value);
2423 std::string v = DPL::ToUTF8String(*value);
2426 unsigned char c = v.c_str()[0];
2427 if (c >= '0' && c <= '9') {
2429 for (size_t i = 0; i < v.size(); ++i) {
2431 if (c >= '0' && c <= '9') {
2438 m_data.height = val;
2441 } else if (attribute.name == L"width") {
2442 DPL::OptionalString value = attribute.value;
2443 NormalizeString(value);
2444 std::string v = DPL::ToUTF8String(*value);
2447 unsigned char c = v.c_str()[0];
2448 if (c >= '0' && c <= '9') {
2450 for (size_t i = 0; i < v.size(); ++i) {
2452 if (c >= '0' && c <= '9') {
2462 } else if (attribute.name == L"viewmodes") {
2463 DPL::Tokenize(attribute.value,
2465 std::inserter(m_windowModes,
2466 m_windowModes.end()),
2468 } else if (attribute.name == L"dir") {
2469 m_textDirection = Unicode::ParseDirAttribute(attribute);
2470 } else if (L"defaultlocale" == attribute.name) {
2471 if (!m_defaultlocale) {
2472 m_defaultlocale = attribute.value;
2473 NormalizeString(m_defaultlocale);
2474 if (!LanguageSubtagRstTreeSingleton::Instance().ValidateLanguageTag(
2475 DPL::ToUTF8String(*m_defaultlocale)))
2477 LogWarning("Language tag: " <<
2478 m_defaultlocale << " is not valid");
2479 m_defaultlocale = DPL::OptionalString::Null;
2481 LogDebug("Default Locale Found " << m_defaultlocale);
2484 LogWarning("Ignoring subsequent default locale");
2487 //Any other value consider as a namespace definition
2488 } else if (attribute.name == L"xmlns" || attribute.prefix == L"xmlns") {
2489 LogInfo("Namespace domain: " << attribute.name);
2490 LogInfo("Namespace value: " << attribute.value);
2491 m_nameSpaces[attribute.name] = attribute.value;
2493 LogError("Unknown attirbute: namespace=" << attribute.ns <<
2494 ", name=" << attribute.name <<
2495 ", value=" << attribute.value);
2499 void WidgetParser::Verify()
2501 FOREACH(mode, m_windowModes) {
2502 if (L"windowed" == *mode || L"floating" == *mode ||
2503 L"fullscreen" == *mode || L"maximized" == *mode ||
2504 L"minimized" == *mode)
2506 m_data.windowModes.insert(*mode);
2509 if (!m_version.IsNull()) {
2510 Unicode::UpdateTextWithDirectionMark(m_textDirection, &*m_version);
2511 m_data.version = m_version;
2513 m_data.defaultlocale = m_defaultlocale;
2514 FOREACH(ns, m_nameSpaces) {
2515 m_data.nameSpaces.insert(ns->second);