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 /* 61 * Parses an XML file for resources and adds them to a ResourceTable. 62 */ 63 class ResourceParser { 64 public: 65 ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source, 66 const android::ConfigDescription& config, 67 const ResourceParserOptions& options = {}); 68 bool Parse(xml::XmlPullParser* parser); 69 70 private: 71 DISALLOW_COPY_AND_ASSIGN(ResourceParser); 72 73 // Parses the XML subtree as a StyleString (flattened XML representation for strings with 74 // formatting). If parsing fails, false is returned and the out parameters are left in an 75 // unspecified state. Otherwise, 76 // `out_style_string` contains the escaped and whitespace trimmed text. 77 // `out_raw_string` contains the un-escaped text. 78 // `out_untranslatable_sections` contains the sections of the string that should not be 79 // translated. 80 bool FlattenXmlSubtree(xml::XmlPullParser* parser, std::string* out_raw_string, 81 StyleString* out_style_string, 82 std::vector<UntranslatableSection>* out_untranslatable_sections); 83 84 /* 85 * Parses the XML subtree and returns an Item. 86 * The type of Item that can be parsed is denoted by the `type_mask`. 87 * If `allow_raw_value` is true and the subtree can not be parsed as a regular 88 * Item, then a 89 * RawString is returned. Otherwise this returns false; 90 */ 91 std::unique_ptr<Item> ParseXml(xml::XmlPullParser* parser, const uint32_t type_mask, 92 const bool allow_raw_value); 93 94 bool ParseResources(xml::XmlPullParser* parser); 95 bool ParseResource(xml::XmlPullParser* parser, ParsedResource* out_resource); 96 97 bool ParseItem(xml::XmlPullParser* parser, ParsedResource* out_resource, uint32_t format); 98 bool ParseString(xml::XmlPullParser* parser, ParsedResource* out_resource); 99 100 bool ParsePublic(xml::XmlPullParser* parser, ParsedResource* out_resource); 101 bool ParsePublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource); 102 bool ParseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* out_resource); 103 bool ParseSymbol(xml::XmlPullParser* parser, ParsedResource* out_resource); 104 bool ParseOverlayable(xml::XmlPullParser* parser, ParsedResource* out_resource); 105 bool ParseAddResource(xml::XmlPullParser* parser, ParsedResource* out_resource); 106 bool ParseAttr(xml::XmlPullParser* parser, ParsedResource* out_resource); 107 bool ParseAttrImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, bool weak); 108 Maybe<Attribute::Symbol> ParseEnumOrFlagItem(xml::XmlPullParser* parser, 109 const android::StringPiece& tag); 110 bool ParseStyle(const ResourceType type, xml::XmlPullParser* parser, 111 ParsedResource* out_resource); 112 bool ParseStyleItem(xml::XmlPullParser* parser, Style* style); 113 bool ParseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* out_resource); 114 bool ParseArray(xml::XmlPullParser* parser, ParsedResource* out_resource); 115 bool ParseIntegerArray(xml::XmlPullParser* parser, ParsedResource* out_resource); 116 bool ParseStringArray(xml::XmlPullParser* parser, ParsedResource* out_resource); 117 bool ParseArrayImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, uint32_t typeMask); 118 bool ParsePlural(xml::XmlPullParser* parser, ParsedResource* out_resource); 119 120 IDiagnostics* diag_; 121 ResourceTable* table_; 122 Source source_; 123 android::ConfigDescription config_; 124 ResourceParserOptions options_; 125 }; 126 127 } // namespace aapt 128 129 #endif // AAPT_RESOURCE_PARSER_H 130