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();
}
};