Add HalInterface to compatibility matrix

Test: libvintf_test
Test: vintf_object_test

Bug: 38395193
Change-Id: I6dfc21bbfb63b575558405e441f3926ff3813eb8
Merged-In: I6dfc21bbfb63b575558405e441f3926ff3813eb8
diff --git a/parse_xml.cpp b/parse_xml.cpp
index 7287604..8caab4f 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -470,14 +470,25 @@
         appendAttr(root, "optional", hal.optional);
         appendTextElement(root, "name", hal.name, d);
         appendChildren(root, versionRangeConverter, hal.versionRanges, d);
+        appendChildren(root, halInterfaceConverter, iterateValues(hal.interfaces), d);
     }
     bool buildObject(MatrixHal *object, NodeType *root) const override {
+        std::vector<HalInterface> interfaces;
         if (!parseOptionalAttr(root, "format", HalFormat::HIDL, &object->format) ||
             !parseOptionalAttr(root, "optional", false /* defaultValue */, &object->optional) ||
             !parseTextElement(root, "name", &object->name) ||
-            !parseChildren(root, versionRangeConverter, &object->versionRanges)) {
+            !parseChildren(root, versionRangeConverter, &object->versionRanges) ||
+            !parseChildren(root, halInterfaceConverter, &interfaces)) {
             return false;
         }
+        for (auto&& interface : interfaces) {
+            std::string name{interface.name};
+            auto res = object->interfaces.emplace(std::move(name), std::move(interface));
+            if (!res.second) {
+                this->mLastError = "Duplicated instance entry " + res.first->first;
+                return false;
+            }
+        }
         return true;
     }
 };