1 #define LOG_TAG "hal.manifest"
2 #include "hal_manifest.h"
3 
4 #include <assert.h>
5 #ifndef __BIONIC__
6 #define __assert2(f,n,fun,e) do { fprintf(stderr, "%s:%d: %s: Assertion `%s' failed", (f), (n), (fun), (e)); abort(); } while (false)
7 #endif
8 #define _xsdc_assert(e) do if (!(e)) __assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, #e); while (false)
9 
10 namespace hal {
11     namespace manifest {
12         template <class T>
13         constexpr void (*xmlDeleter)(T* t);
14         template <>
15         constexpr auto xmlDeleter<xmlDoc> = xmlFreeDoc;
16         template <>
__anonf6c98da70102(xmlChar *s) 17         auto xmlDeleter<xmlChar> = [](xmlChar *s) { xmlFree(s); };
18 
19         template <class T>
make_xmlUnique(T * t)20         constexpr auto make_xmlUnique(T *t) {
21             auto deleter = [](T *t) { xmlDeleter<T>(t); };
22             return std::unique_ptr<T, decltype(deleter)>{t, deleter};
23         }
24 
getXmlAttribute(const xmlNode * cur,const char * attribute)25         static std::string getXmlAttribute(const xmlNode *cur, const char *attribute) {
26             auto xmlValue = make_xmlUnique(xmlGetProp(cur, reinterpret_cast<const xmlChar*>(attribute)));
27             if (xmlValue == nullptr) {
28                 return "";
29             }
30             std::string value(reinterpret_cast<const char*>(xmlValue.get()));
31             return value;
32         }
33 
read(const char * configFile)34         std::optional<Manifest> read(const char* configFile) {
35             auto doc = make_xmlUnique(xmlParseFile(configFile));
36             if (doc == nullptr) {
37                 return std::nullopt;
38             }
39             xmlNodePtr _child = xmlDocGetRootElement(doc.get());
40             if (_child == nullptr) {
41                 return std::nullopt;
42             }
43             if (xmlXIncludeProcess(doc.get()) < 0) {
44                 return std::nullopt;
45             }
46 
47             if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("manifest"))) {
48                 Manifest _value = Manifest::read(_child);
49                 return _value;
50             }
51             return std::nullopt;
52         }
53 
parse(const char * xml)54         std::optional<Manifest> parse(const char* xml) {
55             auto doc = make_xmlUnique(xmlParseDoc(reinterpret_cast<const xmlChar*>(xml)));
56             if (doc == nullptr) {
57                 return std::nullopt;
58             }
59             xmlNodePtr _child = xmlDocGetRootElement(doc.get());
60             if (_child == nullptr) {
61                 return std::nullopt;
62             }
63             if (xmlXIncludeProcess(doc.get()) < 0) {
64                 return std::nullopt;
65             }
66 
67             if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("manifest"))) {
68                 Manifest _value = Manifest::read(_child);
69                 return _value;
70             }
71             return std::nullopt;
72         }
73 
74 
Transport(std::optional<std::string> arch,std::optional<std::string> ip,std::optional<std::string> port,std::string value)75         Hal::Transport::Transport(std::optional<std::string> arch, std::optional<std::string> ip, std::optional<std::string> port, std::string value) : arch_(std::move(arch)), ip_(std::move(ip)), port_(std::move(port)), value_(value) {
76         }
77 
getArch() const78         const std::string& Hal::Transport::getArch() const {
79             _xsdc_assert(hasArch());
80             return arch_.value();
81         }
82 
hasArch() const83         bool Hal::Transport::hasArch() const {
84             return arch_.has_value();
85         }
86 
getIp() const87         const std::string& Hal::Transport::getIp() const {
88             _xsdc_assert(hasIp());
89             return ip_.value();
90         }
91 
hasIp() const92         bool Hal::Transport::hasIp() const {
93             return ip_.has_value();
94         }
95 
getPort() const96         const std::string& Hal::Transport::getPort() const {
97             _xsdc_assert(hasPort());
98             return port_.value();
99         }
100 
hasPort() const101         bool Hal::Transport::hasPort() const {
102             return port_.has_value();
103         }
104 
getValue() const105         const std::string& Hal::Transport::getValue() const {
106             _xsdc_assert(hasValue());
107             return value_.value();
108         }
109 
hasValue() const110         bool Hal::Transport::hasValue() const {
111             return value_.has_value();
112         }
113 
read(xmlNode * root)114         Hal::Transport Hal::Transport::read(xmlNode *root) {
115             std::string _raw;
116             _raw = getXmlAttribute(root, "arch");
117             std::optional<std::string> arch = std::nullopt;
118             if (_raw != "") {
119                 std::string &_value = _raw;
120                 arch = _value;
121             }
122             _raw = getXmlAttribute(root, "ip");
123             std::optional<std::string> ip = std::nullopt;
124             if (_raw != "") {
125                 std::string &_value = _raw;
126                 ip = _value;
127             }
128             _raw = getXmlAttribute(root, "port");
129             std::optional<std::string> port = std::nullopt;
130             if (_raw != "") {
131                 std::string &_value = _raw;
132                 port = _value;
133             }
134             auto xmlValue = make_xmlUnique(xmlNodeListGetString(root->doc, root->xmlChildrenNode, 1));
135             if (xmlValue == nullptr) {
136                 _raw = "";
137             } else {
138                 _raw = reinterpret_cast<const char*>(xmlValue.get());
139             }
140             std::string &_value = _raw;
141             Hal::Transport instance(arch, ip, port, _value);
142             return instance;
143         }
144 
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)145         Hal::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) : name_(std::move(name)), transport_(std::move(transport)), version_(std::move(version)), interface_(std::move(interface)), fqname_(std::move(fqname)), accessor_(std::move(accessor)), format_(std::move(format)), exclusiveTo_(std::move(exclusiveTo)), override_(std::move(override)), updatableViaApex_(std::move(updatableViaApex)), updatableViaSystem_(std::move(updatableViaSystem)), maxLevel_(std::move(maxLevel)), minLevel_(std::move(minLevel)) {
146         }
147 
getName() const148         const std::string& Hal::getName() const {
149             _xsdc_assert(hasName());
150             return name_.value();
151         }
152 
hasName() const153         bool Hal::hasName() const {
154             return name_.has_value();
155         }
156 
getTransport() const157         const std::vector<Hal::Transport>& Hal::getTransport() const {
158             return transport_;
159         }
160 
hasTransport() const161         bool Hal::hasTransport() const {
162             return !(transport_.empty());
163         }
164 
getFirstTransport() const165         const Hal::Transport* Hal::getFirstTransport() const {
166             if (transport_.empty()) {
167                 return nullptr;
168             }
169             return &transport_[0];
170         }
171 
getVersion() const172         const std::vector<std::string>& Hal::getVersion() const {
173             return version_;
174         }
175 
hasVersion() const176         bool Hal::hasVersion() const {
177             return !(version_.empty());
178         }
179 
getFirstVersion() const180         const std::string* Hal::getFirstVersion() const {
181             if (version_.empty()) {
182                 return nullptr;
183             }
184             return &version_[0];
185         }
186 
getInterface() const187         const std::vector<Interface>& Hal::getInterface() const {
188             return interface_;
189         }
190 
hasInterface() const191         bool Hal::hasInterface() const {
192             return !(interface_.empty());
193         }
194 
getFirstInterface() const195         const Interface* Hal::getFirstInterface() const {
196             if (interface_.empty()) {
197                 return nullptr;
198             }
199             return &interface_[0];
200         }
201 
getFqname() const202         const std::vector<std::string>& Hal::getFqname() const {
203             return fqname_;
204         }
205 
hasFqname() const206         bool Hal::hasFqname() const {
207             return !(fqname_.empty());
208         }
209 
getFirstFqname() const210         const std::string* Hal::getFirstFqname() const {
211             if (fqname_.empty()) {
212                 return nullptr;
213             }
214             return &fqname_[0];
215         }
216 
getAccessor() const217         const std::vector<std::string>& Hal::getAccessor() const {
218             return accessor_;
219         }
220 
hasAccessor() const221         bool Hal::hasAccessor() const {
222             return !(accessor_.empty());
223         }
224 
getFirstAccessor() const225         const std::string* Hal::getFirstAccessor() const {
226             if (accessor_.empty()) {
227                 return nullptr;
228             }
229             return &accessor_[0];
230         }
231 
getFormat() const232         const std::string& Hal::getFormat() const {
233             _xsdc_assert(hasFormat());
234             return format_.value();
235         }
236 
hasFormat() const237         bool Hal::hasFormat() const {
238             return format_.has_value();
239         }
240 
getExclusiveTo() const241         const std::string& Hal::getExclusiveTo() const {
242             _xsdc_assert(hasExclusiveTo());
243             return exclusiveTo_.value();
244         }
245 
hasExclusiveTo() const246         bool Hal::hasExclusiveTo() const {
247             return exclusiveTo_.has_value();
248         }
249 
getOverride() const250         const std::string& Hal::getOverride() const {
251             _xsdc_assert(hasOverride());
252             return override_.value();
253         }
254 
hasOverride() const255         bool Hal::hasOverride() const {
256             return override_.has_value();
257         }
258 
getUpdatableViaApex() const259         const std::string& Hal::getUpdatableViaApex() const {
260             _xsdc_assert(hasUpdatableViaApex());
261             return updatableViaApex_.value();
262         }
263 
hasUpdatableViaApex() const264         bool Hal::hasUpdatableViaApex() const {
265             return updatableViaApex_.has_value();
266         }
267 
getUpdatableViaSystem() const268         const std::string& Hal::getUpdatableViaSystem() const {
269             _xsdc_assert(hasUpdatableViaSystem());
270             return updatableViaSystem_.value();
271         }
272 
hasUpdatableViaSystem() const273         bool Hal::hasUpdatableViaSystem() const {
274             return updatableViaSystem_.has_value();
275         }
276 
getMaxLevel() const277         const std::string& Hal::getMaxLevel() const {
278             _xsdc_assert(hasMaxLevel());
279             return maxLevel_.value();
280         }
281 
hasMaxLevel() const282         bool Hal::hasMaxLevel() const {
283             return maxLevel_.has_value();
284         }
285 
getMinLevel() const286         const std::string& Hal::getMinLevel() const {
287             _xsdc_assert(hasMinLevel());
288             return minLevel_.value();
289         }
290 
hasMinLevel() const291         bool Hal::hasMinLevel() const {
292             return minLevel_.has_value();
293         }
294 
read(xmlNode * root)295         Hal Hal::read(xmlNode *root) {
296             std::string _raw;
297             _raw = getXmlAttribute(root, "format");
298             std::optional<std::string> format = std::nullopt;
299             if (_raw != "") {
300                 std::string &_value = _raw;
301                 format = _value;
302             }
303             _raw = getXmlAttribute(root, "exclusive-to");
304             std::optional<std::string> exclusiveTo = std::nullopt;
305             if (_raw != "") {
306                 std::string &_value = _raw;
307                 exclusiveTo = _value;
308             }
309             _raw = getXmlAttribute(root, "override");
310             std::optional<std::string> override = std::nullopt;
311             if (_raw != "") {
312                 std::string &_value = _raw;
313                 override = _value;
314             }
315             _raw = getXmlAttribute(root, "updatable-via-apex");
316             std::optional<std::string> updatableViaApex = std::nullopt;
317             if (_raw != "") {
318                 std::string &_value = _raw;
319                 updatableViaApex = _value;
320             }
321             _raw = getXmlAttribute(root, "updatable-via-system");
322             std::optional<std::string> updatableViaSystem = std::nullopt;
323             if (_raw != "") {
324                 std::string &_value = _raw;
325                 updatableViaSystem = _value;
326             }
327             _raw = getXmlAttribute(root, "max-level");
328             std::optional<std::string> maxLevel = std::nullopt;
329             if (_raw != "") {
330                 std::string &_value = _raw;
331                 maxLevel = _value;
332             }
333             _raw = getXmlAttribute(root, "min-level");
334             std::optional<std::string> minLevel = std::nullopt;
335             if (_raw != "") {
336                 std::string &_value = _raw;
337                 minLevel = _value;
338             }
339             std::optional<std::string> name;
340             std::vector<Transport> transport;
341             std::vector<std::string> version;
342             std::vector<Interface> interface;
343             std::vector<std::string> fqname;
344             std::vector<std::string> accessor;
345             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
346                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("name"))) {
347                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
348                     if (xmlValue == nullptr) {
349                         _raw = "";
350                     } else {
351                         _raw = reinterpret_cast<const char*>(xmlValue.get());
352                     }
353                     std::string &_value = _raw;
354                     name = std::move(_value);
355                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("transport"))) {
356                     Transport _value = Transport::read(_child);
357                     transport.push_back(std::move(_value));
358                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("version"))) {
359                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
360                     if (xmlValue == nullptr) {
361                         _raw = "";
362                     } else {
363                         _raw = reinterpret_cast<const char*>(xmlValue.get());
364                     }
365                     std::string &_value = _raw;
366                     version.push_back(std::move(_value));
367                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("interface"))) {
368                     Interface _value = Interface::read(_child);
369                     interface.push_back(std::move(_value));
370                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("fqname"))) {
371                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
372                     if (xmlValue == nullptr) {
373                         _raw = "";
374                     } else {
375                         _raw = reinterpret_cast<const char*>(xmlValue.get());
376                     }
377                     std::string &_value = _raw;
378                     fqname.push_back(std::move(_value));
379                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("accessor"))) {
380                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
381                     if (xmlValue == nullptr) {
382                         _raw = "";
383                     } else {
384                         _raw = reinterpret_cast<const char*>(xmlValue.get());
385                     }
386                     std::string &_value = _raw;
387                     accessor.push_back(std::move(_value));
388                 }
389             }
390             Hal instance(name, transport, version, interface, fqname, accessor, format, exclusiveTo, override, updatableViaApex, updatableViaSystem, maxLevel, minLevel);
391             return instance;
392         }
393 
Interface(std::optional<std::string> name,std::vector<std::string> instance)394         Interface::Interface(std::optional<std::string> name, std::vector<std::string> instance) : name_(std::move(name)), instance_(std::move(instance)) {
395         }
396 
getName() const397         const std::string& Interface::getName() const {
398             _xsdc_assert(hasName());
399             return name_.value();
400         }
401 
hasName() const402         bool Interface::hasName() const {
403             return name_.has_value();
404         }
405 
getInstance() const406         const std::vector<std::string>& Interface::getInstance() const {
407             return instance_;
408         }
409 
hasInstance() const410         bool Interface::hasInstance() const {
411             return !(instance_.empty());
412         }
413 
getFirstInstance() const414         const std::string* Interface::getFirstInstance() const {
415             if (instance_.empty()) {
416                 return nullptr;
417             }
418             return &instance_[0];
419         }
420 
read(xmlNode * root)421         Interface Interface::read(xmlNode *root) {
422             std::string _raw;
423             std::optional<std::string> name;
424             std::vector<std::string> instance;
425             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
426                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("name"))) {
427                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
428                     if (xmlValue == nullptr) {
429                         _raw = "";
430                     } else {
431                         _raw = reinterpret_cast<const char*>(xmlValue.get());
432                     }
433                     std::string &_value = _raw;
434                     name = std::move(_value);
435                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("instance"))) {
436                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
437                     if (xmlValue == nullptr) {
438                         _raw = "";
439                     } else {
440                         _raw = reinterpret_cast<const char*>(xmlValue.get());
441                     }
442                     std::string &_value = _raw;
443                     instance.push_back(std::move(_value));
444                 }
445             }
446             Interface instance(name, instance);
447             return instance;
448         }
449 
Sepolicy(std::optional<std::string> version)450         Sepolicy::Sepolicy(std::optional<std::string> version) : version_(std::move(version)) {
451         }
452 
getVersion() const453         const std::string& Sepolicy::getVersion() const {
454             _xsdc_assert(hasVersion());
455             return version_.value();
456         }
457 
hasVersion() const458         bool Sepolicy::hasVersion() const {
459             return version_.has_value();
460         }
461 
read(xmlNode * root)462         Sepolicy Sepolicy::read(xmlNode *root) {
463             std::string _raw;
464             std::optional<std::string> version;
465             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
466                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("version"))) {
467                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
468                     if (xmlValue == nullptr) {
469                         _raw = "";
470                     } else {
471                         _raw = reinterpret_cast<const char*>(xmlValue.get());
472                     }
473                     std::string &_value = _raw;
474                     version = std::move(_value);
475                 }
476             }
477             Sepolicy instance(version);
478             return instance;
479         }
480 
Vndk(std::optional<std::string> version,std::vector<std::string> library)481         Vndk::Vndk(std::optional<std::string> version, std::vector<std::string> library) : version_(std::move(version)), library_(std::move(library)) {
482         }
483 
getVersion() const484         const std::string& Vndk::getVersion() const {
485             _xsdc_assert(hasVersion());
486             return version_.value();
487         }
488 
hasVersion() const489         bool Vndk::hasVersion() const {
490             return version_.has_value();
491         }
492 
getLibrary() const493         const std::vector<std::string>& Vndk::getLibrary() const {
494             return library_;
495         }
496 
hasLibrary() const497         bool Vndk::hasLibrary() const {
498             return !(library_.empty());
499         }
500 
getFirstLibrary() const501         const std::string* Vndk::getFirstLibrary() const {
502             if (library_.empty()) {
503                 return nullptr;
504             }
505             return &library_[0];
506         }
507 
read(xmlNode * root)508         Vndk Vndk::read(xmlNode *root) {
509             std::string _raw;
510             std::optional<std::string> version;
511             std::vector<std::string> library;
512             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
513                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("version"))) {
514                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
515                     if (xmlValue == nullptr) {
516                         _raw = "";
517                     } else {
518                         _raw = reinterpret_cast<const char*>(xmlValue.get());
519                     }
520                     std::string &_value = _raw;
521                     version = std::move(_value);
522                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("library"))) {
523                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
524                     if (xmlValue == nullptr) {
525                         _raw = "";
526                     } else {
527                         _raw = reinterpret_cast<const char*>(xmlValue.get());
528                     }
529                     std::string &_value = _raw;
530                     library.push_back(std::move(_value));
531                 }
532             }
533             Vndk instance(version, library);
534             return instance;
535         }
536 
VendorNdk(std::optional<std::string> version,std::vector<std::string> library)537         VendorNdk::VendorNdk(std::optional<std::string> version, std::vector<std::string> library) : version_(std::move(version)), library_(std::move(library)) {
538         }
539 
getVersion() const540         const std::string& VendorNdk::getVersion() const {
541             _xsdc_assert(hasVersion());
542             return version_.value();
543         }
544 
hasVersion() const545         bool VendorNdk::hasVersion() const {
546             return version_.has_value();
547         }
548 
getLibrary() const549         const std::vector<std::string>& VendorNdk::getLibrary() const {
550             return library_;
551         }
552 
hasLibrary() const553         bool VendorNdk::hasLibrary() const {
554             return !(library_.empty());
555         }
556 
getFirstLibrary() const557         const std::string* VendorNdk::getFirstLibrary() const {
558             if (library_.empty()) {
559                 return nullptr;
560             }
561             return &library_[0];
562         }
563 
read(xmlNode * root)564         VendorNdk VendorNdk::read(xmlNode *root) {
565             std::string _raw;
566             std::optional<std::string> version;
567             std::vector<std::string> library;
568             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
569                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("version"))) {
570                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
571                     if (xmlValue == nullptr) {
572                         _raw = "";
573                     } else {
574                         _raw = reinterpret_cast<const char*>(xmlValue.get());
575                     }
576                     std::string &_value = _raw;
577                     version = std::move(_value);
578                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("library"))) {
579                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
580                     if (xmlValue == nullptr) {
581                         _raw = "";
582                     } else {
583                         _raw = reinterpret_cast<const char*>(xmlValue.get());
584                     }
585                     std::string &_value = _raw;
586                     library.push_back(std::move(_value));
587                 }
588             }
589             VendorNdk instance(version, library);
590             return instance;
591         }
592 
SystemSdk(std::vector<std::string> version)593         SystemSdk::SystemSdk(std::vector<std::string> version) : version_(std::move(version)) {
594         }
595 
getVersion() const596         const std::vector<std::string>& SystemSdk::getVersion() const {
597             return version_;
598         }
599 
hasVersion() const600         bool SystemSdk::hasVersion() const {
601             return !(version_.empty());
602         }
603 
getFirstVersion() const604         const std::string* SystemSdk::getFirstVersion() const {
605             if (version_.empty()) {
606                 return nullptr;
607             }
608             return &version_[0];
609         }
610 
read(xmlNode * root)611         SystemSdk SystemSdk::read(xmlNode *root) {
612             std::string _raw;
613             std::vector<std::string> version;
614             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
615                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("version"))) {
616                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
617                     if (xmlValue == nullptr) {
618                         _raw = "";
619                     } else {
620                         _raw = reinterpret_cast<const char*>(xmlValue.get());
621                     }
622                     std::string &_value = _raw;
623                     version.push_back(std::move(_value));
624                 }
625             }
626             SystemSdk instance(version);
627             return instance;
628         }
629 
Config(std::optional<std::string> key,std::optional<std::string> value)630         Kernel::Config::Config(std::optional<std::string> key, std::optional<std::string> value) : key_(std::move(key)), value_(std::move(value)) {
631         }
632 
getKey() const633         const std::string& Kernel::Config::getKey() const {
634             _xsdc_assert(hasKey());
635             return key_.value();
636         }
637 
hasKey() const638         bool Kernel::Config::hasKey() const {
639             return key_.has_value();
640         }
641 
getValue() const642         const std::string& Kernel::Config::getValue() const {
643             _xsdc_assert(hasValue());
644             return value_.value();
645         }
646 
hasValue() const647         bool Kernel::Config::hasValue() const {
648             return value_.has_value();
649         }
650 
read(xmlNode * root)651         Kernel::Config Kernel::Config::read(xmlNode *root) {
652             std::string _raw;
653             std::optional<std::string> key;
654             std::optional<std::string> value;
655             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
656                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("key"))) {
657                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
658                     if (xmlValue == nullptr) {
659                         _raw = "";
660                     } else {
661                         _raw = reinterpret_cast<const char*>(xmlValue.get());
662                     }
663                     std::string &_value = _raw;
664                     key = std::move(_value);
665                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("value"))) {
666                     auto xmlValue = make_xmlUnique(xmlNodeListGetString(_child->doc, _child->xmlChildrenNode, 1));
667                     if (xmlValue == nullptr) {
668                         _raw = "";
669                     } else {
670                         _raw = reinterpret_cast<const char*>(xmlValue.get());
671                     }
672                     std::string &_value = _raw;
673                     value = std::move(_value);
674                 }
675             }
676             Kernel::Config instance(key, value);
677             return instance;
678         }
679 
Kernel(std::vector<Config> config,std::optional<std::string> version,std::optional<std::string> targetLevel)680         Kernel::Kernel(std::vector<Config> config, std::optional<std::string> version, std::optional<std::string> targetLevel) : config_(std::move(config)), version_(std::move(version)), targetLevel_(std::move(targetLevel)) {
681         }
682 
getConfig() const683         const std::vector<Kernel::Config>& Kernel::getConfig() const {
684             return config_;
685         }
686 
hasConfig() const687         bool Kernel::hasConfig() const {
688             return !(config_.empty());
689         }
690 
getFirstConfig() const691         const Kernel::Config* Kernel::getFirstConfig() const {
692             if (config_.empty()) {
693                 return nullptr;
694             }
695             return &config_[0];
696         }
697 
getVersion() const698         const std::string& Kernel::getVersion() const {
699             _xsdc_assert(hasVersion());
700             return version_.value();
701         }
702 
hasVersion() const703         bool Kernel::hasVersion() const {
704             return version_.has_value();
705         }
706 
getTargetLevel() const707         const std::string& Kernel::getTargetLevel() const {
708             _xsdc_assert(hasTargetLevel());
709             return targetLevel_.value();
710         }
711 
hasTargetLevel() const712         bool Kernel::hasTargetLevel() const {
713             return targetLevel_.has_value();
714         }
715 
read(xmlNode * root)716         Kernel Kernel::read(xmlNode *root) {
717             std::string _raw;
718             _raw = getXmlAttribute(root, "version");
719             std::optional<std::string> version = std::nullopt;
720             if (_raw != "") {
721                 std::string &_value = _raw;
722                 version = _value;
723             }
724             _raw = getXmlAttribute(root, "target-level");
725             std::optional<std::string> targetLevel = std::nullopt;
726             if (_raw != "") {
727                 std::string &_value = _raw;
728                 targetLevel = _value;
729             }
730             std::vector<Config> config;
731             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
732                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("config"))) {
733                     Config _value = Config::read(_child);
734                     config.push_back(std::move(_value));
735                 }
736             }
737             Kernel instance(config, version, targetLevel);
738             return instance;
739         }
740 
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)741         Manifest::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) : hal_(std::move(hal)), sepolicy_(std::move(sepolicy)), kernel_(std::move(kernel)), vndk_(std::move(vndk)), vendorNdk_(std::move(vendorNdk)), systemSdk_(std::move(systemSdk)), version_(std::move(version)), type_(std::move(type)), targetLevel_(std::move(targetLevel)) {
742         }
743 
getHal() const744         const std::vector<Hal>& Manifest::getHal() const {
745             return hal_;
746         }
747 
hasHal() const748         bool Manifest::hasHal() const {
749             return !(hal_.empty());
750         }
751 
getFirstHal() const752         const Hal* Manifest::getFirstHal() const {
753             if (hal_.empty()) {
754                 return nullptr;
755             }
756             return &hal_[0];
757         }
758 
getSepolicy() const759         const std::vector<Sepolicy>& Manifest::getSepolicy() const {
760             return sepolicy_;
761         }
762 
hasSepolicy() const763         bool Manifest::hasSepolicy() const {
764             return !(sepolicy_.empty());
765         }
766 
getFirstSepolicy() const767         const Sepolicy* Manifest::getFirstSepolicy() const {
768             if (sepolicy_.empty()) {
769                 return nullptr;
770             }
771             return &sepolicy_[0];
772         }
773 
getKernel() const774         const std::vector<Kernel>& Manifest::getKernel() const {
775             return kernel_;
776         }
777 
hasKernel() const778         bool Manifest::hasKernel() const {
779             return !(kernel_.empty());
780         }
781 
getFirstKernel() const782         const Kernel* Manifest::getFirstKernel() const {
783             if (kernel_.empty()) {
784                 return nullptr;
785             }
786             return &kernel_[0];
787         }
788 
getVndk() const789         const std::vector<Vndk>& Manifest::getVndk() const {
790             return vndk_;
791         }
792 
hasVndk() const793         bool Manifest::hasVndk() const {
794             return !(vndk_.empty());
795         }
796 
getFirstVndk() const797         const Vndk* Manifest::getFirstVndk() const {
798             if (vndk_.empty()) {
799                 return nullptr;
800             }
801             return &vndk_[0];
802         }
803 
getVendorNdk() const804         const std::vector<VendorNdk>& Manifest::getVendorNdk() const {
805             return vendorNdk_;
806         }
807 
hasVendorNdk() const808         bool Manifest::hasVendorNdk() const {
809             return !(vendorNdk_.empty());
810         }
811 
getFirstVendorNdk() const812         const VendorNdk* Manifest::getFirstVendorNdk() const {
813             if (vendorNdk_.empty()) {
814                 return nullptr;
815             }
816             return &vendorNdk_[0];
817         }
818 
getSystemSdk() const819         const std::vector<SystemSdk>& Manifest::getSystemSdk() const {
820             return systemSdk_;
821         }
822 
hasSystemSdk() const823         bool Manifest::hasSystemSdk() const {
824             return !(systemSdk_.empty());
825         }
826 
getFirstSystemSdk() const827         const SystemSdk* Manifest::getFirstSystemSdk() const {
828             if (systemSdk_.empty()) {
829                 return nullptr;
830             }
831             return &systemSdk_[0];
832         }
833 
getVersion() const834         const std::string& Manifest::getVersion() const {
835             return version_;
836         }
837 
hasVersion() const838         bool Manifest::hasVersion() const {
839             return true;
840         }
841 
getType() const842         const std::string& Manifest::getType() const {
843             return type_;
844         }
845 
hasType() const846         bool Manifest::hasType() const {
847             return true;
848         }
849 
getTargetLevel() const850         const std::string& Manifest::getTargetLevel() const {
851             _xsdc_assert(hasTargetLevel());
852             return targetLevel_.value();
853         }
854 
hasTargetLevel() const855         bool Manifest::hasTargetLevel() const {
856             return targetLevel_.has_value();
857         }
858 
read(xmlNode * root)859         Manifest Manifest::read(xmlNode *root) {
860             std::string _raw;
861             _raw = getXmlAttribute(root, "version");
862             std::string version{};
863             if (_raw != "") {
864                 std::string &_value = _raw;
865                 version = _value;
866             }
867             _raw = getXmlAttribute(root, "type");
868             std::string type{};
869             if (_raw != "") {
870                 std::string &_value = _raw;
871                 type = _value;
872             }
873             _raw = getXmlAttribute(root, "target-level");
874             std::optional<std::string> targetLevel = std::nullopt;
875             if (_raw != "") {
876                 std::string &_value = _raw;
877                 targetLevel = _value;
878             }
879             std::vector<Hal> hal;
880             std::vector<Sepolicy> sepolicy;
881             std::vector<Kernel> kernel;
882             std::vector<Vndk> vndk;
883             std::vector<VendorNdk> vendorNdk;
884             std::vector<SystemSdk> systemSdk;
885             for (auto *_child = root->xmlChildrenNode; _child != nullptr; _child = _child->next) {
886                 if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("hal"))) {
887                     Hal _value = Hal::read(_child);
888                     hal.push_back(std::move(_value));
889                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("sepolicy"))) {
890                     Sepolicy _value = Sepolicy::read(_child);
891                     sepolicy.push_back(std::move(_value));
892                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("kernel"))) {
893                     Kernel _value = Kernel::read(_child);
894                     kernel.push_back(std::move(_value));
895                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("vndk"))) {
896                     Vndk _value = Vndk::read(_child);
897                     vndk.push_back(std::move(_value));
898                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("vendor-ndk"))) {
899                     VendorNdk _value = VendorNdk::read(_child);
900                     vendorNdk.push_back(std::move(_value));
901                 } else if (!xmlStrcmp(_child->name, reinterpret_cast<const xmlChar*>("system-sdk"))) {
902                     SystemSdk _value = SystemSdk::read(_child);
903                     systemSdk.push_back(std::move(_value));
904                 }
905             }
906             Manifest instance(hal, sepolicy, kernel, vndk, vendorNdk, systemSdk, version, type, targetLevel);
907             return instance;
908         }
909     } // manifest
910 } // hal
911