Add <vendor-ndk> tag to fwk manifest and device matrix

... in place of the old <vndk> tag. The format of this tag is:

- in framework manifest: a string (a number, or VERSION_CODE during
development):
<vendor-ndk>
    <version>27</version>
</vendor-ndk>
<vendor-ndk>
    <version>P</version>
</vendor-ndk>

- in device matrix: same format, but only one <vendor-ndk> tag.
<vendor-ndk>
    <version>27</version>
</vendor-ndk>

Test: libvintf_test
Bug: 36400653
Change-Id: If235e257026d719838076bf0e0a2b42aa8524971
diff --git a/parse_xml.cpp b/parse_xml.cpp
index 3e16b80..9a09eae 100644
--- a/parse_xml.cpp
+++ b/parse_xml.cpp
@@ -698,6 +698,8 @@
 
 [[deprecated]]
 const XmlTextConverter<VndkVersionRange> vndkVersionRangeConverter{"version"};
+
+const XmlTextConverter<std::string> vndkVersionConverter{"version"};
 const XmlTextConverter<std::string> vndkLibraryConverter{"library"};
 
 struct [[deprecated]] VndkConverter : public XmlNodeConverter<Vndk> {
@@ -718,6 +720,23 @@
 [[deprecated]]
 const VndkConverter vndkConverter{};
 
+struct VendorNdkConverter : public XmlNodeConverter<VendorNdk> {
+    std::string elementName() const override { return "vendor-ndk"; }
+    void mutateNode(const VendorNdk& object, NodeType* root, DocType* d) const override {
+        appendChild(root, vndkVersionConverter(object.mVersion, d));
+        appendChildren(root, vndkLibraryConverter, object.mLibraries, d);
+    }
+    bool buildObject(VendorNdk* object, NodeType* root) const override {
+        if (!parseChild(root, vndkVersionConverter, &object->mVersion) ||
+            !parseChildren(root, vndkLibraryConverter, &object->mLibraries)) {
+            return false;
+        }
+        return true;
+    }
+};
+
+const VendorNdkConverter vendorNdkConverter{};
+
 struct HalManifestSepolicyConverter : public XmlNodeConverter<Version> {
     std::string elementName() const override { return "sepolicy"; }
     void mutateNode(const Version &m, NodeType *root, DocType *d) const override {
@@ -775,6 +794,8 @@
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
                 appendChildren(root, vndkConverter, m.framework.mVndks, d);
 #pragma clang diagnostic pop
+
+                appendChildren(root, vendorNdkConverter, m.framework.mVendorNdks, d);
             }
         }
 
@@ -817,6 +838,10 @@
                 }
             }
 #pragma clang diagnostic pop
+
+            if (!parseChildren(root, vendorNdkConverter, &object->framework.mVendorNdks)) {
+                return false;
+            }
         }
         for (auto &&hal : hals) {
             std::string description{hal.name};
@@ -915,6 +940,10 @@
                     appendChild(root, vndkConverter(m.device.mVndk, d));
                 }
 #pragma clang diagnostic pop
+
+                if (!(m.device.mVendorNdk == VendorNdk{})) {
+                    appendChild(root, vendorNdkConverter(m.device.mVendorNdk, d));
+                }
             }
         }
 
@@ -963,6 +992,10 @@
                 return false;
             }
 #pragma clang diagnostic pop
+
+            if (!parseOptionalChild(root, vendorNdkConverter, {}, &object->device.mVendorNdk)) {
+                return false;
+            }
         }
 
         if (!kMetaVersion.minorAtLeast(version)) {