18#include "PluginLoader.h"
19#include <QCoreApplication>
20#include <QGuiApplication>
21#include <QPluginLoader>
24#include <QDirIterator>
27#include <QStringBuilder>
29Q_LOGGING_CATEGORY(PLUGIN_LOADER,
"dekko.plugman.loader")
34 m_pluginPaths << qApp->applicationDirPath() %
"/plugins";
37PluginLoader::~PluginLoader()
39 qDeleteAll(m_translators);
40 m_translators.clear();
43void PluginLoader::loadPlugins(QMultiMap<QString, PluginInfo *> ®istry,
const QString &pluginType)
46 qCDebug(PLUGIN_LOADER) <<
"Loading plugins....";
48 dirs << qApp->applicationDirPath() %
"/plugins";
49 dirs << m_pluginPaths;
50 QString pluginEnv = QString(qgetenv(
"DEKKO_PLUGINS"));
51 if (!pluginEnv.isEmpty()) {
56 QStringList pluginPaths;
58 qCDebug(PLUGIN_LOADER) <<
"Looking for library plugins";
59 Q_FOREACH(
const QString &directory, dirs) {
61 Q_FOREACH(
const QString &file, dir.entryList()) {
62 const QString abs = QFileInfo(dir.absoluteFilePath(file)).canonicalFilePath();
63 if (pluginPaths.contains(abs)) {
67 if (!QLibrary::isLibrary(abs)) {
70 QPluginLoader *l =
new QPluginLoader(abs);
72 if (
auto plugin = qobject_cast<PluginInterface *>(l->instance())) {
73 if (
PluginInfo *p = plugin->create(Q_NULLPTR)) {
74 qCDebug(PLUGIN_LOADER) <<
"+---------------------------------+";
75 qCDebug(PLUGIN_LOADER) <<
"Library plugin found >> " << plugin->name();
76 qCDebug(PLUGIN_LOADER) <<
"Registered >> " << p->location();
77 qCDebug(PLUGIN_LOADER) <<
"I18n >> " << p->i18n();
78 qCDebug(PLUGIN_LOADER) <<
"+---------------------------------+";
79 registry.insert(p->location(), p);
80 if (!p->i18n().isEmpty()) {
82 loadTranslations(directory %
"/" % p->i18n());
91 qCDebug(PLUGIN_LOADER) <<
"Looking for dekko spec plugins";
95 Q_FOREACH(
const QString &directory, dirs) {
96 QDirIterator it(directory, QStringList() <<
"*.dekko-plugin", QDir::Files, QDirIterator::Subdirectories);
97 while (it.hasNext()) {
98 QString path = it.next();
99 const QString abs = QFileInfo(path).canonicalFilePath();
100 if (pluginPaths.contains(abs)) {
105 if (
auto pluginInfo = DekkoPlugin::fromSpec(abs)) {
106 qCDebug(PLUGIN_LOADER) <<
"+-------------------------------------+";
107 qCDebug(PLUGIN_LOADER) <<
"PluginReady: " << abs;
108 qCDebug(PLUGIN_LOADER) <<
"Registered: " << pluginInfo->location();
109 qCDebug(PLUGIN_LOADER) <<
"Path: " << it.fileInfo().absolutePath();
110 qCDebug(PLUGIN_LOADER) <<
"I18n >> " << pluginInfo->i18n();
111 qobject_cast<DekkoPlugin *>(pluginInfo)->setPluginDirectory(it.fileInfo().absolutePath());
112 registry.insert(pluginInfo->location(), pluginInfo);
113 if (!pluginInfo->i18n().isEmpty()) {
115 loadTranslations(it.fileInfo().absolutePath() %
"/" % pluginInfo->i18n());
117 qCDebug(PLUGIN_LOADER) <<
"+-------------------------------------+";
123void PluginLoader::setPluginPaths(
const QStringList &paths)
125 if (!paths.isEmpty()) {
126 m_pluginPaths = paths;
130void PluginLoader::loadTranslations(
const QString &i18nDir)
132 qCDebug(PLUGIN_LOADER) <<
"Plugin declared i18n directory: " << i18nDir;
135 qCDebug(PLUGIN_LOADER) <<
"Plugin has i18n directory, creating a translator";
136 QTranslator *tr =
new QTranslator(Q_NULLPTR);
137 if (tr->load(QLocale::system().name(), i18nDir)) {
138 qApp->installTranslator(tr);
139 m_translators.append(tr);
140 qCDebug(PLUGIN_LOADER) <<
"Translator created for directory: " << i18nDir;
142 qCDebug(PLUGIN_LOADER) <<
"Failed creating translator for: " << i18nDir;
143 qCDebug(PLUGIN_LOADER) <<
"Locale: " << QLocale::system().name();
146 qCDebug(PLUGIN_LOADER) <<
"i18n directory doesn't exist";