18c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#ifndef AAPT_MANIFEST_MERGER_H
28c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#define AAPT_MANIFEST_MERGER_H
38c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
48c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#include "Logger.h"
58c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#include "Source.h"
68c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#include "XmlDom.h"
78c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
88c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#include <memory>
98c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#include <string>
108c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
118c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinskinamespace aapt {
128c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
138c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinskiclass ManifestMerger {
148c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinskipublic:
158c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    struct Options {
168c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    };
178c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
188c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    ManifestMerger(const Options& options);
198c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
208c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool setAppManifest(const Source& source, const std::u16string& package,
218c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski                        std::unique_ptr<xml::Node> root);
228c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
238c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool mergeLibraryManifest(const Source& source, const std::u16string& package,
248c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski                              std::unique_ptr<xml::Node> libRoot);
258c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
268c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    xml::Node* getMergedXml();
278c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
288c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool printMerged();
298c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
308c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinskiprivate:
318c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool mergeNewOrEqual(xml::Element* parentA, xml::Element* elA, xml::Element* elB);
328c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool mergePreferRequired(xml::Element* parentA, xml::Element* elA, xml::Element* elB);
338c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool checkEqual(xml::Element* elA, xml::Element* elB);
348c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool mergeApplication(xml::Element* applicationA, xml::Element* applicationB);
358c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    bool mergeUsesSdk(xml::Element* elA, xml::Element* elB);
368c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
378c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    Options mOptions;
388c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    std::unique_ptr<xml::Node> mRoot;
398c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    SourceLogger mAppLogger;
408c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski    SourceLogger mLogger;
418c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski};
428c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
438c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski} // namespace aapt
448c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski
458c831ca87bb7c8699b2a5cb34b8d35deedf9ce4eAdam Lesinski#endif // AAPT_MANIFEST_MERGER_H
46