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 <memory> 21 22 #include "android-base/macros.h" 23 #include "androidfw/ConfigDescription.h" 24 #include "androidfw/StringPiece.h" 25 26 #include "Diagnostics.h" 27 #include "ResourceTable.h" 28 #include "ResourceValues.h" 29 #include "StringPool.h" 30 #include "util/Maybe.h" 31 #include "xml/XmlPullParser.h" 32 33 namespace aapt { 34 35 struct ParsedResource; 36 37 struct ResourceParserOptions { 38 /** 39 * Whether the default setting for this parser is to allow translation. 40 */ 41 bool translatable = true; 42 43 /** 44 * Whether positional arguments in formatted strings are treated as errors or 45 * warnings. 46 */ 47 bool error_on_positional_arguments = true; 48 49 /** 50 * If true, apply the same visibility rules for styleables as are used for 51 * all other resources. Otherwise, all styleables will be made public. 52 */ 53 bool preserve_visibility_of_styleables = false; 54 55 // If visibility was forced, we need to use it when creating a new resource and also error if we 56 // try to parse the <public>, <public-group>, <java-symbol> or <symbol> tags. 57 Maybe<Visibility::Level> visibility; 58 }; 59 60 struct FlattenedXmlSubTree { 61 std::string raw_value; 62 StyleString style_string; 63 std::vector<UntranslatableSection> untranslatable_sections; 64 xml::IPackageDeclStack* namespace_resolver; 65 Source source; 66 }; 67 68 /* 69 * Parses an XML file for resources and adds them to a ResourceTable. 70 */ 71 class ResourceParser { 72 public: 73 ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source, 74 const android::ConfigDescription& config, 75 const ResourceParserOptions& options = {}); 76 bool Parse(xml::XmlPullParser* parser); 77 78 static std::unique_ptr<Item> ParseXml(const FlattenedXmlSubTree& xmlsub_tree, uint32_t type_mask, 79 bool allow_raw_value, ResourceTable& table, 80 const android::ConfigDescription& config, 81 IDiagnostics& diag); 82 83 private: 84 DISALLOW_COPY_AND_ASSIGN(ResourceParser); 85 86 std::optional<FlattenedXmlSubTree> CreateFlattenSubTree(xml::XmlPullParser* parser); 87 88 // Parses the XML subtree as a StyleString (flattened XML representation for strings with 89 // formatting). If parsing fails, false is returned and the out parameters are left in an 90 // unspecified state. Otherwise, 91 // `out_style_string` contains the escaped and whitespace trimmed text. 92 // `out_raw_string` contains the un-escaped text. 93 // `out_untranslatable_sections` contains the sections of the string that should not be 94 // translated. 95 bool FlattenXmlSubtree(xml::XmlPullParser* parser, std::string* out_raw_string, 96 StyleString* out_style_string, 97 std::vector<UntranslatableSection>* out_untranslatable_sections); 98 99 /* 100 * Parses the XML subtree and returns an Item. 101 * The type of Item that can be parsed is denoted by the `type_mask`. 102 * If `allow_raw_value` is true and the subtree can not be parsed as a regular 103 * Item, then a 104 * RawString is returned. Otherwise this returns false; 105 */ 106 std::unique_ptr<Item> ParseXml(xml::XmlPullParser* parser, const uint32_t type_mask, 107 const bool allow_raw_value); 108 109 bool ParseResources(xml::XmlPullParser* parser); 110 bool ParseResource(xml::XmlPullParser* parser, ParsedResource* out_resource); 111 112 bool ParseItem(xml::XmlPullParser* parser, ParsedResource* out_resource, uint32_t format); 113 bool ParseString(xml::XmlPullParser* parser, ParsedResource* out_resource); 114 bool ParseMacro(xml::XmlPullParser* parser, ParsedResource* out_resource); 115 bool ParsePublic(xml::XmlPullParser* parser, ParsedResource* out_resource); 116 bool ParsePublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource); 117 bool ParseStagingPublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource); 118 bool ParseStagingPublicGroupFinal(xml::XmlPullParser* parser, ParsedResource* out_resource); 119 bool ParseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* out_resource); 120 bool ParseSymbol(xml::XmlPullParser* parser, ParsedResource* out_resource); 121 bool ParseOverlayable(xml::XmlPullParser* parser, ParsedResource* out_resource); 122 bool ParseAddResource(xml::XmlPullParser* parser, ParsedResource* out_resource); 123 bool ParseAttr(xml::XmlPullParser* parser, ParsedResource* out_resource); 124 bool ParseAttrImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, bool weak); 125 Maybe<Attribute::Symbol> ParseEnumOrFlagItem(xml::XmlPullParser* parser, 126 const android::StringPiece& tag); 127 bool ParseStyle(ResourceType type, xml::XmlPullParser* parser, ParsedResource* out_resource); 128 bool ParseStyleItem(xml::XmlPullParser* parser, Style* style); 129 bool ParseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* out_resource); 130 bool ParseArray(xml::XmlPullParser* parser, ParsedResource* out_resource); 131 bool ParseIntegerArray(xml::XmlPullParser* parser, ParsedResource* out_resource); 132 bool ParseStringArray(xml::XmlPullParser* parser, ParsedResource* out_resource); 133 bool ParseArrayImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, uint32_t typeMask); 134 bool ParsePlural(xml::XmlPullParser* parser, ParsedResource* out_resource); 135 136 IDiagnostics* diag_; 137 ResourceTable* table_; 138 Source source_; 139 android::ConfigDescription config_; 140 ResourceParserOptions options_; 141 }; 142 143 } // namespace aapt 144 145 #endif // AAPT_RESOURCE_PARSER_H 146