Рефакторинг
This commit is contained in:
parent
4324eff688
commit
a605b7bf74
|
@ -10,8 +10,7 @@ IPlugin::IPlugin(const QString& depInterfaces)
|
||||||
if (!depPlugin.isEmpty())
|
if (!depPlugin.isEmpty())
|
||||||
pluginManager->nextLoadPlugins(depPlugin);
|
pluginManager->nextLoadPlugins(depPlugin);
|
||||||
}
|
}
|
||||||
if (pluginManager->settings())
|
setSettings(pluginManager->settings());
|
||||||
setSettings(pluginManager->settings());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IPlugin::~IPlugin()
|
IPlugin::~IPlugin()
|
||||||
|
|
|
@ -13,7 +13,6 @@ PluginManager::PluginManager(QObject *parent) :
|
||||||
{
|
{
|
||||||
m_instance = this;
|
m_instance = this;
|
||||||
m_settings = nullptr;
|
m_settings = nullptr;
|
||||||
m_lockFiles = nullptr;
|
|
||||||
|
|
||||||
m_pluginsDir = QDir(qApp->applicationDirPath() + "/plugins/");
|
m_pluginsDir = QDir(qApp->applicationDirPath() + "/plugins/");
|
||||||
}
|
}
|
||||||
|
@ -42,7 +41,6 @@ PluginManager::~PluginManager()
|
||||||
delete plug;
|
delete plug;
|
||||||
plug = interfaceObject("IPlugin");
|
plug = interfaceObject("IPlugin");
|
||||||
}
|
}
|
||||||
delete [] m_lockFiles;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QSettings *PluginManager::settings() const
|
QSettings *PluginManager::settings() const
|
||||||
|
@ -69,11 +67,11 @@ QList<IPlugin *> PluginManager::dependentPlugins(IPlugin *plugin)
|
||||||
QHash<QString, IPlugin *> pluginList;
|
QHash<QString, IPlugin *> pluginList;
|
||||||
|
|
||||||
for (QObject *objPlug : m_interfaces.values("IPlugin")) {
|
for (QObject *objPlug : m_interfaces.values("IPlugin")) {
|
||||||
IPlugin *plug = qobject_cast<IPlugin *>(objPlug);
|
IPlugin *dependPlugin = qobject_cast<IPlugin *>(objPlug);
|
||||||
if (plug && plug!=plugin)
|
if (dependPlugin != nullptr && dependPlugin != plugin) {
|
||||||
for (IPlugin *interfacePlugin : dependPlugins(plug))
|
if (dependPlugins(dependPlugin).contains(plugin))
|
||||||
if (plugin == interfacePlugin)
|
pluginList[objPlug->objectName()] = dependPlugin;
|
||||||
pluginList[objPlug->objectName()] = plug;
|
}
|
||||||
}
|
}
|
||||||
return pluginList.values();
|
return pluginList.values();
|
||||||
}
|
}
|
||||||
|
@ -86,11 +84,9 @@ bool PluginManager::loadPlugins()
|
||||||
+ m_pluginsDir.absolutePath();
|
+ m_pluginsDir.absolutePath();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_fileList = m_pluginsDir.entryList(QDir::Files);
|
|
||||||
|
|
||||||
qint32 count = m_fileList.count();
|
for (const QString &filename : m_pluginsDir.entryList(QDir::Files))
|
||||||
m_lockFiles = new bool[count];
|
m_fileList.append({filename, false});
|
||||||
for (qint32 i = 0; i < count; ++i) m_lockFiles[i] = false;
|
|
||||||
|
|
||||||
nextLoadPlugins();
|
nextLoadPlugins();
|
||||||
emit endLoadingPlugins();
|
emit endLoadingPlugins();
|
||||||
|
@ -101,16 +97,14 @@ bool PluginManager::loadPlugins()
|
||||||
bool PluginManager::nextLoadPlugins(QString iid)
|
bool PluginManager::nextLoadPlugins(QString iid)
|
||||||
{
|
{
|
||||||
bool result = false;
|
bool result = false;
|
||||||
for (qint32 fileNum = m_fileList.count()-1; fileNum >= 0 ; --fileNum)
|
for (FileList &file : m_fileList) {
|
||||||
{
|
if (!file.lock) {
|
||||||
if (!m_lockFiles[fileNum]) {
|
file.lock = true;
|
||||||
m_lockFiles[fileNum] = true;
|
file.lock = loadPlugin(file.filename, iid);
|
||||||
bool isLoad = loadPlugin(m_fileList.at(fileNum), iid);
|
result = result || file.lock;
|
||||||
if (!isLoad)
|
|
||||||
m_lockFiles[fileNum] = false;
|
|
||||||
result = result || isLoad;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ public:
|
||||||
QList<IPlugin*> dependentPlugins(IPlugin *plugin);
|
QList<IPlugin*> dependentPlugins(IPlugin *plugin);
|
||||||
|
|
||||||
//! Получить от каких плагинов зависит
|
//! Получить от каких плагинов зависит
|
||||||
/*! Позволяет получить список плагинов от которых зависит указанный плвгин
|
/*! Позволяет получить список плагинов от которых зависит указанный плагин
|
||||||
*/
|
*/
|
||||||
QList<IPlugin *> dependPlugins(IPlugin *plugin);
|
QList<IPlugin *> dependPlugins(IPlugin *plugin);
|
||||||
|
|
||||||
|
@ -109,6 +109,11 @@ private slots:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
struct FileList {
|
||||||
|
QString filename;
|
||||||
|
bool lock;
|
||||||
|
};
|
||||||
|
|
||||||
//! Экземпляр менеджера плагинов
|
//! Экземпляр менеджера плагинов
|
||||||
static PluginManager *m_instance;
|
static PluginManager *m_instance;
|
||||||
|
|
||||||
|
@ -125,10 +130,7 @@ private:
|
||||||
QDir m_pluginsDir;
|
QDir m_pluginsDir;
|
||||||
|
|
||||||
//! Список файлов в каталоге плагина
|
//! Список файлов в каталоге плагина
|
||||||
QStringList m_fileList;
|
QList<FileList> m_fileList;
|
||||||
|
|
||||||
//! Множество заблокированных файлов
|
|
||||||
bool *m_lockFiles;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}}
|
}}
|
||||||
|
|
|
@ -211,12 +211,15 @@ void tst_PluginManager::loadPlugins()
|
||||||
QVERIFY(plugins.at(0) == "tst_plugin3");
|
QVERIFY(plugins.at(0) == "tst_plugin3");
|
||||||
|
|
||||||
QVERIFY(
|
QVERIFY(
|
||||||
(plugins.at(1) == "tst_plugin2"
|
( plugins.at(1) == "tst_plugin2" &&
|
||||||
&& (plugins.at(2) == "tst_plugin1" || plugins.at(3) == "tst_plugin1"))
|
plugins.at(2) == "tst_plugin4" &&
|
||||||
|| (plugins.at(2) == "tst_plugin2" && plugins.at(3) == "tst_plugin1")
|
plugins.at(3) == "tst_plugin1"
|
||||||
|
) ||
|
||||||
|
( plugins.at(1) == "tst_plugin4" && (
|
||||||
|
( plugins.at(2) == "tst_plugin1" && plugins.at(3) == "tst_plugin2") ||
|
||||||
|
( plugins.at(2) == "tst_plugin2" && plugins.at(3) == "tst_plugin1"))
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
QVERIFY(plugins.at(3) == "tst_plugin1" || plugins.at(3) == "tst_plugin4");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_PluginManager::settings()
|
void tst_PluginManager::settings()
|
||||||
|
|
Reference in New Issue