23 #include "pluginloader.h" 26 #include "configuration/doomseekerconfig.h" 27 #include "ini/inisection.h" 28 #include "ini/inivariable.h" 29 #include "plugins/engineplugin.h" 30 #include "serverapi/masterclient.h" 37 #define dlopen(a,b) LoadLibrary(a) 38 #define dlsym(a,b) GetProcAddress(a, b) 39 #define dlclose(a) FreeLibrary(a) 40 #define dlerror() GetLastError() 42 #pragma warning(disable: 4251) 50 DClass<PluginLoader::Plugin>
61 static bool isForbiddenPlugin(QString file)
63 return QFileInfo(file).fileName().toLower().contains(
"vavoom");
69 PluginLoader::Plugin::Plugin(
unsigned int type, QString file)
76 gLog << QObject::tr(
"Skipping loading of forbidden plugin: %1").arg(file);
80 d->library = dlopen(d->file.toUtf8().constData(), RTLD_NOW);
82 if(d->library != NULL)
84 unsigned int (*doomSeekerABI)() = (
unsigned int(*)()) (dlsym(d->library,
"doomSeekerABI"));
85 if(!doomSeekerABI || doomSeekerABI() != DOOMSEEKER_ABI_VERSION)
89 if (doomSeekerABI != NULL)
92 "plugin ABI version mismatch; plugin: %1, Doomseeker: %2").arg(
93 doomSeekerABI()).arg(DOOMSEEKER_ABI_VERSION);
97 reason = QObject::tr(
"plugin doesn't report its ABI version");
99 gLog << QObject::tr(
"Cannot load plugin %1, reason: %2.").arg(file, reason);
105 if(doomSeekerInit == NULL)
111 d->info = doomSeekerInit();
112 if(!info()->data()->valid)
118 gLog << QObject::tr(
"Loaded plugin: \"%1\"!").arg(info()->data()->name);
123 gLog << QObject::tr(
"Failed to open plugin: %1").arg(file);
124 gLog << QString(
"Last error was: %1").arg(dlerror());
128 PluginLoader::Plugin::~Plugin()
135 return (
void *) dlsym(d->library, func);
143 void PluginLoader::Plugin::initConfig()
147 IniSection cfgSection = gConfig.iniSectionForPlugin(
info()->data()->name);
148 info()->setConfig(cfgSection);
152 bool PluginLoader::Plugin::isValid()
const 154 return d->library != NULL;
157 void PluginLoader::Plugin::unload()
159 if (d->library != NULL)
171 QString pluginsDirectory;
172 QList<PluginLoader::Plugin*> plugins;
179 PluginLoader::PluginLoader(
unsigned int type,
const QStringList &directories)
182 foreach (
const QString &dir, directories)
184 d->pluginsDirectory = dir;
192 gLog << QObject::tr(
"Failed to locate plugins.");
196 PluginLoader::~PluginLoader()
198 qDeleteAll(d->plugins);
203 qDeleteAll(d->plugins);
209 if (staticInstance != NULL)
211 delete staticInstance;
212 staticInstance = NULL;
216 bool PluginLoader::filesInDir()
218 gLog << QString(
"Attempting to load plugins from directory: %1").arg(d->pluginsDirectory);
219 QDir dir(d->pluginsDirectory);
225 QStringList windowsNamesFilter;
226 windowsNamesFilter <<
"*.dll";
227 dir.setNameFilters(windowsNamesFilter);
229 foreach (
const QString& entry, dir.entryList(QDir::Files))
233 if (plugin->isValid())
234 d->plugins << plugin;
253 if (staticInstance != NULL)
255 qDebug() <<
"Attempting to re-init PluginLoader";
259 staticInstance =
new PluginLoader(MAKEID(
'E',
'N',
'G',
'N'), directories);
266 plugin->initConfig();
272 assert(staticInstance != NULL);
273 return staticInstance;
278 return d->plugins.size();
281 const QList<PluginLoader::Plugin*> &PluginLoader::plugins()
const 288 return d->plugins[index];
301 QString mangledName = QString(name).replace(
" ",
"");
302 for (
int i = 0; i < d->plugins.size(); ++i)
304 QString mangledCandidate = QString(d->plugins[i]->info()->data()->name).replace(
" ",
"");
305 if (mangledName.compare(mangledCandidate) == 0)
316 d->pluginsDirectory = pluginsDirectory;
323 return d->plugins[index];
static QString combinePaths(QString pathFront, QString pathEnd)
void resetPluginsDirectory(const QString &pluginsDirectory)
Resets the plugins directory, clearing the loaded plugins and getting new loaded plugins in the proce...
const Plugin * plugin(unsigned int index) const
Returns the requested plugin or NULL.
void clearPlugins()
Clears the plugins list.
int pluginIndexFromName(const QString &name) const
Looks for a plugin which name equals to parameter.
EnginePlugin * info(int pluginIndex) const
Convenience method - calls Plugin::info() for specified plugin.
static void deinit()
Destroys the init() instance.
static void init(const QStringList &directories)
Attempts to load plugins from given set of directories.
const unsigned int numPlugins() const
Gets the number of loaded plugins.
static PluginLoader * instance()
Accesses instance of the class after init().
void initConfig()
Inits configuration for plugins.
EnginePlugin * info() const
Main plugin interface.
const Plugin * operator[](unsigned int index) const
Returns the requested plugin or NULL.
INI section representation.
Plugin(unsigned int type, QString file)
Inits a plugin.
void * function(const char *func) const
Returns a pointer to the requested function or NULL.