Add getXmlFilePath for manifest / matrix.

Return <path> or if it doesn't exist,
/{system,vendor}/etc/<name>_V<major>_<minor>.<format>

Test: libvintf_test
Test: vintf_object_test

Bug: 38359330

Change-Id: I80eff960a5dea91521e99e628e1af7cf52dad195
diff --git a/CompatibilityMatrix.cpp b/CompatibilityMatrix.cpp
index 907ac8c..509ca1d 100644
--- a/CompatibilityMatrix.cpp
+++ b/CompatibilityMatrix.cpp
@@ -16,6 +16,7 @@
 
 #include "CompatibilityMatrix.h"
 
+#include "parse_string.h"
 #include "utils.h"
 
 namespace android {
@@ -57,6 +58,25 @@
     return details::fetchAllInformation(path, gCompatibilityMatrixConverter, this);
 }
 
+std::string CompatibilityMatrix::getXmlSchemaPath(const std::string& xmlFileName,
+                                                  const Version& version) const {
+    using std::literals::string_literals::operator""s;
+    auto range = getXmlFiles(xmlFileName);
+    for (auto it = range.first; it != range.second; ++it) {
+        const MatrixXmlFile& matrixXmlFile = it->second;
+        if (matrixXmlFile.versionRange().contains(version)) {
+            if (!matrixXmlFile.overriddenPath().empty()) {
+                return matrixXmlFile.overriddenPath();
+            }
+            return "/"s + (type() == SchemaType::DEVICE ? "vendor" : "system") + "/etc/" +
+                   xmlFileName + "_V" + std::to_string(matrixXmlFile.versionRange().majorVer) +
+                   "_" + std::to_string(matrixXmlFile.versionRange().maxMinor) + "." +
+                   to_string(matrixXmlFile.format());
+        }
+    }
+    return "";
+}
+
 bool operator==(const CompatibilityMatrix &lft, const CompatibilityMatrix &rgt) {
     return lft.mType == rgt.mType && lft.mHals == rgt.mHals && lft.mXmlFiles == rgt.mXmlFiles &&
            (lft.mType != SchemaType::DEVICE || (lft.device.mVndk == rgt.device.mVndk)) &&