some refactoring
This commit is contained in:
parent
3baca0e14f
commit
552400b46c
|
@ -22,12 +22,25 @@
|
||||||
#include "plugins.h"
|
#include "plugins.h"
|
||||||
#include "snorebackend.h"
|
#include "snorebackend.h"
|
||||||
#include "snorefrontend.h"
|
#include "snorefrontend.h"
|
||||||
|
#include "../version.h"
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
using namespace Snore;
|
using namespace Snore;
|
||||||
|
|
||||||
|
QHash<QString,PluginContainer*> PluginContainer::s_pluginCache = QHash<QString,PluginContainer*>() ;
|
||||||
|
|
||||||
|
QSettings &PluginContainer::cacheFile(){
|
||||||
|
#ifdef Q_OS_LINUX
|
||||||
|
static QSettings cache("TheOneRing","libsnore");
|
||||||
|
#else
|
||||||
|
static QSettings cache(SnoreCore::pluginDir().absoluteFilePath("plugin.cache"),QSettings::IniFormat);
|
||||||
|
#endif
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
PluginContainer::PluginContainer(QString fileName, QString pluginName, PluginContainer::PluginType type):
|
PluginContainer::PluginContainer(QString fileName, QString pluginName, PluginContainer::PluginType type):
|
||||||
m_pluginFile(fileName),
|
m_pluginFile(fileName),
|
||||||
m_pluginName(pluginName),
|
m_pluginName(pluginName),
|
||||||
|
@ -103,3 +116,73 @@ const QStringList &PluginContainer::types()
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PluginContainer::updatePluginCache(){
|
||||||
|
QSettings &cache = cacheFile();
|
||||||
|
qDebug() << "Updating plugin cache" << cache.fileName();
|
||||||
|
|
||||||
|
s_pluginCache.clear();
|
||||||
|
cache.clear();
|
||||||
|
|
||||||
|
foreach(const QString &type,PluginContainer::types()){
|
||||||
|
QDir plPath(SnoreCore::pluginDir().absoluteFilePath(type));
|
||||||
|
qDebug() << "Searching for plugins in" << plPath.path();
|
||||||
|
foreach (QString fileName, plPath.entryList(QDir::Files)) {
|
||||||
|
QString filepath(plPath.absoluteFilePath(fileName));
|
||||||
|
qDebug() << "adding" << filepath;
|
||||||
|
QPluginLoader loader(filepath);
|
||||||
|
QObject *plugin = loader.instance();
|
||||||
|
if (plugin == NULL) {
|
||||||
|
qDebug() << "Failed loading plugin: " << filepath << loader.errorString();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SnorePlugin *sp = dynamic_cast<SnorePlugin*>(plugin);
|
||||||
|
if(sp == NULL){
|
||||||
|
qDebug() << "Error:" << fileName << " is not a Snore plugin" ;
|
||||||
|
plugin->deleteLater();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
PluginContainer *info = new PluginContainer( SnoreCore::pluginDir().relativeFilePath(filepath),sp->name(),PluginContainer::typeFromString(type));
|
||||||
|
s_pluginCache.insert(info->name(),info);
|
||||||
|
delete sp;
|
||||||
|
qDebug() << "added" << info->name() << "to cache";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug()<<s_pluginCache.keys();
|
||||||
|
cache.setValue("version",Version::revision());
|
||||||
|
cache.setValue("pluginPath",SnoreCore::pluginDir().path());
|
||||||
|
QList<PluginContainer*> plugins = s_pluginCache.values();
|
||||||
|
cache.beginWriteArray("plugins");
|
||||||
|
for(int i=0;i< plugins.size();++i) {
|
||||||
|
cache.setArrayIndex(i);
|
||||||
|
cache.setValue("fileName",plugins[i]->file());
|
||||||
|
cache.setValue("name", plugins[i]->name());
|
||||||
|
cache.setValue("type",(int)plugins[i]->type());
|
||||||
|
}
|
||||||
|
cache.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
QHash<QString, PluginContainer *> PluginContainer::pluginCache(){
|
||||||
|
if(!s_pluginCache.isEmpty())
|
||||||
|
return s_pluginCache;
|
||||||
|
QSettings &cache = cacheFile();
|
||||||
|
QString version = cache.value("version").toString();
|
||||||
|
QString path = cache.value("pluginPath").toString();
|
||||||
|
int size = cache.beginReadArray("plugins");
|
||||||
|
if(size == 0 || version != Version::revision() || path != SnoreCore::pluginDir().path()){
|
||||||
|
cache.endArray();
|
||||||
|
updatePluginCache();
|
||||||
|
}else{
|
||||||
|
for(int i=0;i<size;++i) {
|
||||||
|
cache.setArrayIndex(i);
|
||||||
|
PluginContainer::PluginType type = (PluginContainer::PluginType)cache.value("type").toInt();
|
||||||
|
PluginContainer *info = new PluginContainer(cache.value("fileName").toString(),cache.value("name").toString(),type);
|
||||||
|
s_pluginCache.insert(info->name(),info);
|
||||||
|
}
|
||||||
|
cache.endArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
return s_pluginCache;
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "../snore_exports.h"
|
#include "../snore_exports.h"
|
||||||
|
|
||||||
#include <QPointer>
|
#include <QPointer>
|
||||||
|
#include <QSettings>
|
||||||
#include <QFlag>
|
#include <QFlag>
|
||||||
|
|
||||||
namespace Snore{
|
namespace Snore{
|
||||||
|
@ -41,6 +42,9 @@ public:
|
||||||
PLUGIN = 0x8
|
PLUGIN = 0x8
|
||||||
};
|
};
|
||||||
Q_DECLARE_FLAGS(PluginTypes, PluginType)
|
Q_DECLARE_FLAGS(PluginTypes, PluginType)
|
||||||
|
|
||||||
|
static QHash<QString,PluginContainer*> pluginCache();
|
||||||
|
|
||||||
PluginContainer(QString fileName,QString pluginName,PluginType type);
|
PluginContainer(QString fileName,QString pluginName,PluginType type);
|
||||||
~PluginContainer();
|
~PluginContainer();
|
||||||
SnorePlugin *load();
|
SnorePlugin *load();
|
||||||
|
@ -53,6 +57,11 @@ public:
|
||||||
static const QStringList &types();
|
static const QStringList &types();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
static void updatePluginCache();
|
||||||
|
static QSettings &cacheFile();
|
||||||
|
|
||||||
|
static QHash<QString,PluginContainer*> s_pluginCache;
|
||||||
|
|
||||||
QPointer<SnorePlugin> m_instance;
|
QPointer<SnorePlugin> m_instance;
|
||||||
QString m_pluginFile;
|
QString m_pluginFile;
|
||||||
QString m_pluginName;
|
QString m_pluginName;
|
||||||
|
|
|
@ -36,17 +36,6 @@
|
||||||
|
|
||||||
using namespace Snore;
|
using namespace Snore;
|
||||||
|
|
||||||
QHash<QString,PluginContainer*> SnoreCore::s_pluginCache = QHash<QString,PluginContainer*>() ;
|
|
||||||
|
|
||||||
QSettings &SnoreCore::cacheFile(){
|
|
||||||
#ifdef Q_OS_LINUX
|
|
||||||
static QSettings cache("TheOneRing","libsnore");
|
|
||||||
#else
|
|
||||||
static QSettings cache(SnoreCore::pluginDir().absoluteFilePath("plugin.cache"),QSettings::IniFormat);
|
|
||||||
#endif
|
|
||||||
return cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SnoreCore::slotNotificationClosed(Notification n)
|
void SnoreCore::slotNotificationClosed(Notification n)
|
||||||
{
|
{
|
||||||
emit notificationClosed(n);
|
emit notificationClosed(n);
|
||||||
|
@ -69,77 +58,6 @@ SnoreCore::SnoreCore ( QSystemTrayIcon *trayIcon ) :
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<QString, PluginContainer *> SnoreCore::pluginCache(){
|
|
||||||
if(!s_pluginCache.isEmpty())
|
|
||||||
return s_pluginCache;
|
|
||||||
QSettings &cache = cacheFile();
|
|
||||||
QString version = cache.value("version").toString();
|
|
||||||
QString path = cache.value("pluginPath").toString();
|
|
||||||
int size = cache.beginReadArray("plugins");
|
|
||||||
if(size == 0 || version != Version::revision() || path != pluginDir().path()){
|
|
||||||
qDebug() << version << "!=" << Version::revision();
|
|
||||||
qDebug() << path << "!=" << pluginDir().path();
|
|
||||||
cache.endArray();
|
|
||||||
updatePluginCache();
|
|
||||||
}else{
|
|
||||||
for(int i=0;i<size;++i) {
|
|
||||||
cache.setArrayIndex(i);
|
|
||||||
PluginContainer::PluginType type = (PluginContainer::PluginType)cache.value("type").toInt();
|
|
||||||
PluginContainer *info = new PluginContainer(cache.value("fileName").toString(),cache.value("name").toString(),type);
|
|
||||||
s_pluginCache.insert(info->name(),info);
|
|
||||||
}
|
|
||||||
cache.endArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
return s_pluginCache;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SnoreCore::updatePluginCache(){
|
|
||||||
QSettings &cache = cacheFile();
|
|
||||||
qDebug() << "Updating plugin cache" << cache.fileName();
|
|
||||||
|
|
||||||
s_pluginCache.clear();
|
|
||||||
cache.clear();
|
|
||||||
|
|
||||||
foreach(const QString &type,PluginContainer::types()){
|
|
||||||
QDir plPath(SnoreCore::pluginDir().absoluteFilePath(type));
|
|
||||||
qDebug() << "Searching for plugins in" << plPath.path();
|
|
||||||
foreach (QString fileName, plPath.entryList(QDir::Files)) {
|
|
||||||
QString filepath(plPath.absoluteFilePath(fileName));
|
|
||||||
qDebug() << "adding" << filepath;
|
|
||||||
QPluginLoader loader(filepath);
|
|
||||||
QObject *plugin = loader.instance();
|
|
||||||
if (plugin == NULL) {
|
|
||||||
qDebug() << "Failed loading plugin: " << filepath << loader.errorString();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SnorePlugin *sp = dynamic_cast<SnorePlugin*>(plugin);
|
|
||||||
if(sp == NULL){
|
|
||||||
qDebug() << "Error:" << fileName << " is not a Snore plugin" ;
|
|
||||||
plugin->deleteLater();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
PluginContainer *info = new PluginContainer( SnoreCore::pluginDir().relativeFilePath(filepath),sp->name(),PluginContainer::typeFromString(type));
|
|
||||||
s_pluginCache.insert(info->name(),info);
|
|
||||||
delete sp;
|
|
||||||
qDebug() << "added" << info->name() << "to cache";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qDebug()<<s_pluginCache.keys();
|
|
||||||
cache.setValue("version",Version::revision());
|
|
||||||
cache.setValue("pluginPath",pluginDir().path());
|
|
||||||
QList<PluginContainer*> plugins = s_pluginCache.values();
|
|
||||||
cache.beginWriteArray("plugins");
|
|
||||||
for(int i=0;i< plugins.size();++i) {
|
|
||||||
cache.setArrayIndex(i);
|
|
||||||
cache.setValue("fileName",plugins[i]->file());
|
|
||||||
cache.setValue("name", plugins[i]->name());
|
|
||||||
cache.setValue("type",(int)plugins[i]->type());
|
|
||||||
}
|
|
||||||
cache.endArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
const QDir &SnoreCore::pluginDir(){
|
const QDir &SnoreCore::pluginDir(){
|
||||||
static QDir path(QString("%1/snoreplugins").arg(qApp->applicationDirPath()));
|
static QDir path(QString("%1/snoreplugins").arg(qApp->applicationDirPath()));
|
||||||
if(!path.exists())
|
if(!path.exists())
|
||||||
|
@ -153,8 +71,8 @@ const QDir &SnoreCore::pluginDir(){
|
||||||
|
|
||||||
void SnoreCore::loadPlugins ( PluginContainer::PluginTypes types )
|
void SnoreCore::loadPlugins ( PluginContainer::PluginTypes types )
|
||||||
{
|
{
|
||||||
qDebug() << "PluginInfo" << SnoreCore::pluginCache().keys();
|
qDebug() << "PluginInfo" << PluginContainer::pluginCache().keys();
|
||||||
foreach ( PluginContainer *info, SnoreCore::pluginCache().values())
|
foreach ( PluginContainer *info, PluginContainer::pluginCache().values())
|
||||||
{
|
{
|
||||||
if(types == PluginContainer::ALL or types.testFlag(info->type()))
|
if(types == PluginContainer::ALL or types.testFlag(info->type()))
|
||||||
{
|
{
|
||||||
|
@ -276,12 +194,12 @@ const QStringList &SnoreCore::secondaryNotificationBackends() const
|
||||||
|
|
||||||
bool SnoreCore::setPrimaryNotificationBackend ( const QString &backend )
|
bool SnoreCore::setPrimaryNotificationBackend ( const QString &backend )
|
||||||
{
|
{
|
||||||
if(!pluginCache().contains(backend)){
|
if(!PluginContainer::pluginCache().contains(backend)){
|
||||||
qDebug()<<"Unknown Backend:"<<backend;
|
qDebug()<<"Unknown Backend:"<<backend;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
qDebug()<<"Setting Notification Backend to:"<<backend;
|
qDebug()<<"Setting Notification Backend to:"<<backend;
|
||||||
SnoreBackend* b = qobject_cast<SnoreBackend*>(pluginCache()[backend]->load());
|
SnoreBackend* b = qobject_cast<SnoreBackend*>(PluginContainer::pluginCache()[backend]->load());
|
||||||
if(!b->isInitialized()){
|
if(!b->isInitialized()){
|
||||||
if(!b->init(this)){
|
if(!b->init(this)){
|
||||||
qDebug()<<"Failed to initialize"<<b->name();
|
qDebug()<<"Failed to initialize"<<b->name();
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include "hint.h"
|
#include "hint.h"
|
||||||
|
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QSettings>
|
|
||||||
#include <QTextDocument>
|
#include <QTextDocument>
|
||||||
#include <QTextDocumentFragment>
|
#include <QTextDocumentFragment>
|
||||||
|
|
||||||
|
@ -41,7 +40,6 @@ class SNORE_EXPORT SnoreCore : public QObject
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
static const QString snoreTMP();
|
static const QString snoreTMP();
|
||||||
static void updatePluginCache();
|
|
||||||
static const QDir &pluginDir();
|
static const QDir &pluginDir();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -86,11 +84,6 @@ private slots:
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static QHash<QString,PluginContainer*> pluginCache();
|
|
||||||
static QSettings &cacheFile();
|
|
||||||
|
|
||||||
static QHash<QString,PluginContainer*> s_pluginCache;
|
|
||||||
|
|
||||||
Hint m_hints;
|
Hint m_hints;
|
||||||
|
|
||||||
ApplicationsList m_applications;
|
ApplicationsList m_applications;
|
||||||
|
|
Loading…
Reference in New Issue