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) {