/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef AAPT_RESOURCE_PARSER_H #define AAPT_RESOURCE_PARSER_H #include #include "android-base/macros.h" #include "androidfw/ConfigDescription.h" #include "androidfw/StringPiece.h" #include "Diagnostics.h" #include "ResourceTable.h" #include "ResourceValues.h" #include "StringPool.h" #include "util/Maybe.h" #include "xml/XmlPullParser.h" namespace aapt { struct ParsedResource; struct ResourceParserOptions { /** * Whether the default setting for this parser is to allow translation. */ bool translatable = true; /** * Whether positional arguments in formatted strings are treated as errors or * warnings. */ bool error_on_positional_arguments = true; /** * If true, apply the same visibility rules for styleables as are used for * all other resources. Otherwise, all styleables will be made public. */ bool preserve_visibility_of_styleables = false; // If visibility was forced, we need to use it when creating a new resource and also error if we // try to parse the , , or tags. Maybe visibility; }; struct FlattenedXmlSubTree { std::string raw_value; StyleString style_string; std::vector untranslatable_sections; xml::IPackageDeclStack* namespace_resolver; Source source; }; /* * Parses an XML file for resources and adds them to a ResourceTable. */ class ResourceParser { public: ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source, const android::ConfigDescription& config, const ResourceParserOptions& options = {}); bool Parse(xml::XmlPullParser* parser); static std::unique_ptr ParseXml(const FlattenedXmlSubTree& xmlsub_tree, uint32_t type_mask, bool allow_raw_value, ResourceTable& table, const android::ConfigDescription& config, IDiagnostics& diag); private: DISALLOW_COPY_AND_ASSIGN(ResourceParser); std::optional CreateFlattenSubTree(xml::XmlPullParser* parser); // Parses the XML subtree as a StyleString (flattened XML representation for strings with // formatting). If parsing fails, false is returned and the out parameters are left in an // unspecified state. Otherwise, // `out_style_string` contains the escaped and whitespace trimmed text. // `out_raw_string` contains the un-escaped text. // `out_untranslatable_sections` contains the sections of the string that should not be // translated. bool FlattenXmlSubtree(xml::XmlPullParser* parser, std::string* out_raw_string, StyleString* out_style_string, std::vector* out_untranslatable_sections); /* * Parses the XML subtree and returns an Item. * The type of Item that can be parsed is denoted by the `type_mask`. * If `allow_raw_value` is true and the subtree can not be parsed as a regular * Item, then a * RawString is returned. Otherwise this returns false; */ std::unique_ptr ParseXml(xml::XmlPullParser* parser, const uint32_t type_mask, const bool allow_raw_value); bool ParseResources(xml::XmlPullParser* parser); bool ParseResource(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseItem(xml::XmlPullParser* parser, ParsedResource* out_resource, uint32_t format); bool ParseString(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseMacro(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParsePublic(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParsePublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseStagingPublicGroup(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseStagingPublicGroupFinal(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseSymbol(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseOverlayable(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseAddResource(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseAttr(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseAttrImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, bool weak); Maybe ParseEnumOrFlagItem(xml::XmlPullParser* parser, const android::StringPiece& tag); bool ParseStyle(ResourceType type, xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseStyleItem(xml::XmlPullParser* parser, Style* style); bool ParseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseArray(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseIntegerArray(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseStringArray(xml::XmlPullParser* parser, ParsedResource* out_resource); bool ParseArrayImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, uint32_t typeMask); bool ParsePlural(xml::XmlPullParser* parser, ParsedResource* out_resource); IDiagnostics* diag_; ResourceTable* table_; Source source_; android::ConfigDescription config_; ResourceParserOptions options_; }; } // namespace aapt #endif // AAPT_RESOURCE_PARSER_H