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 "ConfigDescription.h"
21#include "Diagnostics.h"
22#include "ResourceTable.h"
23#include "ResourceValues.h"
24#include "StringPool.h"
25#include "util/Maybe.h"
26#include "util/StringPiece.h"
27#include "xml/XmlPullParser.h"
28
29#include <memory>
30
31namespace aapt {
32
33struct ParsedResource;
34
35struct ResourceParserOptions {
36    /**
37     * Whether the default setting for this parser is to allow translation.
38     */
39    bool translatable = true;
40
41    /**
42     * Whether positional arguments in formatted strings are treated as errors or warnings.
43     */
44    bool errorOnPositionalArguments = true;
45};
46
47/*
48 * Parses an XML file for resources and adds them to a ResourceTable.
49 */
50class ResourceParser {
51public:
52    ResourceParser(IDiagnostics* diag, ResourceTable* table, const Source& source,
53                   const ConfigDescription& config, const ResourceParserOptions& options = {});
54
55    ResourceParser(const ResourceParser&) = delete; // No copy.
56
57    bool parse(xml::XmlPullParser* parser);
58
59private:
60    /*
61     * Parses the XML subtree as a StyleString (flattened XML representation for strings
62     * with formatting). If successful, `outStyleString`
63     * contains the escaped and whitespace trimmed text, while `outRawString`
64     * contains the unescaped text. Returns true on success.
65     */
66    bool flattenXmlSubtree(xml::XmlPullParser* parser, std::u16string* outRawString,
67                           StyleString* outStyleString);
68
69    /*
70     * Parses the XML subtree and returns an Item.
71     * The type of Item that can be parsed is denoted by the `typeMask`.
72     * If `allowRawValue` is true and the subtree can not be parsed as a regular Item, then a
73     * RawString is returned. Otherwise this returns false;
74     */
75    std::unique_ptr<Item> parseXml(xml::XmlPullParser* parser, const uint32_t typeMask,
76                                   const bool allowRawValue);
77
78    bool parseResources(xml::XmlPullParser* parser);
79    bool parseResource(xml::XmlPullParser* parser, ParsedResource* outResource);
80
81    bool parseItem(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t format);
82    bool parseString(xml::XmlPullParser* parser, ParsedResource* outResource);
83
84    bool parsePublic(xml::XmlPullParser* parser, ParsedResource* outResource);
85    bool parsePublicGroup(xml::XmlPullParser* parser, ParsedResource* outResource);
86    bool parseSymbolImpl(xml::XmlPullParser* parser, ParsedResource* outResource);
87    bool parseSymbol(xml::XmlPullParser* parser, ParsedResource* outResource);
88    bool parseAddResource(xml::XmlPullParser* parser, ParsedResource* outResource);
89    bool parseAttr(xml::XmlPullParser* parser, ParsedResource* outResource);
90    bool parseAttrImpl(xml::XmlPullParser* parser, ParsedResource* outResource, bool weak);
91    Maybe<Attribute::Symbol> parseEnumOrFlagItem(xml::XmlPullParser* parser,
92                                                 const StringPiece16& tag);
93    bool parseStyle(xml::XmlPullParser* parser, ParsedResource* outResource);
94    bool parseStyleItem(xml::XmlPullParser* parser, Style* style);
95    bool parseDeclareStyleable(xml::XmlPullParser* parser, ParsedResource* outResource);
96    bool parseArray(xml::XmlPullParser* parser, ParsedResource* outResource);
97    bool parseIntegerArray(xml::XmlPullParser* parser, ParsedResource* outResource);
98    bool parseStringArray(xml::XmlPullParser* parser, ParsedResource* outResource);
99    bool parseArrayImpl(xml::XmlPullParser* parser, ParsedResource* outResource, uint32_t typeMask);
100    bool parsePlural(xml::XmlPullParser* parser, ParsedResource* outResource);
101
102    IDiagnostics* mDiag;
103    ResourceTable* mTable;
104    Source mSource;
105    ConfigDescription mConfig;
106    ResourceParserOptions mOptions;
107};
108
109} // namespace aapt
110
111#endif // AAPT_RESOURCE_PARSER_H
112