diff --git a/src/blackmisc/applicationinfolist.cpp b/src/blackmisc/applicationinfolist.cpp index 207aaece1..09571109f 100644 --- a/src/blackmisc/applicationinfolist.cpp +++ b/src/blackmisc/applicationinfolist.cpp @@ -33,7 +33,7 @@ namespace BlackMisc names.reserve(size()); for (const CApplicationInfo &info : *this) { - names.append(info.processInfo().processName()); + names.append(info.getProcessInfo().processName()); } return names; } diff --git a/src/blackmisc/directoryutils.cpp b/src/blackmisc/directoryutils.cpp index dfb7f0ed5..5e5832642 100644 --- a/src/blackmisc/directoryutils.cpp +++ b/src/blackmisc/directoryutils.cpp @@ -95,23 +95,54 @@ namespace BlackMisc return p; } - QFileInfoList CDirectoryUtils::applicationDataDirectories() + const QFileInfoList &CDirectoryUtils::applicationDataDirectories() { - QDir swiftAppData(CDirectoryUtils::applicationDataDirectory()); // contains 1..n subdirs - if (!swiftAppData.isReadable()) return QFileInfoList(); - return swiftAppData.entryInfoList({}, QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time); + static const QFileInfoList fileInfoList([] + { + const QDir swiftAppData(CDirectoryUtils::applicationDataDirectory()); // contains 1..n subdirs + if (!swiftAppData.isReadable()) return QFileInfoList(); + return swiftAppData.entryInfoList({}, QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time); + }()); + return fileInfoList; } - QStringList CDirectoryUtils::applicationDataDirectoryList(bool withoutCurrent, bool beautify) + int CDirectoryUtils::applicationDataDirectoriesCount() + { + return CDirectoryUtils::applicationDataDirectories().size(); + } + + QStringList CDirectoryUtils::applicationDataDirectoryList(bool withoutCurrent, bool decodedDirName) { QStringList dirs; - const QFileInfoList directories(CDirectoryUtils::applicationDataDirectories()); - for (const QFileInfo &info : directories) + for (const QFileInfo &info : CDirectoryUtils::applicationDataDirectories()) { if (withoutCurrent && info.filePath().contains(normalizedApplicationDirectory(), Qt::CaseInsensitive)) continue; - dirs.append(beautify ? - CDirectoryUtils::decodeNormalizedDirectory(info.fileName()) : - info.fileName()); + dirs.append(decodedDirName ? + CDirectoryUtils::decodeNormalizedDirectory(info.filePath()) : + info.filePath()); + } + return dirs; + } + + QMap CDirectoryUtils::applicationDataDirectoryMap(bool withoutCurrent) + { + static const CApplicationInfo nullInfo; + QMap dirs; + + for (const QFileInfo &info : CDirectoryUtils::applicationDataDirectories()) + { + if (withoutCurrent && info.filePath().contains(normalizedApplicationDirectory(), Qt::CaseInsensitive)) continue; + const QString appInfoFile = CFileUtils::appendFilePaths(info.filePath(), CApplicationInfo::fileName()); + const QString appInfoJson = CFileUtils::readFileToString(appInfoFile); + if (appInfoJson.isEmpty()) + { + dirs.insert(info.filePath(), nullInfo); + } + else + { + const CApplicationInfo appInfo = CApplicationInfo::fromJson(appInfoJson); + dirs.insert(info.filePath(), appInfo); + } } return dirs; } diff --git a/src/blackmisc/directoryutils.h b/src/blackmisc/directoryutils.h index 25d8ca506..222e5960f 100644 --- a/src/blackmisc/directoryutils.h +++ b/src/blackmisc/directoryutils.h @@ -12,7 +12,9 @@ #ifndef BLACKMISC_DIRECTORYUTILS_H #define BLACKMISC_DIRECTORYUTILS_H -#include "blackmisc/blackmiscexport.h" +#include "applicationinfo.h" +#include "blackmiscexport.h" +#include #include #include #include @@ -41,10 +43,16 @@ namespace BlackMisc static const QString &applicationDataDirectory(); //! swift application data sub directories - static QFileInfoList applicationDataDirectories(); + static const QFileInfoList &applicationDataDirectories(); + + //! number of data directories (including this version) + static int applicationDataDirectoriesCount(); //! swift application data sub directories - static QStringList applicationDataDirectoryList(bool withoutCurrent = false, bool beautify = false); + static QStringList applicationDataDirectoryList(bool withoutCurrent = false, bool decodedDirName = false); + + //! swift application data sub directories with info if available + static QMap applicationDataDirectoryMap(bool withoutCurrent = false); //! Is MacOS application bundle? //! \remark: Means the currently running executable is a MacOS bundle, but not all our executables are bundles on MacOS diff --git a/src/blackmisc/processinfo.h b/src/blackmisc/processinfo.h index a4cbdce7f..0682371c3 100644 --- a/src/blackmisc/processinfo.h +++ b/src/blackmisc/processinfo.h @@ -42,6 +42,9 @@ namespace BlackMisc //! Get the pid. qint64 processId() const { return m_pid; } + //! Empty process info + bool isNull() const { return m_pid == 0 && m_name.isEmpty(); } + //! Get the process name. const QString &processName() const { return m_name; }