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