Add manifest/compatibility-matrix.type attribute
to distinguish device and framework HAL manifest, and
device and framework compatibility matrix.
Add .device / .framework entries to HalManifest and
CompatibilityMatrix class for device-only / fwk-only
entries. Access to these fields should be guarded with
a check to mType.
Test: libvintf_test
Test: boots
Change-Id: Id9c93c1e6bb585234a9ae6d9296f5a10582ef58f
diff --git a/parse_xml.cpp b/parse_xml.cpp
index f52f849..7500797 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -543,11 +543,19 @@
std::string elementName() const override { return "manifest"; }
void mutateNode(const HalManifest &m, NodeType *root, DocType *d) const override {
appendAttr(root, "version", HalManifest::kVersion);
+ appendAttr(root, "type", m.mType);
appendChildren(root, manifestHalConverter, m.getHals(), d);
}
bool buildObject(HalManifest *object, NodeType *root) const override {
+ Version version;
std::vector<ManifestHal> hals;
- if (!parseChildren(root, manifestHalConverter, &hals)) {
+ if (!parseAttr(root, "version", &version) ||
+ !parseAttr(root, "type", &object->mType) ||
+ !parseChildren(root, manifestHalConverter, &hals)) {
+ return false;
+ }
+ if (version != HalManifest::kVersion) {
+ this->mLastError = "Unrecognized manifest.version";
return false;
}
for (auto &&hal : hals) {
@@ -566,15 +574,31 @@
std::string elementName() const override { return "compatibility-matrix"; }
void mutateNode(const CompatibilityMatrix &m, NodeType *root, DocType *d) const override {
appendAttr(root, "version", CompatibilityMatrix::kVersion);
+ appendAttr(root, "type", m.mType);
appendChildren(root, matrixHalConverter, iterateValues(m.mHals), d);
- appendChildren(root, matrixKernelConverter, m.mKernels, d);
- appendChild(root, sepolicyConverter(m.mSepolicy, d));
+ if (m.mType == SchemaType::FRAMEWORK) {
+ appendChildren(root, matrixKernelConverter, m.framework.mKernels, d);
+ appendChild(root, sepolicyConverter(m.framework.mSepolicy, d));
+ }
}
bool buildObject(CompatibilityMatrix *object, NodeType *root) const override {
+ Version version;
std::vector<MatrixHal> hals;
- if (!parseChildren(root, matrixHalConverter, &hals) ||
- !parseChildren(root, matrixKernelConverter, &object->mKernels) ||
- !parseChild(root, sepolicyConverter, &object->mSepolicy)) {
+ if (!parseAttr(root, "version", &version) ||
+ !parseAttr(root, "type", &object->mType) ||
+ !parseChildren(root, matrixHalConverter, &hals)) {
+ return false;
+ }
+
+ if (object->mType == SchemaType::FRAMEWORK) {
+ if (!parseChildren(root, matrixKernelConverter, &object->framework.mKernels) ||
+ !parseChild(root, sepolicyConverter, &object->framework.mSepolicy)) {
+ return false;
+ }
+ }
+
+ if (version != CompatibilityMatrix::kVersion) {
+ this->mLastError = "Unrecognized compatibility-matrix.version";
return false;
}
for (auto &&hal : hals) {