diff options
author | Yifan Hong | 2017-08-07 16:40:19 -0500 |
---|---|---|
committer | Yifan Hong | 2017-08-07 17:24:08 -0500 |
commit | e0bb98d008f2cbc19bf356a74c086bed4867ea99 (patch) | |
tree | 69a749c644ea0b6de7bb72aaad5055729c1c4404 /parse_xml.cpp | |
parent | 488e16a67311194f0fb9aa4a33219af170e6316b (diff) | |
download | platform-system-libvintf-e0bb98d008f2cbc19bf356a74c086bed4867ea99.tar.gz platform-system-libvintf-e0bb98d008f2cbc19bf356a74c086bed4867ea99.tar.xz platform-system-libvintf-e0bb98d008f2cbc19bf356a74c086bed4867ea99.zip |
Native HALs don't require <transport>.
This is stated in go/android-treble-vintf-object but the code
was not well tested. Fortunately, native HALs are not used (until now),
so we need to conform to the documentation here.
Test: libvintf_test
Bug: 64447338
Change-Id: I00d96137d4052d9da50f696ef665a73d09d818a7
Merged-In: I00d96137d4052d9da50f696ef665a73d09d818a7
Diffstat (limited to 'parse_xml.cpp')
-rw-r--r-- | parse_xml.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/parse_xml.cpp b/parse_xml.cpp index f12df00..518faec 100644 --- a/parse_xml.cpp +++ b/parse_xml.cpp | |||
@@ -16,10 +16,16 @@ | |||
16 | 16 | ||
17 | // Convert objects from and to xml. | 17 | // Convert objects from and to xml. |
18 | 18 | ||
19 | #define LOG_TAG "libvintf" | ||
20 | #include <android-base/logging.h> | ||
21 | |||
22 | #include "parse_xml.h" | ||
23 | |||
24 | #include <type_traits> | ||
25 | |||
19 | #include <tinyxml2.h> | 26 | #include <tinyxml2.h> |
20 | 27 | ||
21 | #include "parse_string.h" | 28 | #include "parse_string.h" |
22 | #include "parse_xml.h" | ||
23 | 29 | ||
24 | namespace android { | 30 | namespace android { |
25 | namespace vintf { | 31 | namespace vintf { |
@@ -539,11 +545,35 @@ struct ManifestHalConverter : public XmlNodeConverter<ManifestHal> { | |||
539 | std::vector<HalInterface> interfaces; | 545 | std::vector<HalInterface> interfaces; |
540 | if (!parseOptionalAttr(root, "format", HalFormat::HIDL, &object->format) || | 546 | if (!parseOptionalAttr(root, "format", HalFormat::HIDL, &object->format) || |
541 | !parseTextElement(root, "name", &object->name) || | 547 | !parseTextElement(root, "name", &object->name) || |
542 | !parseChild(root, transportArchConverter, &object->transportArch) || | 548 | !parseOptionalChild(root, transportArchConverter, {}, &object->transportArch) || |
543 | !parseChildren(root, versionConverter, &object->versions) || | 549 | !parseChildren(root, versionConverter, &object->versions) || |
544 | !parseChildren(root, halInterfaceConverter, &interfaces)) { | 550 | !parseChildren(root, halInterfaceConverter, &interfaces)) { |
545 | return false; | 551 | return false; |
546 | } | 552 | } |
553 | |||
554 | switch (object->format) { | ||
555 | case HalFormat::HIDL: { | ||
556 | if (object->transportArch.empty()) { | ||
557 | this->mLastError = | ||
558 | "HIDL HAL '" + object->name + "' should have <transport> defined."; | ||
559 | return false; | ||
560 | } | ||
561 | } break; | ||
562 | case HalFormat::NATIVE: { | ||
563 | if (!object->transportArch.empty()) { | ||
564 | this->mLastError = | ||
565 | "Native HAL '" + object->name + "' should not have <transport> defined."; | ||
566 | return false; | ||
567 | } | ||
568 | } break; | ||
569 | default: { | ||
570 | LOG(FATAL) << "Unhandled HalFormat " | ||
571 | << static_cast<typename std::underlying_type<HalFormat>::type>( | ||
572 | object->format); | ||
573 | } break; | ||
574 | } | ||
575 | if (!object->transportArch.isValid()) return false; | ||
576 | |||
547 | object->interfaces.clear(); | 577 | object->interfaces.clear(); |
548 | for (auto &&interface : interfaces) { | 578 | for (auto &&interface : interfaces) { |
549 | auto res = object->interfaces.emplace(interface.name, | 579 | auto res = object->interfaces.emplace(interface.name, |