1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 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 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 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. 15 */ 16 17 #ifndef AAPT_RESOURCE_PARSER_H 18 #define AAPT_RESOURCE_PARSER_H 19 20 #include "ConfigDescription.h" 21 #include "Diagnostics.h" 22 #include "ResourceTable.h" 23 #include "ResourceValues.h" 24 #include "StringPool.h" 25 #include "util/Maybe.h" 26 #include "util/StringPiece.h" 27 #include "xml/XmlPullParser.h" 28 29 #include <memory> 30 31 namespace aapt { 32 33 struct ParsedResource; 34 35 struct ResourceParserOptions { 36 /** 37 * Whether the default setting for this parser is to allow translation. 38 */ 39 bool translatable = true; 40 41 /** 42 * Whether positional arguments in formatted strings are treated as errors or warnings. 43 */ 44 bool errorOnPositionalArguments = true; 45 }; 46 47 /* 48 * Parses an XML file for resources and adds them to a ResourceTable. 49 */ 50 class ResourceParser { 51 public: 52 ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source, 53 const ConfigDescription& config, const ResourceParserOptions& options = {}); 54 55 ResourceParser(const ResourceParser&) = delete; // No copy. 56 57 bool parse(xml::XmlPullParser* parser); 58 59 private: 60 /* 61 * Parses the XML subtree as a StyleString (flattened XML representation for strings 62 * with formatting). If successful, `outStyleString` 63 * contains the escaped and whitespace trimmed text, while `outRawString` 64 * contains the unescaped text. Returns true on success. 65 */ 66 bool flattenXmlSubtree(xml::XmlPullParser* parser, std::u16string* outRawString, 67 StyleString* outStyleString); 68 69 /* 70 * Parses the XML subtree and returns an Item. 71 * The type of Item that can be parsed is denoted by the `typeMask`. 72 * If `allowRawValue` is true and the subtree can not be parsed as a regular Item, then a 73 * RawString is returned. Otherwise this returns false; 74 */ 75 std::unique_ptr<Item> parseXml(xml::XmlPullParser* parser, const uint32_t typeMask, 76 const bool allowRawValue); 77 78 bool parseResources(xml::XmlPullParser* parser); 79 bool parseResource(xml::XmlPullParser* parser, ParsedResource* outResource); 80 81 bool parseItem(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t format); 82 bool parseString(xml::XmlPullParser* parser, ParsedResource* outResource); 83 84 bool parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource); 85 bool parsePublicGroup(xml::XmlPullParser* parser, ParsedResource* outResource); 86 bool parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource); 87 bool parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource); 88 bool parseAddResource(xml::XmlPullParser* parser, ParsedResource* outResource); 89 bool parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource); 90 bool parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource, bool weak); 91 Maybe<Attribute::Symbol> parseEnumOrFlagItem(xml::XmlPullParser* parser, 92 const StringPiece16& tag); 93 bool parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource); 94 bool parseStyleItem(xml::XmlPullParser* parser, Style* style); 95 bool parseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* outResource); 96 bool parseArray(xml::XmlPullParser* parser, ParsedResource* outResource); 97 bool parseIntegerArray(xml::XmlPullParser* parser, ParsedResource* outResource); 98 bool parseStringArray(xml::XmlPullParser* parser, ParsedResource* outResource); 99 bool parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t typeMask); 100 bool parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource); 101 102 IDiagnostics* mDiag; 103 ResourceTable* mTable; 104 Source mSource; 105 ConfigDescription mConfig; 106 ResourceParserOptions mOptions; 107 }; 108 109 } // namespace aapt 110 111 #endif // AAPT_RESOURCE_PARSER_H 112