Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/distrho/extra/LibraryUtils.hpp @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DPF-Prymula-audioplugins/dpf/distrho/extra/LibraryUtils.hpp Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,136 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com> + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_LIBRARY_UTILS_HPP_INCLUDED +#define DISTRHO_LIBRARY_UTILS_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +#ifdef DISTRHO_OS_WINDOWS +# ifndef NOMINMAX +# define NOMINMAX +# endif +# include <winsock2.h> +# include <windows.h> +typedef HMODULE lib_t; +#else +# include <dlfcn.h> +typedef void* lib_t; +#endif + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------- +// library related calls + +/* + * Open 'filename' library (must not be null). + * May return null, in which case "lib_error" has the error. + */ +static inline +lib_t lib_open(const char* const filename) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', nullptr); + + try { +#ifdef DISTRHO_OS_WINDOWS + return ::LoadLibraryA(filename); +#else + return ::dlopen(filename, RTLD_NOW|RTLD_LOCAL); +#endif + } DISTRHO_SAFE_EXCEPTION_RETURN("lib_open", nullptr); +} + +/* + * Close a previously opened library (must not be null). + * If false is returned, "lib_error" has the error. + */ +static inline +bool lib_close(const lib_t lib) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(lib != nullptr, false); + + try { +#ifdef DISTRHO_OS_WINDOWS + return ::FreeLibrary(lib); +#else + return (::dlclose(lib) == 0); +#endif + } DISTRHO_SAFE_EXCEPTION_RETURN("lib_close", false); +} + +/* + * Get a library symbol (must not be null). + * Returns null if the symbol is not found. + */ +template<typename Func> +static inline +Func lib_symbol(const lib_t lib, const char* const symbol) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(lib != nullptr, nullptr); + DISTRHO_SAFE_ASSERT_RETURN(symbol != nullptr && symbol[0] != '\0', nullptr); + + try { +#ifdef DISTRHO_OS_WINDOWS +# if defined(__GNUC__) && (__GNUC__ >= 9) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wcast-function-type" +# endif + return (Func)::GetProcAddress(lib, symbol); +# if defined(__GNUC__) && (__GNUC__ >= 9) +# pragma GCC diagnostic pop +# endif +#else + return (Func)(uintptr_t)::dlsym(lib, symbol); +#endif + } DISTRHO_SAFE_EXCEPTION_RETURN("lib_symbol", nullptr); +} + +/* + * Return the last operation error ('filename' must not be null). + * May return null. + */ +static inline +const char* lib_error(const char* const filename) noexcept +{ + DISTRHO_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', nullptr); + +#ifdef DISTRHO_OS_WINDOWS + static char libError[2048+1]; + std::memset(libError, 0, sizeof(libError)); + + try { + const DWORD winErrorCode = ::GetLastError(); + const int winErrorFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS; + LPVOID winErrorString; + + ::FormatMessage(winErrorFlags, nullptr, winErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&winErrorString, 0, nullptr); + + std::snprintf(libError, 2048, "%s: error code %li: %s", filename, winErrorCode, (const char*)winErrorString); + ::LocalFree(winErrorString); + } DISTRHO_SAFE_EXCEPTION("lib_error"); + + return (libError[0] != '\0') ? libError : nullptr; +#else + return ::dlerror(); +#endif +} + +// ----------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_LIBRARY_UTILS_HPP_INCLUDED