1 #ifndef COM_ANDROID_ART_H
2 #define COM_ANDROID_ART_H
3 
4 #include <array>
5 #include <map>
6 #include <optional>
7 #include <string>
8 #include <vector>
9 #include <sstream>
10 #include <iostream>
11 
12 #if __has_include(<tinyxml2.h>)
13 #include <tinyxml2.h>
14 #else
15 #error Require libtinyxml2 library. Please add libtinyxml2 to shared_libs or static_libs
16 #endif
17 
18 #include "com_android_art_enums.h"
19 
20 namespace com {
21     namespace android {
22         namespace art {
23             class KeyValuePairList;
24             class KeyValuePair;
25             class ModuleInfoList;
26             class ModuleInfo;
27             class Classpath;
28             class Component;
29             class SystemServerComponents;
30             class SystemServerComponent;
31             class CacheInfo;
32             std::optional<CacheInfo> read(const char* configFile);
33 
34             std::optional<CacheInfo> parse(const char* xml);
35 
36             void write(std::ostream& _out, const CacheInfo& cacheInfo);
37 
38             class KeyValuePairList {
39                 private:
40                 const std::vector<KeyValuePair> item_;
41                 public:
42                 explicit KeyValuePairList(std::vector<KeyValuePair> item);
43                 const std::vector<KeyValuePair>& getItem() const;
44                 bool hasItem() const;
45                 const KeyValuePair* getFirstItem() const;
46                 static KeyValuePairList read(tinyxml2::XMLElement *root);
47                 void write(std::ostream& _out, const std::string& _name) const;
48             };
49 
50             class KeyValuePair {
51                 private:
52                 const std::string k_;
53                 const std::string v_;
54                 public:
55                 KeyValuePair(std::string k, std::string v);
56                 const std::string& getK() const;
57                 bool hasK() const;
58                 const std::string& getV() const;
59                 bool hasV() const;
60                 static KeyValuePair read(tinyxml2::XMLElement *root);
61                 void write(std::ostream& _out, const std::string& _name) const;
62             };
63 
64             class ModuleInfoList {
65                 private:
66                 const std::vector<ModuleInfo> moduleInfo_;
67                 public:
68                 explicit ModuleInfoList(std::vector<ModuleInfo> moduleInfo);
69                 const std::vector<ModuleInfo>& getModuleInfo() const;
70                 bool hasModuleInfo() const;
71                 const ModuleInfo* getFirstModuleInfo() const;
72                 static ModuleInfoList read(tinyxml2::XMLElement *root);
73                 void write(std::ostream& _out, const std::string& _name) const;
74             };
75 
76             class ModuleInfo {
77                 private:
78                 const std::string name_;
79                 const int64_t versionCode_;
80                 const std::string versionName_;
81                 const int64_t lastUpdateMillis_;
82                 public:
83                 ModuleInfo(std::string name, int64_t versionCode, std::string versionName, int64_t lastUpdateMillis);
84                 const std::string& getName() const;
85                 bool hasName() const;
86                 const int64_t& getVersionCode() const;
87                 bool hasVersionCode() const;
88                 const std::string& getVersionName() const;
89                 bool hasVersionName() const;
90                 const int64_t& getLastUpdateMillis() const;
91                 bool hasLastUpdateMillis() const;
92                 static ModuleInfo read(tinyxml2::XMLElement *root);
93                 void write(std::ostream& _out, const std::string& _name) const;
94             };
95 
96             class Classpath {
97                 private:
98                 const std::vector<Component> component_;
99                 public:
100                 explicit Classpath(std::vector<Component> component);
101                 const std::vector<Component>& getComponent() const;
102                 bool hasComponent() const;
103                 const Component* getFirstComponent() const;
104                 static Classpath read(tinyxml2::XMLElement *root);
105                 void write(std::ostream& _out, const std::string& _name) const;
106             };
107 
108             class Component {
109                 private:
110                 const std::string file_;
111                 const uint64_t size_;
112                 const std::string checksums_;
113                 public:
114                 Component(std::string file, uint64_t size, std::string checksums);
115                 const std::string& getFile() const;
116                 bool hasFile() const;
117                 const uint64_t& getSize() const;
118                 bool hasSize() const;
119                 const std::string& getChecksums() const;
120                 bool hasChecksums() const;
121                 static Component read(tinyxml2::XMLElement *root);
122                 void write(std::ostream& _out, const std::string& _name) const;
123             };
124 
125             class SystemServerComponents {
126                 private:
127                 const std::vector<SystemServerComponent> component_;
128                 public:
129                 explicit SystemServerComponents(std::vector<SystemServerComponent> component);
130                 const std::vector<SystemServerComponent>& getComponent() const;
131                 bool hasComponent() const;
132                 const SystemServerComponent* getFirstComponent() const;
133                 static SystemServerComponents read(tinyxml2::XMLElement *root);
134                 void write(std::ostream& _out, const std::string& _name) const;
135             };
136 
137             class SystemServerComponent : public Component {
138                 private:
139                 const bool isInClasspath_;
140                 public:
141                 SystemServerComponent(std::string file, uint64_t size, std::string checksums, bool isInClasspath);
142                 const bool& getIsInClasspath() const;
143                 bool hasIsInClasspath() const;
144                 static SystemServerComponent read(tinyxml2::XMLElement *root);
145                 void write(std::ostream& _out, const std::string& _name) const;
146             };
147 
148             class CacheInfo {
149                 private:
150                 const std::vector<KeyValuePairList> systemProperties_;
151                 const std::vector<ModuleInfo> artModuleInfo_;
152                 const std::vector<ModuleInfoList> moduleInfoList_;
153                 const std::vector<Classpath> bootClasspath_;
154                 const std::vector<Classpath> dex2oatBootClasspath_;
155                 const std::vector<SystemServerComponents> systemServerComponents_;
156                 const std::optional<bool> compilationOsMode_;
157                 public:
158                 CacheInfo(std::vector<KeyValuePairList> systemProperties, std::vector<ModuleInfo> artModuleInfo, std::vector<ModuleInfoList> moduleInfoList, std::vector<Classpath> bootClasspath, std::vector<Classpath> dex2oatBootClasspath, std::vector<SystemServerComponents> systemServerComponents, std::optional<bool> compilationOsMode);
159                 const std::vector<KeyValuePairList>& getSystemProperties() const;
160                 bool hasSystemProperties() const;
161                 const KeyValuePairList* getFirstSystemProperties() const;
162                 const std::vector<ModuleInfo>& getArtModuleInfo() const;
163                 bool hasArtModuleInfo() const;
164                 const ModuleInfo* getFirstArtModuleInfo() const;
165                 const std::vector<ModuleInfoList>& getModuleInfoList() const;
166                 bool hasModuleInfoList() const;
167                 const ModuleInfoList* getFirstModuleInfoList() const;
168                 const std::vector<Classpath>& getBootClasspath() const;
169                 bool hasBootClasspath() const;
170                 const Classpath* getFirstBootClasspath() const;
171                 const std::vector<Classpath>& getDex2oatBootClasspath() const;
172                 bool hasDex2oatBootClasspath() const;
173                 const Classpath* getFirstDex2oatBootClasspath() const;
174                 const std::vector<SystemServerComponents>& getSystemServerComponents() const;
175                 bool hasSystemServerComponents() const;
176                 const SystemServerComponents* getFirstSystemServerComponents() const;
177                 const bool& getCompilationOsMode() const;
178                 bool hasCompilationOsMode() const;
179                 static CacheInfo read(tinyxml2::XMLElement *root);
180                 void write(std::ostream& _out, const std::string& _name) const;
181             };
182 
183         } // art
184     } // android
185 } // com
186 #endif // COM_ANDROID_ART_H
187