diff --git a/drm/1.2/vts/functional/Android.bp b/drm/1.2/vts/functional/Android.bp index 83ea104579..ecc7d6c592 100644 --- a/drm/1.2/vts/functional/Android.bp +++ b/drm/1.2/vts/functional/Android.bp @@ -14,27 +14,61 @@ // limitations under the License. // -cc_test { - name: "VtsHalDrmV1_2TargetTest", +cc_library_static { + name: "android.hardware.drm@1.2-vts", defaults: ["VtsHalTargetTestDefaults"], - include_dirs: ["hardware/interfaces/drm/1.0/vts/functional"], + local_include_dirs: [ + "include", + ], srcs: [ "drm_hal_clearkey_module.cpp", "drm_hal_common.cpp", "drm_hal_test.cpp", - "vendor_modules.cpp", ], - static_libs: [ + shared_libs: [ "android.hardware.drm@1.0", "android.hardware.drm@1.1", "android.hardware.drm@1.2", - "android.hardware.drm@1.0-helper", "android.hidl.allocator@1.0", "android.hidl.memory@1.0", "libhidlmemory", "libnativehelper", - "libssl", + ], + static_libs: [ + "android.hardware.drm@1.0-helper", "libcrypto_static", + "libdrmvtshelper", + ], + export_shared_lib_headers: [ + "android.hardware.drm@1.2", + ], + export_static_lib_headers: [ + "android.hardware.drm@1.0-helper", + ], + export_include_dirs: [ + "include", + ], +} + +cc_test { + name: "VtsHalDrmV1_2TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: [ + "drm_hal_test_main.cpp", + ], + whole_static_libs: [ + "android.hardware.drm@1.2-vts", + ], + shared_libs: [ + "android.hardware.drm@1.0", + "android.hardware.drm@1.2", + "android.hidl.allocator@1.0", + "libhidlmemory", + ], + static_libs: [ + "android.hardware.drm@1.0-helper", + "libcrypto_static", + "libdrmvtshelper", ], test_suites: [ "general-tests", diff --git a/drm/1.2/vts/functional/drm_hal_common.cpp b/drm/1.2/vts/functional/drm_hal_common.cpp index 8a68608933..d5e453c778 100644 --- a/drm/1.2/vts/functional/drm_hal_common.cpp +++ b/drm/1.2/vts/functional/drm_hal_common.cpp @@ -26,7 +26,7 @@ #include #include "drm_hal_clearkey_module.h" -#include "drm_hal_common.h" +#include "android/hardware/drm/1.2/vts/drm_hal_common.h" using ::android::hardware::drm::V1_0::BufferType; using ::android::hardware::drm::V1_0::DestinationBuffer; @@ -94,7 +94,7 @@ static DrmHalVTSVendorModule_V1* getModuleForInstance(const std::string& instanc * DrmHalTest */ -DrmHalTest::DrmHalTest() : vendorModule(getModuleForInstance(GetParam())) {} +DrmHalTest::DrmHalTest() : vendorModule(getModuleForInstance(GetParamService())) {} void DrmHalTest::SetUp() { const ::testing::TestInfo* const test_info = @@ -102,9 +102,9 @@ void DrmHalTest::SetUp() { ALOGD("Running test %s.%s from (vendor) module %s", test_info->test_case_name(), test_info->name(), - GetParam().c_str()); + GetParamService().c_str()); - const string instance = GetParam(); + const string instance = GetParamService(); drmFactory = IDrmFactory::getService(instance); ASSERT_NE(drmFactory, nullptr); @@ -124,8 +124,12 @@ void DrmHalTest::SetUp() { contentConfigurations = vendorModule->getContentConfigurations(); // If drm scheme not installed skip subsequent tests - if (!drmFactory->isCryptoSchemeSupported(getVendorUUID())) { - GTEST_SKIP() << "vendor module drm scheme not supported"; + if (!drmFactory->isCryptoSchemeSupported(getUUID())) { + if (GetParamUUID() == hidl_array()) { + GTEST_SKIP() << "vendor module drm scheme not supported"; + } else { + FAIL() << "param scheme must be supported: " << android::hardware::toString(GetParamUUID()); + } } ASSERT_NE(nullptr, drmPlugin.get()) << "Can't find " << vendorModule->getServiceName() << " drm@1.2 plugin"; @@ -140,7 +144,7 @@ sp DrmHalTest::createDrmPlugin() { sp plugin = nullptr; hidl_string packageName("android.hardware.drm.test"); auto res = - drmFactory->createPlugin(getVendorUUID(), packageName, + drmFactory->createPlugin(getUUID(), packageName, [&](StatusV1_0 status, const sp& pluginV1_0) { EXPECT_EQ(StatusV1_0::OK == status, pluginV1_0 != nullptr); plugin = IDrmPlugin::castFrom(pluginV1_0); @@ -159,7 +163,7 @@ sp DrmHalTest::createCryptoPlugin() { sp plugin = nullptr; hidl_vec initVec; auto res = cryptoFactory->createPlugin( - getVendorUUID(), initVec, + getUUID(), initVec, [&](StatusV1_0 status, const sp& pluginV1_0) { EXPECT_EQ(StatusV1_0::OK == status, pluginV1_0 != nullptr); plugin = ICryptoPlugin::castFrom(pluginV1_0); @@ -170,6 +174,13 @@ sp DrmHalTest::createCryptoPlugin() { return plugin; } +hidl_array DrmHalTest::getUUID() { + if (GetParamUUID() == hidl_array()) { + return getVendorUUID(); + } + return GetParamUUID(); +} + hidl_array DrmHalTest::getVendorUUID() { if (vendorModule == nullptr) return {}; vector uuid = vendorModule->getUUID(); @@ -509,7 +520,7 @@ void DrmHalTest::aes_cbc_decrypt(uint8_t* dest, uint8_t* src, /** * Helper method to test decryption with invalid keys is returned */ -void DrmHalClearkeyTest::decryptWithInvalidKeys( +void DrmHalClearkeyTestV1_2::decryptWithInvalidKeys( hidl_vec& invalidResponse, vector& iv, const Pattern& noPattern, diff --git a/drm/1.2/vts/functional/drm_hal_test.cpp b/drm/1.2/vts/functional/drm_hal_test.cpp index 71296dce95..0dfff26528 100644 --- a/drm/1.2/vts/functional/drm_hal_test.cpp +++ b/drm/1.2/vts/functional/drm_hal_test.cpp @@ -17,13 +17,13 @@ #define LOG_TAG "drm_hal_test@1.2" #include -#include #include #include #include #include +#include -#include "drm_hal_common.h" +#include "android/hardware/drm/1.2/vts/drm_hal_common.h" using ::android::hardware::drm::V1_0::Status; using ::android::hardware::drm::V1_1::KeyRequestType; @@ -34,12 +34,13 @@ using ::android::hardware::drm::V1_2::KeyStatus; using ::android::hardware::drm::V1_2::KeyStatusType; using ::android::hardware::drm::V1_2::OfflineLicenseState; -using ::android::hardware::drm::V1_2::vts::DrmHalClearkeyTest; +using ::android::hardware::drm::V1_2::vts::DrmHalClearkeyTestV1_2; using ::android::hardware::drm::V1_2::vts::DrmHalPluginListener; using ::android::hardware::drm::V1_2::vts::DrmHalTest; using ::android::hardware::drm::V1_2::vts::kCallbackLostState; using ::android::hardware::drm::V1_2::vts::kCallbackKeysChange; +using ::android::hardware::hidl_array; using ::android::hardware::hidl_string; static const char* const kVideoMp4 = "video/mp4"; @@ -54,7 +55,7 @@ static const SecurityLevel kHwSecureAll = SecurityLevel::HW_SECURE_ALL; * Ensure drm factory supports module UUID Scheme */ TEST_P(DrmHalTest, VendorUuidSupported) { - auto res = drmFactory->isCryptoSchemeSupported_1_2(getVendorUUID(), kVideoMp4, kSwSecureCrypto); + auto res = drmFactory->isCryptoSchemeSupported_1_2(getUUID(), kVideoMp4, kSwSecureCrypto); ALOGI("kVideoMp4 = %s res %d", kVideoMp4, (bool)res); EXPECT_TRUE(res); } @@ -82,7 +83,7 @@ TEST_P(DrmHalTest, EmptyPluginUUIDNotSupported) { * Ensure drm factory doesn't support an invalid mime type */ TEST_P(DrmHalTest, BadMimeNotSupported) { - EXPECT_FALSE(drmFactory->isCryptoSchemeSupported_1_2(getVendorUUID(), kBadMime, kSwSecureCrypto)); + EXPECT_FALSE(drmFactory->isCryptoSchemeSupported_1_2(getUUID(), kBadMime, kSwSecureCrypto)); } /** @@ -398,14 +399,14 @@ TEST_P(DrmHalTest, EncryptedAesCtrSegmentTestNoKeys) { /** * Ensure clearkey drm factory doesn't support security level higher than supported */ -TEST_P(DrmHalClearkeyTest, BadLevelNotSupported) { - EXPECT_FALSE(drmFactory->isCryptoSchemeSupported_1_2(getVendorUUID(), kVideoMp4, kHwSecureAll)); +TEST_P(DrmHalClearkeyTestV1_2, BadLevelNotSupported) { + EXPECT_FALSE(drmFactory->isCryptoSchemeSupported_1_2(getUUID(), kVideoMp4, kHwSecureAll)); } /** * Test resource contention during attempt to generate key request */ -TEST_P(DrmHalClearkeyTest, GetKeyRequestResourceContention) { +TEST_P(DrmHalClearkeyTestV1_2, GetKeyRequestResourceContention) { Status status = drmPlugin->setPropertyString(kDrmErrorTestKey, kDrmErrorResourceContention); EXPECT_EQ(Status::OK, status); auto sessionId = openSession(); @@ -426,7 +427,7 @@ TEST_P(DrmHalClearkeyTest, GetKeyRequestResourceContention) { /** * Test clearkey plugin offline key with mock error */ -TEST_P(DrmHalClearkeyTest, OfflineLicenseInvalidState) { +TEST_P(DrmHalClearkeyTestV1_2, OfflineLicenseInvalidState) { auto sessionId = openSession(); hidl_vec keySetId = loadKeys(sessionId, KeyType::OFFLINE); Status status = drmPlugin->setPropertyString(kDrmErrorTestKey, kDrmErrorInvalidState); @@ -447,7 +448,7 @@ TEST_P(DrmHalClearkeyTest, OfflineLicenseInvalidState) { /** * Test SessionLostState is triggered on error */ -TEST_P(DrmHalClearkeyTest, SessionLostState) { +TEST_P(DrmHalClearkeyTestV1_2, SessionLostState) { sp listener = new DrmHalPluginListener(); auto res = drmPlugin->setListener(listener); EXPECT_OK(res); @@ -467,7 +468,7 @@ TEST_P(DrmHalClearkeyTest, SessionLostState) { /** * Negative decrypt test. Decrypt with invalid key. */ -TEST_P(DrmHalClearkeyTest, DecryptWithEmptyKey) { +TEST_P(DrmHalClearkeyTestV1_2, DecryptWithEmptyKey) { vector iv(AES_BLOCK_SIZE, 0); const Pattern noPattern = {0, 0}; const uint32_t kClearBytes = 512; @@ -504,7 +505,7 @@ TEST_P(DrmHalClearkeyTest, DecryptWithEmptyKey) { /** * Negative decrypt test. Decrypt with a key exceeds AES_BLOCK_SIZE. */ -TEST_P(DrmHalClearkeyTest, DecryptWithKeyTooLong) { +TEST_P(DrmHalClearkeyTestV1_2, DecryptWithKeyTooLong) { vector iv(AES_BLOCK_SIZE, 0); const Pattern noPattern = {0, 0}; const uint32_t kClearBytes = 512; @@ -531,43 +532,3 @@ TEST_P(DrmHalClearkeyTest, DecryptWithKeyTooLong) { memcpy(invalidResponse.data(), keyTooLongResponse.c_str(), kKeyTooLongResponseSize); decryptWithInvalidKeys(invalidResponse, iv, noPattern, subSamples); } - -/** - * Instantiate the set of test cases for each vendor module - */ - -static const std::set kAllInstances = [] { - using ::android::hardware::drm::V1_2::ICryptoFactory; - using ::android::hardware::drm::V1_2::IDrmFactory; - - std::vector drmInstances = - android::hardware::getAllHalInstanceNames(IDrmFactory::descriptor); - std::vector cryptoInstances = - android::hardware::getAllHalInstanceNames(ICryptoFactory::descriptor); - std::set allInstances; - allInstances.insert(drmInstances.begin(), drmInstances.end()); - allInstances.insert(cryptoInstances.begin(), cryptoInstances.end()); - return allInstances; -}(); - -INSTANTIATE_TEST_SUITE_P(PerInstance, DrmHalTest, testing::ValuesIn(kAllInstances), - android::hardware::PrintInstanceNameToString); -INSTANTIATE_TEST_SUITE_P(PerInstance, DrmHalClearkeyTest, testing::ValuesIn(kAllInstances), - android::hardware::PrintInstanceNameToString); - -int main(int argc, char** argv) { -#if defined(__LP64__) - const char* kModulePath = "/data/local/tmp/64/lib"; -#else - const char* kModulePath = "/data/local/tmp/32/lib"; -#endif - DrmHalTest::gVendorModules = new drm_vts::VendorModules(kModulePath); - if (DrmHalTest::gVendorModules->getPathList().size() == 0) { - std::cerr << "WARNING: No vendor modules found in " << kModulePath << - ", all vendor tests will be skipped" << std::endl; - } - ::testing::InitGoogleTest(&argc, argv); - int status = RUN_ALL_TESTS(); - ALOGI("Test result = %d", status); - return status; -} diff --git a/drm/1.2/vts/functional/drm_hal_test_main.cpp b/drm/1.2/vts/functional/drm_hal_test_main.cpp new file mode 100644 index 0000000000..ea6e63df6e --- /dev/null +++ b/drm/1.2/vts/functional/drm_hal_test_main.cpp @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Instantiate the set of test cases for each vendor module + */ + +#define LOG_TAG "drm_hal_test@1.2" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "android/hardware/drm/1.2/vts/drm_hal_common.h" + +using android::hardware::drm::V1_2::vts::DrmHalTest; +using android::hardware::drm::V1_2::vts::DrmHalClearkeyTestV1_2; +using drm_vts::DrmHalTestParam; +using drm_vts::PrintParamInstanceToString; + +static const std::vector kAllInstances = [] { + using ::android::hardware::drm::V1_2::ICryptoFactory; + using ::android::hardware::drm::V1_2::IDrmFactory; + + std::vector drmInstances = + android::hardware::getAllHalInstanceNames(IDrmFactory::descriptor); + std::vector cryptoInstances = + android::hardware::getAllHalInstanceNames(ICryptoFactory::descriptor); + std::set allInstances; + allInstances.insert(drmInstances.begin(), drmInstances.end()); + allInstances.insert(cryptoInstances.begin(), cryptoInstances.end()); + + std::vector allInstanceUuidCombos; + auto noUUID = [](std::string s) { return DrmHalTestParam(s); }; + std::transform(allInstances.begin(), allInstances.end(), + std::back_inserter(allInstanceUuidCombos), noUUID); + return allInstanceUuidCombos; +}(); + +INSTANTIATE_TEST_SUITE_P(PerInstance, DrmHalTest, testing::ValuesIn(kAllInstances), + PrintParamInstanceToString); +INSTANTIATE_TEST_SUITE_P(PerInstance, DrmHalClearkeyTestV1_2, testing::ValuesIn(kAllInstances), + PrintParamInstanceToString); + +int main(int argc, char** argv) { +#if defined(__LP64__) + const char* kModulePath = "/data/local/tmp/64/lib"; +#else + const char* kModulePath = "/data/local/tmp/32/lib"; +#endif + DrmHalTest::gVendorModules = new drm_vts::VendorModules(kModulePath); + if (DrmHalTest::gVendorModules->getPathList().size() == 0) { + std::cerr << "WARNING: No vendor modules found in " << kModulePath << + ", all vendor tests will be skipped" << std::endl; + } + ::testing::InitGoogleTest(&argc, argv); + int status = RUN_ALL_TESTS(); + ALOGI("Test result = %d", status); + return status; +} diff --git a/drm/1.2/vts/functional/drm_hal_common.h b/drm/1.2/vts/functional/include/android/hardware/drm/1.2/vts/drm_hal_common.h similarity index 92% rename from drm/1.2/vts/functional/drm_hal_common.h rename to drm/1.2/vts/functional/include/android/hardware/drm/1.2/vts/drm_hal_common.h index 6b71aa4b01..6fee6f4631 100644 --- a/drm/1.2/vts/functional/drm_hal_common.h +++ b/drm/1.2/vts/functional/include/android/hardware/drm/1.2/vts/drm_hal_common.h @@ -23,14 +23,19 @@ #include #include #include +#include +#include #include +# include #include #include #include +#include #include #include "drm_hal_vendor_module_api.h" +#include "drm_vts_helper.h" #include "vendor_modules.h" #include "VtsHalHidlTargetCallbackBase.h" @@ -41,13 +46,10 @@ using ::android::hardware::drm::V1_0::Mode; using ::android::hardware::drm::V1_0::Pattern; using ::android::hardware::drm::V1_0::SessionId; using ::android::hardware::drm::V1_0::SubSample; +using ::android::hardware::drm::V1_1::SecurityLevel; using KeyStatusV1_0 = ::android::hardware::drm::V1_0::KeyStatus; using StatusV1_0 = ::android::hardware::drm::V1_0::Status; - -using ::android::hardware::drm::V1_1::ICryptoFactory; -using ::android::hardware::drm::V1_1::SecurityLevel; - using StatusV1_2 = ::android::hardware::drm::V1_2::Status; using ::android::hardware::hidl_array; @@ -58,7 +60,11 @@ using ::android::hardware::Void; using ::android::hidl::memory::V1_0::IMemory; using ::android::sp; +using drm_vts::DrmHalTestParam; + +using std::array; using std::map; +using std::pair; using std::string; using std::unique_ptr; using std::vector; @@ -71,7 +77,7 @@ namespace drm { namespace V1_2 { namespace vts { -class DrmHalTest : public ::testing::TestWithParam { +class DrmHalTest : public ::testing::TestWithParam { public: static drm_vts::VendorModules* gVendorModules; DrmHalTest(); @@ -79,7 +85,10 @@ class DrmHalTest : public ::testing::TestWithParam { virtual void TearDown() override {} protected: + hidl_array getUUID(); hidl_array getVendorUUID(); + hidl_array GetParamUUID() { return GetParam().scheme_; } + string GetParamService() { return GetParam().instance_; } void provision(); SessionId openSession(SecurityLevel level, StatusV1_0* err); SessionId openSession(); @@ -124,7 +133,7 @@ class DrmHalTest : public ::testing::TestWithParam { }; -class DrmHalClearkeyTest : public DrmHalTest { +class DrmHalClearkeyTestV1_2 : public DrmHalTest { public: virtual void SetUp() override { DrmHalTest::SetUp(); @@ -132,7 +141,7 @@ class DrmHalClearkeyTest : public DrmHalTest { 0xE2, 0x71, 0x9D, 0x58, 0xA9, 0x85, 0xB3, 0xC9, 0x78, 0x1A, 0xB0, 0x30, 0xAF, 0x78, 0xD3, 0x0E}; if (!drmFactory->isCryptoSchemeSupported(kClearKeyUUID)) { - GTEST_SKIP() << "ClearKey not supported by " << GetParam(); + GTEST_SKIP() << "ClearKey not supported by " << GetParamService(); } } virtual void TearDown() override {} diff --git a/drm/1.2/vts/functional/vendor_modules.cpp b/drm/1.2/vts/functional/vendor_modules.cpp deleted file mode 100644 index 08131cfd35..0000000000 --- a/drm/1.2/vts/functional/vendor_modules.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define LOG_TAG "drm-vts-vendor-modules" - -#include -#include -#include -#include -#include -#include - -#include "drm_hal_vendor_module_api.h" -#include "vendor_modules.h" - -using std::string; -using std::vector; -using std::unique_ptr; -using ::android::String8; -using ::android::hardware::drm::V1_0::helper::SharedLibrary; - -namespace drm_vts { -void VendorModules::scanModules(const std::string &directory) { - DIR* dir = opendir(directory.c_str()); - if (dir == NULL) { - ALOGE("Unable to open drm VTS vendor directory %s", directory.c_str()); - } else { - struct dirent* entry; - while ((entry = readdir(dir))) { - ALOGD("checking file %s", entry->d_name); - string fullpath = directory + "/" + entry->d_name; - if (endsWith(fullpath, ".so")) { - mPathList.push_back(fullpath); - } - } - closedir(dir); - } -} - -DrmHalVTSVendorModule* VendorModules::getModule(const string& path) { - if (mOpenLibraries.find(path) == mOpenLibraries.end()) { - auto library = std::make_unique(String8(path.c_str())); - if (!library) { - ALOGE("failed to map shared library %s", path.c_str()); - return NULL; - } - mOpenLibraries[path] = std::move(library); - } - const unique_ptr& library = mOpenLibraries[path]; - void* symbol = library->lookup("vendorModuleFactory"); - if (symbol == NULL) { - ALOGE("getVendorModule failed to lookup 'vendorModuleFactory' in %s: " - "%s", path.c_str(), library->lastError()); - return NULL; - } - typedef DrmHalVTSVendorModule* (*ModuleFactory)(); - ModuleFactory moduleFactory = reinterpret_cast(symbol); - return (*moduleFactory)(); -} - -DrmHalVTSVendorModule* VendorModules::getModuleByName(const string& name) { - for (const auto &path : mPathList) { - auto module = getModule(path); - if (module->getServiceName() == name) { - return module; - } - } - return NULL; -} -}; diff --git a/drm/1.2/vts/functional/vendor_modules.h b/drm/1.2/vts/functional/vendor_modules.h deleted file mode 100644 index eacd2d1899..0000000000 --- a/drm/1.2/vts/functional/vendor_modules.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef VENDOR_MODULES_H -#define VENDOR_MODULES_H - -#include -#include -#include - -#include - -using ::android::hardware::drm::V1_0::helper::SharedLibrary; - -class DrmHalVTSVendorModule; - -namespace drm_vts { -class VendorModules { - public: - /** - * Initialize with a file system path where the shared libraries - * are to be found. - */ - explicit VendorModules(const std::string& dir) { - scanModules(dir); - } - ~VendorModules() {} - - /** - * Retrieve a DrmHalVTSVendorModule given its full path. The - * getAPIVersion method can be used to determine the versioned - * subclass type. - */ - DrmHalVTSVendorModule* getModule(const std::string& path); - - /** - * Retrieve a DrmHalVTSVendorModule given a service name. - */ - DrmHalVTSVendorModule* getModuleByName(const std::string& name); - - /** - * Return the list of paths to available vendor modules. - */ - std::vector getPathList() const {return mPathList;} - - private: - std::vector mPathList; - std::map> mOpenLibraries; - - /** - * Scan the list of paths to available vendor modules. - */ - void scanModules(const std::string& dir); - - inline bool endsWith(const std::string& str, const std::string& suffix) const { - if (suffix.size() > str.size()) return false; - return std::equal(suffix.rbegin(), suffix.rend(), str.rbegin()); - } - - VendorModules(const VendorModules&) = delete; - void operator=(const VendorModules&) = delete; -}; -}; - -#endif // VENDOR_MODULES_H