Рефакторинг

This commit is contained in:
Andrey Rodionov 2020-05-12 13:10:22 +03:00
parent 4324eff688
commit a605b7bf74
4 changed files with 29 additions and 31 deletions

View File

@ -10,8 +10,7 @@ IPlugin::IPlugin(const QString& depInterfaces)
if (!depPlugin.isEmpty())
pluginManager->nextLoadPlugins(depPlugin);
}
if (pluginManager->settings())
setSettings(pluginManager->settings());
setSettings(pluginManager->settings());
}
IPlugin::~IPlugin()

View File

@ -13,7 +13,6 @@ PluginManager::PluginManager(QObject *parent) :
{
m_instance = this;
m_settings = nullptr;
m_lockFiles = nullptr;
m_pluginsDir = QDir(qApp->applicationDirPath() + "/plugins/");
}
@ -42,7 +41,6 @@ PluginManager::~PluginManager()
delete plug;
plug = interfaceObject("IPlugin");
}
delete [] m_lockFiles;
}
QSettings *PluginManager::settings() const
@ -69,11 +67,11 @@ QList<IPlugin *> PluginManager::dependentPlugins(IPlugin *plugin)
QHash<QString, IPlugin *> pluginList;
for (QObject *objPlug : m_interfaces.values("IPlugin")) {
IPlugin *plug = qobject_cast<IPlugin *>(objPlug);
if (plug && plug!=plugin)
for (IPlugin *interfacePlugin : dependPlugins(plug))
if (plugin == interfacePlugin)
pluginList[objPlug->objectName()] = plug;
IPlugin *dependPlugin = qobject_cast<IPlugin *>(objPlug);
if (dependPlugin != nullptr && dependPlugin != plugin) {
if (dependPlugins(dependPlugin).contains(plugin))
pluginList[objPlug->objectName()] = dependPlugin;
}
}
return pluginList.values();
}
@ -86,11 +84,9 @@ bool PluginManager::loadPlugins()
+ m_pluginsDir.absolutePath();
return false;
}
m_fileList = m_pluginsDir.entryList(QDir::Files);
qint32 count = m_fileList.count();
m_lockFiles = new bool[count];
for (qint32 i = 0; i < count; ++i) m_lockFiles[i] = false;
for (const QString &filename : m_pluginsDir.entryList(QDir::Files))
m_fileList.append({filename, false});
nextLoadPlugins();
emit endLoadingPlugins();
@ -101,16 +97,14 @@ bool PluginManager::loadPlugins()
bool PluginManager::nextLoadPlugins(QString iid)
{
bool result = false;
for (qint32 fileNum = m_fileList.count()-1; fileNum >= 0 ; --fileNum)
{
if (!m_lockFiles[fileNum]) {
m_lockFiles[fileNum] = true;
bool isLoad = loadPlugin(m_fileList.at(fileNum), iid);
if (!isLoad)
m_lockFiles[fileNum] = false;
result = result || isLoad;
for (FileList &file : m_fileList) {
if (!file.lock) {
file.lock = true;
file.lock = loadPlugin(file.filename, iid);
result = result || file.lock;
}
}
return result;
}

View File

@ -64,7 +64,7 @@ public:
QList<IPlugin*> dependentPlugins(IPlugin *plugin);
//! Получить от каких плагинов зависит
/*! Позволяет получить список плагинов от которых зависит указанный плвгин
/*! Позволяет получить список плагинов от которых зависит указанный плагин
*/
QList<IPlugin *> dependPlugins(IPlugin *plugin);
@ -109,6 +109,11 @@ private slots:
private:
struct FileList {
QString filename;
bool lock;
};
//! Экземпляр менеджера плагинов
static PluginManager *m_instance;
@ -125,10 +130,7 @@ private:
QDir m_pluginsDir;
//! Список файлов в каталоге плагина
QStringList m_fileList;
//! Множество заблокированных файлов
bool *m_lockFiles;
QList<FileList> m_fileList;
};
}}

View File

@ -211,12 +211,15 @@ void tst_PluginManager::loadPlugins()
QVERIFY(plugins.at(0) == "tst_plugin3");
QVERIFY(
(plugins.at(1) == "tst_plugin2"
&& (plugins.at(2) == "tst_plugin1" || plugins.at(3) == "tst_plugin1"))
|| (plugins.at(2) == "tst_plugin2" && plugins.at(3) == "tst_plugin1")
( plugins.at(1) == "tst_plugin2" &&
plugins.at(2) == "tst_plugin4" &&
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()