/* * InspIRCd -- Internet Relay Chat Daemon * * Copyright (C) 2013, 2019-2020 Sadie Powell * Copyright (C) 2012 Robby * Copyright (C) 2012 ChrisTX * Copyright (C) 2009-2010 Daniel De Graaf * Copyright (C) 2007 Oliver Lupton * Copyright (C) 2007 Dennis Friis * Copyright (C) 2006 Craig Edwards * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation, version 2. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once /** The DLLManager class is able to load a module file by filename, * and locate its init_module symbol. */ class CoreExport DLLManager : public classbase { private: /** The last error string. */ std::string err; /** The module library handle. */ #ifdef _WIN32 HMODULE lib; #else void* lib; #endif /** The filename of the module library. */ const std::string libname; /** Sets the last error string. */ void RetrieveLastError(); public: /** Attempts to load the specified module. * @param name The name of the library to load. */ DLLManager(const std::string& name); /** Unloads the module if one was loaded. */ ~DLLManager(); /** Attempts to create a new module instance from this shared library. * @return Either a new instance of the Module class or NULL on error. */ Module* CallInit(); /** Retrieves the value of the specified symbol. * @param name The name of the symbol to retrieve. * @return Either the value of the specified symbol or or NULL if it does not exist. */ void* GetSymbol(const char* name) const; /** Retrieves the value of the specified symbol and casts it to the requested type. * @param name The name of the symbol to retrieve. * @return Either the value of the specified symbol or or NULL if it does not exist. */ template TReturn* GetSymbol(const char* name) const { return static_cast(GetSymbol(name)); } /** Retrieves the module version from the dynamic library. */ const char* GetVersion() const { return GetSymbol(MODULE_STR_VERSION); } /** Retrieves the last error which occurred or an empty string if no errors have occurred. */ const std::string& LastError() const { return err; } /** Retrieves the filename of the underlying shared library. */ const std::string& LibraryName() const { return libname; } };