Issue #77 Break cyclic dependency swiftdirectories <-> applicationinfolist

This commit is contained in:
Mat Sutcliffe
2020-08-30 00:25:56 +01:00
parent ab44c068ab
commit f421bb90c3
6 changed files with 56 additions and 59 deletions

View File

@@ -40,7 +40,7 @@ namespace BlackGui
// no other versions, skip copy pages // no other versions, skip copy pages
// disabled afetr discussion with RP as it is confusing // disabled afetr discussion with RP as it is confusing
// if (!CDirectoryUtils::hasOtherSwiftDataDirectories()) { this->setStartId(ConfigSimulator); } // if (!CApplicationInfoList::hasOtherSwiftDataDirectories()) { this->setStartId(ConfigSimulator); }
ui->tb_SimulatorSpecific->setCurrentWidget(ui->comp_InstallXSwiftBus); ui->tb_SimulatorSpecific->setCurrentWidget(ui->comp_InstallXSwiftBus);

View File

@@ -51,7 +51,7 @@ namespace BlackGui
ui->setupUi(this); ui->setupUi(this);
this->initOtherSwiftVersions(); this->initOtherSwiftVersions();
this->setWidths(); this->setWidths();
m_hasOtherSwiftVersions = CSwiftDirectories::hasOtherSwiftDataDirectories(); m_hasOtherSwiftVersions = CApplicationInfoList::hasOtherSwiftDataDirectories();
ui->cb_ShowAll->setChecked(m_nameFilterDisables); ui->cb_ShowAll->setChecked(m_nameFilterDisables);
connect(ui->rb_Cache, &QRadioButton::toggled, [ = ](bool) { this->initCurrentDirectories(true); }); connect(ui->rb_Cache, &QRadioButton::toggled, [ = ](bool) { this->initCurrentDirectories(true); });
@@ -419,7 +419,7 @@ namespace BlackGui
void CCopyConfigurationComponent::initOtherSwiftVersions() void CCopyConfigurationComponent::initOtherSwiftVersions()
{ {
ui->cb_OtherVersions->clear(); ui->cb_OtherVersions->clear();
const QMap<QString, CApplicationInfo> otherVersions = CSwiftDirectories::currentApplicationDataDirectoryMapWithoutCurrentVersion(); const QMap<QString, CApplicationInfo> otherVersions = CApplicationInfoList::currentApplicationDataDirectoryMapWithoutCurrentVersion();
for (const auto &pair : makePairsRange(otherVersions)) for (const auto &pair : makePairsRange(otherVersions))
{ {
const CApplicationInfo &info(pair.second); const CApplicationInfo &info(pair.second);

View File

@@ -9,6 +9,7 @@
#include "blackmisc/applicationinfolist.h" #include "blackmisc/applicationinfolist.h"
#include "blackmisc/swiftdirectories.h" #include "blackmisc/swiftdirectories.h"
#include "blackmisc/directoryutils.h" #include "blackmisc/directoryutils.h"
#include "blackmisc/stringutils.h"
#include "blackconfig/buildconfig.h" #include "blackconfig/buildconfig.h"
using namespace BlackConfig; using namespace BlackConfig;
@@ -46,8 +47,8 @@ namespace BlackMisc
{ {
this->clear(); this->clear();
const QMap<QString, CApplicationInfo> otherVersions = reinit ? const QMap<QString, CApplicationInfo> otherVersions = reinit ?
CSwiftDirectories::currentApplicationDataDirectoryMapWithoutCurrentVersion() : currentApplicationDataDirectoryMapWithoutCurrentVersion() :
CSwiftDirectories::applicationDataDirectoryMapWithoutCurrentVersion(); applicationDataDirectoryMapWithoutCurrentVersion();
for (const CApplicationInfo &info : otherVersions) for (const CApplicationInfo &info : otherVersions)
{ {
@@ -62,4 +63,45 @@ namespace BlackMisc
il.otherSwiftVersionsFromDataDirectories(reinit); il.otherSwiftVersionsFromDataDirectories(reinit);
return il; return il;
} }
const QMap<QString, CApplicationInfo> &CApplicationInfoList::applicationDataDirectoryMapWithoutCurrentVersion()
{
static const QMap<QString, CApplicationInfo> directories = currentApplicationDataDirectoryMapWithoutCurrentVersion();
return directories;
}
QMap<QString, CApplicationInfo> CApplicationInfoList::currentApplicationDataDirectoryMapWithoutCurrentVersion()
{
QMap<QString, CApplicationInfo> directories;
for (const QFileInfo &info : CSwiftDirectories::currentApplicationDataDirectories())
{
// check for myself (the running swift)
if (caseInsensitiveStringCompare(info.filePath(), CSwiftDirectories::normalizedApplicationDataDirectory())) { continue; }
// the application info will be written by each swift application started
// so the application type will always contain that application
const QString appInfoFile = CFileUtils::appendFilePaths(info.filePath(), CApplicationInfo::fileName());
const QString appInfoJson = CFileUtils::readFileToString(appInfoFile);
CApplicationInfo appInfo;
if (appInfoJson.isEmpty())
{
// no JSON means the app no longer exists
const QString exeDir = CDirectoryUtils::decodeNormalizedDirectory(info.filePath());
appInfo.setExecutablePath(exeDir);
}
else
{
appInfo = CApplicationInfo::fromJson(appInfoJson);
}
appInfo.setApplicationDataDirectory(info.filePath());
directories.insert(info.filePath(), appInfo);
}
return directories;
}
bool CApplicationInfoList::hasOtherSwiftDataDirectories()
{
return applicationDataDirectoryMapWithoutCurrentVersion().size() > 0;
}
} // ns } // ns

View File

@@ -48,6 +48,15 @@ namespace BlackMisc
//! Filled from cache data directories //! Filled from cache data directories
static CApplicationInfoList fromOtherSwiftVersionsFromDataDirectories(bool reinit = false); static CApplicationInfoList fromOtherSwiftVersionsFromDataDirectories(bool reinit = false);
//! swift application data sub directories with info if available
static const QMap<QString, CApplicationInfo> &applicationDataDirectoryMapWithoutCurrentVersion();
//! swift application data sub directories with info if available
static QMap<QString, CApplicationInfo> currentApplicationDataDirectoryMapWithoutCurrentVersion();
//! Other swift data directories
static bool hasOtherSwiftDataDirectories();
}; };
} // ns } // ns

View File

@@ -145,47 +145,6 @@ namespace BlackMisc
return dirs; return dirs;
} }
const CSwiftDirectories::FilePerApplication &CSwiftDirectories::applicationDataDirectoryMapWithoutCurrentVersion()
{
static const FilePerApplication directories = currentApplicationDataDirectoryMapWithoutCurrentVersion();
return directories;
}
CSwiftDirectories::FilePerApplication CSwiftDirectories::currentApplicationDataDirectoryMapWithoutCurrentVersion()
{
FilePerApplication directories;
for (const QFileInfo &info : currentApplicationDataDirectories())
{
// check for myself (the running swift)
if (caseInsensitiveStringCompare(info.filePath(), normalizedApplicationDataDirectory())) { continue; }
// the application info will be written by each swift application started
// so the application type will always contain that application
const QString appInfoFile = CFileUtils::appendFilePaths(info.filePath(), CApplicationInfo::fileName());
const QString appInfoJson = CFileUtils::readFileToString(appInfoFile);
CApplicationInfo appInfo;
if (appInfoJson.isEmpty())
{
// no JSON means the app no longer exists
const QString exeDir = CDirectoryUtils::decodeNormalizedDirectory(info.filePath());
appInfo.setExecutablePath(exeDir);
}
else
{
appInfo = CApplicationInfo::fromJson(appInfoJson);
}
appInfo.setApplicationDataDirectory(info.filePath());
directories.insert(info.filePath(), appInfo);
}
return directories;
}
bool CSwiftDirectories::hasOtherSwiftDataDirectories()
{
return applicationDataDirectoryMapWithoutCurrentVersion().size() > 0;
}
const QString &CSwiftDirectories::normalizedApplicationDataDirectory() const QString &CSwiftDirectories::normalizedApplicationDataDirectory()
{ {
static const QString p = CFileUtils::appendFilePaths(applicationDataDirectory(), normalizedApplicationDirectory()); static const QString p = CFileUtils::appendFilePaths(applicationDataDirectory(), normalizedApplicationDirectory());

View File

@@ -11,7 +11,6 @@
#ifndef BLACKMISC_SWIFTDIRECTORIES_H #ifndef BLACKMISC_SWIFTDIRECTORIES_H
#define BLACKMISC_SWIFTDIRECTORIES_H #define BLACKMISC_SWIFTDIRECTORIES_H
#include "blackmisc/applicationinfo.h"
#include "blackmisc/blackmiscexport.h" #include "blackmisc/blackmiscexport.h"
#include <QMap> #include <QMap>
#include <QSet> #include <QSet>
@@ -28,9 +27,6 @@ namespace BlackMisc
class BLACKMISC_EXPORT CSwiftDirectories class BLACKMISC_EXPORT CSwiftDirectories
{ {
public: public:
//! File path and swift application
using FilePerApplication = QMap<QString, CApplicationInfo>;
//! Returns the bin directory. On Windows/Linux this is the same directory as //! Returns the bin directory. On Windows/Linux this is the same directory as
//! QCoreApplication::applicationDirPath(), but on MacOS the exceutable is //! QCoreApplication::applicationDirPath(), but on MacOS the exceutable is
//! located deeper in the hierarchy of the bundles //! located deeper in the hierarchy of the bundles
@@ -67,15 +63,6 @@ namespace BlackMisc
//! swift application data sub directories //! swift application data sub directories
static QStringList applicationDataDirectoryList(bool withoutCurrent = false, bool decodedDirName = false); static QStringList applicationDataDirectoryList(bool withoutCurrent = false, bool decodedDirName = false);
//! swift application data sub directories with info if available
static const FilePerApplication &applicationDataDirectoryMapWithoutCurrentVersion();
//! swift application data sub directories with info if available
static FilePerApplication currentApplicationDataDirectoryMapWithoutCurrentVersion();
//! Other swift data directories
static bool hasOtherSwiftDataDirectories();
//! swift application data directory for one specific installation (a version) //! swift application data directory for one specific installation (a version)
//! \remark use CDirectoryUtils::applicationDataDirectory for one all swift versions //! \remark use CDirectoryUtils::applicationDataDirectory for one all swift versions
static const QString &normalizedApplicationDataDirectory(); static const QString &normalizedApplicationDataDirectory();