Home | History | Annotate | Download | only in aapt2
      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