diff options
Diffstat (limited to 'libsowatch/registry.cpp')
-rw-r--r-- | libsowatch/registry.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/libsowatch/registry.cpp b/libsowatch/registry.cpp new file mode 100644 index 0000000..7ade260 --- /dev/null +++ b/libsowatch/registry.cpp @@ -0,0 +1,119 @@ +#include <QtCore/QDebug> +#include <QtCore/QPluginLoader> +#include <QtCore/QSettings> +#include <QtCore/QDir> + +#include "watchplugininterface.h" +#include "notificationplugininterface.h" +#include "watchletplugininterface.h" +#include "registry.h" + +using namespace sowatch; + +Registry* Registry::singleRegistry = 0; + +Registry* Registry::registry() +{ + if (!singleRegistry) { + singleRegistry = new Registry(); + } + + return singleRegistry; +} + +Registry::Registry() +{ + loadDrivers(); + loadNotificationProviders(); + loadWatchlets(); +} + +void Registry::loadDrivers() +{ + QDir dir(SOWATCH_DRIVERS_DIR); + foreach (QString file, dir.entryList(QDir::Files)) { +#if defined(Q_OS_UNIX) + // Temporary workaround for QtC deploy plugin issues + if (!file.endsWith(".so")) continue; +#endif + QPluginLoader loader(dir.absoluteFilePath(file)); + QObject *pluginObj = loader.instance(); + if (pluginObj) { + WatchPluginInterface *plugin = qobject_cast<WatchPluginInterface*>(pluginObj); + if (plugin) { + QStringList drivers = plugin->drivers(); + foreach (const QString& driver, drivers) { + _drivers[driver] = plugin; + } + } else { + qWarning() << "Invalid plugin" << file; + loader.unload(); + } + } else { + qWarning() << "Invalid plugin" << file << loader.errorString(); + loader.unload(); + } + } + + qDebug() << "loaded drivers" << _drivers.keys(); +} + +void Registry::loadNotificationProviders() +{ + QDir dir(SOWATCH_NOTIFICATIONS_DIR); + foreach (QString file, dir.entryList(QDir::Files)) { +#if defined(Q_OS_UNIX) + // Temporary workaround for QtC deploy plugin issues + if (!file.endsWith(".so")) continue; +#endif + QPluginLoader loader(dir.absoluteFilePath(file)); + QObject *pluginObj = loader.instance(); + if (pluginObj) { + NotificationPluginInterface *plugin = qobject_cast<NotificationPluginInterface*>(pluginObj); + if (plugin) { + QStringList providers = plugin->providers(); + foreach (const QString& provider, providers) { + _providers[provider] = plugin; + } + } else { + qWarning() << "Invalid plugin" << file; + loader.unload(); + } + } else { + qWarning() << "Invalid plugin" << file << loader.errorString(); + loader.unload(); + } + } + + qDebug() << "loaded notification providers" << _providers.keys(); +} + +void Registry::loadWatchlets() +{ + QDir dir(SOWATCH_WATCHLETS_DIR); + foreach (QString file, dir.entryList(QDir::Files)) { +#if defined(Q_OS_UNIX) + // Temporary workaround for QtC deploy plugin issues + if (!file.endsWith(".so")) continue; +#endif + QPluginLoader loader(dir.absoluteFilePath(file)); + QObject *pluginObj = loader.instance(); + if (pluginObj) { + WatchletPluginInterface *plugin = qobject_cast<WatchletPluginInterface*>(pluginObj); + if (plugin) { + QStringList watchlets = plugin->watchlets(); + foreach (const QString& watchlet, watchlets) { + _watchlets[watchlet] = plugin; + } + } else { + qWarning() << "Invalid plugin" << file; + loader.unload(); + } + } else { + qWarning() << "Invalid plugin" << file << loader.errorString(); + loader.unload(); + } + } + + qDebug() << "loaded watchlets" << _watchlets.keys(); +} |