Add <sepolicy> tag to HalManifest.

Test: libvintf_test

Bug: 36456394

Change-Id: If85aabc87c42d5afbe3b230dde8b3cbe8fbd8eb6
diff --git a/parse_xml.cpp b/parse_xml.cpp
index 7500797..64c3721 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -539,12 +539,26 @@
 };
 const SepolicyConverter sepolicyConverter{};
 
+struct HalManifestSepolicyConverter : public XmlNodeConverter<Version> {
+    std::string elementName() const override { return "sepolicy"; }
+    void mutateNode(const Version &m, NodeType *root, DocType *d) const override {
+        appendChild(root, versionConverter(m, d));
+    }
+    bool buildObject(Version *object, NodeType *root) const override {
+        return parseChild(root, versionConverter, object);
+    }
+};
+const HalManifestSepolicyConverter halManifestSepolicyConverter{};
+
 struct HalManifestConverter : public XmlNodeConverter<HalManifest> {
     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);
+        if (m.mType == SchemaType::DEVICE) {
+            appendChild(root, halManifestSepolicyConverter(m.device.mSepolicyVersion, d));
+        }
     }
     bool buildObject(HalManifest *object, NodeType *root) const override {
         Version version;
@@ -558,6 +572,14 @@
             this->mLastError = "Unrecognized manifest.version";
             return false;
         }
+        if (object->mType == SchemaType::DEVICE) {
+            // tags for device hal manifest only.
+            // TODO(b/36456394): should not allow <sepolicy> to be missing.
+            if (!parseOptionalChild(root, halManifestSepolicyConverter, {},
+                    &object->device.mSepolicyVersion)) {
+                return false;
+            }
+        }
         for (auto &&hal : hals) {
             if (!object->add(std::move(hal))) {
                 this->mLastError = "Duplicated manifest.hal entry";