#include "config.h"
-#include <QPluginLoader>
-#include <QDir>
-#include <QLoggingCategory>
-
-Q_LOGGING_CATEGORY(lcPluginLoader, "pluginLoader", QtInfoMsg)
-
namespace OCC {
PluginFactory::~PluginFactory() = default;
-QString PluginLoader::pluginName(const QString &type, const QString &name)
+QString pluginFileName(const QString &type, const QString &name)
{
return QString(QLatin1String("%1sync_%2_%3"))
.arg(APPLICATION_EXECUTABLE, type, name);
}
-bool PluginLoader::isAvailable(const QString &type, const QString &name)
-{
- QPluginLoader loader(pluginName(type, name));
- return loader.load();
-}
-
-QObject *PluginLoader::load(const QString &type, const QString &name)
-{
- QString fileName = pluginName(type, name);
- QPluginLoader pluginLoader(fileName);
- if (pluginLoader.load()) {
- qCInfo(lcPluginLoader) << "Loaded plugin" << fileName;
- } else {
- qCWarning(lcPluginLoader) << "Could not load plugin"
- << fileName <<":"
- << pluginLoader.errorString()
- << "from" << QDir::currentPath();
- }
-
- return pluginLoader.instance();
-}
-
-QObject *PluginLoader::create(const QString &type, const QString &name, QObject *parent)
-{
- auto factory = qobject_cast<PluginFactory *>(load(type, name));
- if (!factory) {
- return nullptr;
- } else {
- return factory->create(parent);
- }
-}
-
}
#include "ocsynclib.h"
#include <QObject>
-#include <QPluginLoader>
namespace OCC {
}
};
-class OCSYNC_EXPORT PluginLoader
-{
-public:
- static QString pluginName(const QString &type, const QString &name);
-
- bool isAvailable(const QString &type, const QString &name);
- QObject *load(const QString &type, const QString &name);
- QObject *create(const QString &type, const QString &name, QObject *parent = nullptr);
-};
+/// Return the expected name of a plugin, for use with QPluginLoader
+QString pluginFileName(const QString &type, const QString &name);
}
#include "vfs.h"
#include "plugin.h"
+#include <QPluginLoader>
+#include <QLoggingCategory>
+
using namespace OCC;
Vfs::Vfs(QObject* parent)
auto name = modeToPluginName(mode);
if (name.isEmpty())
return false;
- return PluginLoader().load("vfs", name);
+ return QPluginLoader(pluginFileName("vfs", name)).load();
}
Vfs::Mode OCC::bestAvailableVfsMode()
return Vfs::Off;
}
+Q_LOGGING_CATEGORY(lcPlugin, "plugins", QtInfoMsg)
+
Vfs *OCC::createVfsFromPlugin(Vfs::Mode mode, QObject *parent)
{
auto name = modeToPluginName(mode);
if (name.isEmpty())
return nullptr;
- return qobject_cast<Vfs *>(PluginLoader().create("vfs", name, parent));
+
+ auto pluginPath = pluginFileName("vfs", name);
+ QPluginLoader loader(pluginPath);
+ auto plugin = loader.instance();
+ if (!plugin) {
+ qCWarning(lcPlugin) << "Could not load plugin" << pluginPath << loader.errorString();
+ return nullptr;
+ }
+
+ auto factory = qobject_cast<PluginFactory *>(plugin);
+ if (!factory) {
+ qCWarning(lcPlugin) << "Plugin" << pluginPath << "does not implement PluginFactory";
+ return nullptr;
+ }
+
+ auto vfs = qobject_cast<Vfs *>(factory->create(parent));
+ if (!vfs) {
+ qCWarning(lcPlugin) << "Plugin" << pluginPath << "does not create a Vfs instance";
+ return nullptr;
+ }
+
+ qCInfo(lcPlugin) << "Created VFS instance from plugin" << pluginPath;
+ return vfs;
}