From d4248d2661b335e669d089a3410f150b2668f84d Mon Sep 17 00:00:00 2001 From: Roland Winklmeier Date: Sat, 23 Apr 2016 22:51:06 +0200 Subject: [PATCH] Util methods to modify the custom library search path refs #615 --- src/blackmisc/librarypath.cpp | 46 +++++++++++++++++++++++++++ src/blackmisc/librarypath.h | 34 ++++++++++++++++++++ tests/blackmisc/testblackmiscmain.cpp | 3 ++ tests/blackmisc/testlibrarypath.cpp | 40 +++++++++++++++++++++++ tests/blackmisc/testlibrarypath.h | 43 +++++++++++++++++++++++++ 5 files changed, 166 insertions(+) create mode 100644 src/blackmisc/librarypath.cpp create mode 100644 src/blackmisc/librarypath.h create mode 100644 tests/blackmisc/testlibrarypath.cpp create mode 100644 tests/blackmisc/testlibrarypath.h diff --git a/src/blackmisc/librarypath.cpp b/src/blackmisc/librarypath.cpp new file mode 100644 index 000000000..9605c2a37 --- /dev/null +++ b/src/blackmisc/librarypath.cpp @@ -0,0 +1,46 @@ +/* Copyright (C) 2016 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "librarypath.h" +#include +#include +#include + +#ifdef Q_OS_WIN +#include +#endif + +namespace BlackMisc +{ + + void setCustomLibraryPath(const QString &path) + { + #ifdef Q_OS_WIN + std::wstring customLibraryPath = path.toStdWString(); + SetDllDirectory(customLibraryPath.data()); + #else + Q_UNUSED(path); + // do nothing. + #endif + } + + QString getCustomLibraryPath() + { + #ifdef Q_OS_WIN + const DWORD nBufferLength = GetDllDirectory(0, nullptr); + std::vector customLibraryPath(nBufferLength); + GetDllDirectory(nBufferLength, customLibraryPath.data()); + return QString::fromWCharArray(customLibraryPath.data()); + #else + // do nothing. + return {}; + #endif + } + +} // ns diff --git a/src/blackmisc/librarypath.h b/src/blackmisc/librarypath.h new file mode 100644 index 000000000..78587829b --- /dev/null +++ b/src/blackmisc/librarypath.h @@ -0,0 +1,34 @@ +/* Copyright (C) 2016 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKMISC_LIBRARYPATH_H +#define BLACKMISC_LIBRARYPATH_H + +#include "blackmiscexport.h" + +namespace BlackMisc +{ + + //! Sets the custom path to additionally search when loading libraries. + //! This does not change the default search paths. + //! \warning This is currently Windows only. Use rpath on Unix. + //! \sa getCustomLibraryPath + BLACKMISC_EXPORT void setCustomLibraryPath(const QString &path); + + //! Get the custom path to search when loading libraries. + //! Returns an empty string when no custom library path is set. + //! \note This will not return the default search path. + //! \warning This is currently Windows only. Use rpath on Unix. + BLACKMISC_EXPORT QString getCustomLibraryPath(); + +} // ns + +#endif // guard diff --git a/tests/blackmisc/testblackmiscmain.cpp b/tests/blackmisc/testblackmiscmain.cpp index 65e170752..73329e380 100644 --- a/tests/blackmisc/testblackmiscmain.cpp +++ b/tests/blackmisc/testblackmiscmain.cpp @@ -20,6 +20,7 @@ #include "testgeo.h" #include "testidentifier.h" #include "testinput.h" +#include "testlibrarypath.h" #include "testmath.h" #include "testphysicalquantities.h" #include "testvaluecache.h" @@ -47,6 +48,7 @@ namespace BlackMiscTest CTestValueCache valueCacheTests; CTestWeather weatherTests; CTestMath mathTests; + CTestLibraryPath libraryPathTests; status |= QTest::qExec(&pqBaseTests, argc, argv); status |= QTest::qExec(&avBaseTests, argc, argv); status |= QTest::qExec(&geoTests, argc, argv); @@ -57,6 +59,7 @@ namespace BlackMiscTest status |= QTest::qExec(&valueCacheTests, argc, argv); status |= QTest::qExec(&weatherTests, argc, argv); status |= QTest::qExec(&mathTests, argc, argv); + status |= QTest::qExec(&libraryPathTests, argc, argv); } return status; } diff --git a/tests/blackmisc/testlibrarypath.cpp b/tests/blackmisc/testlibrarypath.cpp new file mode 100644 index 000000000..6376d2ec4 --- /dev/null +++ b/tests/blackmisc/testlibrarypath.cpp @@ -0,0 +1,40 @@ +/* Copyright (C) 2016 + * swift Project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \cond PRIVATE_TESTS + +/*! + * \file + * \ingroup testblackmisc + */ + +#include "testlibrarypath.h" +#include "blackmisc/librarypath.h" +#include "blackmisc/buildconfig.h" + +namespace BlackMiscTest +{ + void CTestLibraryPath::libraryPath() + { + if (!BlackMisc::CBuildConfig::isRunningOnWindowsNtPlatform()) { return; } + + auto emptyPath = BlackMisc::getCustomLibraryPath(); + QVERIFY2(emptyPath.isEmpty(), "Default path should be empty"); + + QString customLibraryPath("c:\test"); + BlackMisc::setCustomLibraryPath(customLibraryPath); + QVERIFY2(BlackMisc::getCustomLibraryPath() == customLibraryPath, "setLibraryPath failed"); + + BlackMisc::setCustomLibraryPath(emptyPath); + QVERIFY2(emptyPath.isEmpty(), "Path should be empty again."); + } + +} // namespace + +//! \endcond diff --git a/tests/blackmisc/testlibrarypath.h b/tests/blackmisc/testlibrarypath.h new file mode 100644 index 000000000..b901b4a73 --- /dev/null +++ b/tests/blackmisc/testlibrarypath.h @@ -0,0 +1,43 @@ +/* Copyright (C) 2016 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#ifndef BLACKMISCTEST_TESTLIBRARYPATH_H +#define BLACKMISCTEST_TESTLIBRARYPATH_H + +//! \cond PRIVATE_TESTS + +/*! + * \file + * \ingroup testblackmisc + */ + +#include + +namespace BlackMiscTest +{ + + //! Geo classes tests + class CTestLibraryPath : public QObject + { + Q_OBJECT + + public: + //! Standard test case constructor + explicit CTestLibraryPath(QObject *parent = nullptr) : QObject(parent) {} + + private slots: + //! Basic unit tests for library path + void libraryPath(); + }; + +} // namespace + +//! \endcond + +#endif // guard