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