1 #ifndef HAL_MANIFEST_H
2 #define HAL_MANIFEST_H
3 
4 #include <array>
5 #include <map>
6 #include <optional>
7 #include <string>
8 #include <vector>
9 #include <sstream>
10 
11 #if __has_include(<libxml/parser.h>)
12 #include <libxml/parser.h>
13 #include <libxml/xinclude.h>
14 #else
15 #error Require libxml2 library. Please add libxml2 to shared_libs or static_libs
16 #endif
17 
18 #include "hal_manifest_enums.h"
19 
20 namespace hal {
21     namespace manifest {
22         class Hal;
23         class Interface;
24         class Sepolicy;
25         class Vndk;
26         class VendorNdk;
27         class SystemSdk;
28         class Kernel;
29         class Manifest;
30         std::optional<Manifest> read(const char* configFile);
31 
32         std::optional<Manifest> parse(const char* xml);
33 
34         class Hal {
35             public:
36             class Transport {
37                 private:
38                 const std::optional<std::string> arch_;
39                 const std::optional<std::string> ip_;
40                 const std::optional<std::string> port_;
41                 const std::optional<std::string> value_;
42                 public:
43                 Transport(std::optional<std::string> arch, std::optional<std::string> ip, std::optional<std::string> port, std::string value);
44                 const std::string& getArch() const;
45                 bool hasArch() const;
46                 const std::string& getIp() const;
47                 bool hasIp() const;
48                 const std::string& getPort() const;
49                 bool hasPort() const;
50                 const std::string& getValue() const;
51                 bool hasValue() const;
52                 static Hal::Transport read(xmlNode *root);
53             };
54 
55 
56             private:
57             const std::optional<std::string> name_;
58             const std::vector<Hal::Transport> transport_;
59             const std::vector<std::string> version_;
60             const std::vector<Interface> interface_;
61             const std::vector<std::string> fqname_;
62             const std::vector<std::string> accessor_;
63             const std::optional<std::string> format_;
64             const std::optional<std::string> exclusiveTo_;
65             const std::optional<std::string> override_;
66             const std::optional<std::string> updatableViaApex_;
67             const std::optional<std::string> updatableViaSystem_;
68             const std::optional<std::string> maxLevel_;
69             const std::optional<std::string> minLevel_;
70             public:
71             Hal(std::optional<std::string> name, std::vector<Transport> transport, std::vector<std::string> version, std::vector<Interface> interface, std::vector<std::string> fqname, std::vector<std::string> accessor, std::optional<std::string> format, std::optional<std::string> exclusiveTo, std::optional<std::string> override, std::optional<std::string> updatableViaApex, std::optional<std::string> updatableViaSystem, std::optional<std::string> maxLevel, std::optional<std::string> minLevel);
72             const std::string& getName() const;
73             bool hasName() const;
74             const std::vector<Hal::Transport>& getTransport() const;
75             bool hasTransport() const;
76             const Hal::Transport* getFirstTransport() const;
77             const std::vector<std::string>& getVersion() const;
78             bool hasVersion() const;
79             const std::string* getFirstVersion() const;
80             const std::vector<Interface>& getInterface() const;
81             bool hasInterface() const;
82             const Interface* getFirstInterface() const;
83             const std::vector<std::string>& getFqname() const;
84             bool hasFqname() const;
85             const std::string* getFirstFqname() const;
86             const std::vector<std::string>& getAccessor() const;
87             bool hasAccessor() const;
88             const std::string* getFirstAccessor() const;
89             const std::string& getFormat() const;
90             bool hasFormat() const;
91             const std::string& getExclusiveTo() const;
92             bool hasExclusiveTo() const;
93             const std::string& getOverride() const;
94             bool hasOverride() const;
95             const std::string& getUpdatableViaApex() const;
96             bool hasUpdatableViaApex() const;
97             const std::string& getUpdatableViaSystem() const;
98             bool hasUpdatableViaSystem() const;
99             const std::string& getMaxLevel() const;
100             bool hasMaxLevel() const;
101             const std::string& getMinLevel() const;
102             bool hasMinLevel() const;
103             static Hal read(xmlNode *root);
104         };
105 
106         class Interface {
107             private:
108             const std::optional<std::string> name_;
109             const std::vector<std::string> instance_;
110             public:
111             Interface(std::optional<std::string> name, std::vector<std::string> instance);
112             const std::string& getName() const;
113             bool hasName() const;
114             const std::vector<std::string>& getInstance() const;
115             bool hasInstance() const;
116             const std::string* getFirstInstance() const;
117             static Interface read(xmlNode *root);
118         };
119 
120         class Sepolicy {
121             private:
122             const std::optional<std::string> version_;
123             public:
124             explicit Sepolicy(std::optional<std::string> version);
125             const std::string& getVersion() const;
126             bool hasVersion() const;
127             static Sepolicy read(xmlNode *root);
128         };
129 
130         class Vndk {
131             private:
132             const std::optional<std::string> version_;
133             const std::vector<std::string> library_;
134             public:
135             Vndk(std::optional<std::string> version, std::vector<std::string> library);
136             const std::string& getVersion() const;
137             bool hasVersion() const;
138             const std::vector<std::string>& getLibrary() const;
139             bool hasLibrary() const;
140             const std::string* getFirstLibrary() const;
141             static Vndk read(xmlNode *root);
142         };
143 
144         class VendorNdk {
145             private:
146             const std::optional<std::string> version_;
147             const std::vector<std::string> library_;
148             public:
149             VendorNdk(std::optional<std::string> version, std::vector<std::string> library);
150             const std::string& getVersion() const;
151             bool hasVersion() const;
152             const std::vector<std::string>& getLibrary() const;
153             bool hasLibrary() const;
154             const std::string* getFirstLibrary() const;
155             static VendorNdk read(xmlNode *root);
156         };
157 
158         class SystemSdk {
159             private:
160             const std::vector<std::string> version_;
161             public:
162             explicit SystemSdk(std::vector<std::string> version);
163             const std::vector<std::string>& getVersion() const;
164             bool hasVersion() const;
165             const std::string* getFirstVersion() const;
166             static SystemSdk read(xmlNode *root);
167         };
168 
169         class Kernel {
170             public:
171             class Config {
172                 private:
173                 const std::optional<std::string> key_;
174                 const std::optional<std::string> value_;
175                 public:
176                 Config(std::optional<std::string> key, std::optional<std::string> value);
177                 const std::string& getKey() const;
178                 bool hasKey() const;
179                 const std::string& getValue() const;
180                 bool hasValue() const;
181                 static Kernel::Config read(xmlNode *root);
182             };
183 
184 
185             private:
186             const std::vector<Kernel::Config> config_;
187             const std::optional<std::string> version_;
188             const std::optional<std::string> targetLevel_;
189             public:
190             Kernel(std::vector<Config> config, std::optional<std::string> version, std::optional<std::string> targetLevel);
191             const std::vector<Kernel::Config>& getConfig() const;
192             bool hasConfig() const;
193             const Kernel::Config* getFirstConfig() const;
194             const std::string& getVersion() const;
195             bool hasVersion() const;
196             const std::string& getTargetLevel() const;
197             bool hasTargetLevel() const;
198             static Kernel read(xmlNode *root);
199         };
200 
201         class Manifest {
202             private:
203             const std::vector<Hal> hal_;
204             const std::vector<Sepolicy> sepolicy_;
205             const std::vector<Kernel> kernel_;
206             const std::vector<Vndk> vndk_;
207             const std::vector<VendorNdk> vendorNdk_;
208             const std::vector<SystemSdk> systemSdk_;
209             const std::string version_;
210             const std::string type_;
211             const std::optional<std::string> targetLevel_;
212             public:
213             Manifest(std::vector<Hal> hal, std::vector<Sepolicy> sepolicy, std::vector<Kernel> kernel, std::vector<Vndk> vndk, std::vector<VendorNdk> vendorNdk, std::vector<SystemSdk> systemSdk, std::string version, std::string type, std::optional<std::string> targetLevel);
214             const std::vector<Hal>& getHal() const;
215             bool hasHal() const;
216             const Hal* getFirstHal() const;
217             const std::vector<Sepolicy>& getSepolicy() const;
218             bool hasSepolicy() const;
219             const Sepolicy* getFirstSepolicy() const;
220             const std::vector<Kernel>& getKernel() const;
221             bool hasKernel() const;
222             const Kernel* getFirstKernel() const;
223             const std::vector<Vndk>& getVndk() const;
224             bool hasVndk() const;
225             const Vndk* getFirstVndk() const;
226             const std::vector<VendorNdk>& getVendorNdk() const;
227             bool hasVendorNdk() const;
228             const VendorNdk* getFirstVendorNdk() const;
229             const std::vector<SystemSdk>& getSystemSdk() const;
230             bool hasSystemSdk() const;
231             const SystemSdk* getFirstSystemSdk() const;
232             const std::string& getVersion() const;
233             bool hasVersion() const;
234             const std::string& getType() const;
235             bool hasType() const;
236             const std::string& getTargetLevel() const;
237             bool hasTargetLevel() const;
238             static Manifest read(xmlNode *root);
239         };
240 
241     } // manifest
242 } // hal
243 #endif // HAL_MANIFEST_H
244