/* Grim's Cave Copyright (c) 2010, Matthias -apoc- Hecker This program 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, either version 3 of the License, or (at your option) any later version. 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 . */ #ifndef TLIBRARYLOADER_HPP #define TLIBRARYLOADER_HPP #include #ifdef _WIN32 #include #define Sys_LoadLibrary(f) (void*)LoadLibrary(f) #define Sys_UnloadLibrary(h) FreeLibrary((HMODULE)h) #define Sys_LoadProcedure(h,fn) (void*)GetProcAddress((HMODULE)h,fn) #define Sys_LibraryError() "unknown" #else // if you know what other engine defines #include // it this way, you win a great prize -.- #define Sys_LoadLibrary(f) dlopen(f,RTLD_NOW) #define Sys_UnloadLibrary(h) dlclose(h) #define Sys_LoadProcedure(h,fn) dlsym(h,fn) #define Sys_LibraryError() dlerror() #endif #include "common/Global.hpp" #include "common/TSingleton.hpp" namespace grims { namespace dlib { template class TLibraryLoader : public TSingleton { public: TLibraryLoader() : m_loaded(false), m_error(false), m_symbols(NULL), m_handle(NULL) { } TLibraryLoader(const TLibraryLoader& orig) { } virtual ~TLibraryLoader() { Uninitialize(); } // Initialize() void Uninitialize() { UnloadLibrary(); } TypeSymbolStruct* GetSymbols() { return m_symbols; } bool IsLoaded() { return m_loaded; } protected: bool m_loaded; bool m_error; TypeSymbolStruct* m_symbols; bool LoadLibraryFile(std::string filename) { if (filename == "") { LOGGER.Error("[TLibraryLoader] error loading shared library, no filename given"); m_error = true; return false; } LOGGER.Info("[TLibraryLoader] loading shared library " + filename); if (m_handle) { LOGGER.Warn("[TLibraryLoader] library already loaded"); return true; } m_filename = filename; m_handle = Sys_LoadLibrary(filename.c_str()); if (m_handle == NULL) { LOGGER.ErrorFormat( "[TLibraryLoader] error loading shared library: %s", Sys_LibraryError() ); m_error = true; return false; } m_symbols = new TypeSymbolStruct; return true; } void UnloadLibrary() { LOGGER.Info("[TLibraryLoader] unloading shared library " + m_filename); if (!m_handle) { LOGGER.Error("[TLibraryLoader] library handle not found"); return; } SAFE_DESTROY(m_symbols); Sys_UnloadLibrary(m_handle); m_handle = NULL; } void* LoadProcedure(const char* symbolName) { void *symbol = NULL; symbol = Sys_LoadProcedure(m_handle, symbolName); if (symbol == NULL) { m_error = true; LOGGER.ErrorFormat( "[TLibraryLoader] couldn't load library procedure symbol: %s (%s)", symbolName, Sys_LibraryError() ); } return symbol; } private: void* m_handle; std::string m_filename; }; } // end namespace dlib } // end namespace grims #endif /* TLIBRARYLOADER_HPP */