Рефакторинг

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()) if (!depPlugin.isEmpty())
pluginManager->nextLoadPlugins(depPlugin); pluginManager->nextLoadPlugins(depPlugin);
} }
if (pluginManager->settings()) setSettings(pluginManager->settings());
setSettings(pluginManager->settings());
} }
IPlugin::~IPlugin() IPlugin::~IPlugin()

View File

@ -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;
} }

View File

@ -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;
}; };
}} }}

View File

@ -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()