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