Add manifest.hal.interface entry

that looks like follows:

<interface>
    <name>IBluetooth</name>
    <instance>legacy/0</instance>
    <instance>default</instance>
</interface>

If an entry doesn't exist it is default to "default" instance.

HalManfiest.getInstances and hasInstance is the API
to query these elements.

Test: libvintf_test
Bug: 35219444
Change-Id: Ic4402152c6d44c2c57c7ef1ba6ab6194ad7842f2
diff --git a/parse_xml.cpp b/parse_xml.cpp
index 0138213..c054350 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -419,6 +419,30 @@
 
 const HalImplementationConverter halImplementationConverter{};
 
+struct ManfiestHalInterfaceConverter : public XmlNodeConverter<ManifestHalInterface> {
+    std::string elementName() const override { return "interface"; }
+    void mutateNode(const ManifestHalInterface &intf, NodeType *root, DocType *d) const override {
+        appendTextElement(root, "name", intf.name, d);
+        appendTextElements(root, "instance", intf.instances, d);
+    }
+    bool buildObject(ManifestHalInterface *intf, NodeType *root) const override {
+        std::vector<std::string> instances;
+        if (!parseTextElement(root, "name", &intf->name) ||
+            !parseTextElements(root, "instance", &instances)) {
+            return false;
+        }
+        intf->instances.clear();
+        intf->instances.insert(instances.begin(), instances.end());
+        if (intf->instances.size() != instances.size()) {
+            this->mLastError = "Duplicated instances in " + intf->name;
+            return false;
+        }
+        return true;
+    }
+};
+
+const ManfiestHalInterfaceConverter manfiestHalInterfaceConverter{};
+
 struct ManifestHalConverter : public XmlNodeConverter<ManifestHal> {
     std::string elementName() const override { return "hal"; }
     void mutateNode(const ManifestHal &hal, NodeType *root, DocType *d) const override {
@@ -427,15 +451,27 @@
         appendChild(root, transportConverter(hal.transport, d));
         appendChild(root, halImplementationConverter(hal.impl, d));
         appendChildren(root, versionConverter, hal.versions, d);
+        appendChildren(root, manfiestHalInterfaceConverter, iterateValues(hal.interfaces), d);
     }
     bool buildObject(ManifestHal *object, NodeType *root) const override {
+        std::vector<ManifestHalInterface> interfaces;
         if (!parseAttr(root, "format", &object->format) ||
             !parseTextElement(root, "name", &object->name) ||
             !parseChild(root, transportConverter, &object->transport) ||
             !parseChild(root, halImplementationConverter, &object->impl) ||
-            !parseChildren(root, versionConverter, &object->versions)) {
+            !parseChildren(root, versionConverter, &object->versions) ||
+            !parseChildren(root, manfiestHalInterfaceConverter, &interfaces)) {
             return false;
         }
+        object->interfaces.clear();
+        for (auto &&interface : interfaces) {
+            auto res = object->interfaces.emplace(interface.name,
+                                                  std::move(interface));
+            if (!res.second) {
+                this->mLastError = "Duplicated instance entry " + res.first->first;
+                return false;
+            }
+        }
         return object->isValid();
     }
 };