diff options
| author | Al <26797547+Al12rs@users.noreply.github.com> | 2020-05-23 14:19:54 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-23 14:19:54 -0700 |
| commit | 08ae9db2fd2a07acb2433275fc84c2ca47267a92 (patch) | |
| tree | 5e1232028486d097352aca55ac994cd4e238064f /src | |
| parent | e618afa5d1ef53e62d022f3d233c86e13fd4a215 (diff) | |
| parent | 6374845a28c8f1f65a05fb954b4df1ebd541344b (diff) | |
Merge pull request #1076 from Holt59/moddatachecker
Use the ModDataChecker feature to check mod validity
Diffstat (limited to 'src')
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/archivefiletree.cpp | 29 | ||||
| -rw-r--r-- | src/installationmanager.cpp | 1 | ||||
| -rw-r--r-- | src/modinfo.cpp | 9 | ||||
| -rw-r--r-- | src/modinfo.h | 4 | ||||
| -rw-r--r-- | src/modinfoforeign.cpp | 3 | ||||
| -rw-r--r-- | src/modinfoforeign.h | 1 | ||||
| -rw-r--r-- | src/modinfooverwrite.cpp | 4 | ||||
| -rw-r--r-- | src/modinfooverwrite.h | 2 | ||||
| -rw-r--r-- | src/modinforegular.cpp | 3 | ||||
| -rw-r--r-- | src/modinforegular.h | 3 | ||||
| -rw-r--r-- | src/modinfoseparator.h | 8 | ||||
| -rw-r--r-- | src/modinfowithconflictinfo.cpp | 37 | ||||
| -rw-r--r-- | src/modinfowithconflictinfo.h | 10 | ||||
| -rw-r--r-- | src/modlist.cpp | 1 | ||||
| -rw-r--r-- | src/organizercore.cpp | 16 | ||||
| -rw-r--r-- | src/qdirfiletree.cpp | 57 | ||||
| -rw-r--r-- | src/qdirfiletree.h | 56 | ||||
| -rw-r--r-- | src/shared/directoryentry.cpp | 32 | ||||
| -rw-r--r-- | src/shared/directoryentry.h | 21 | ||||
| -rw-r--r-- | src/version.rc | 4 |
21 files changed, 184 insertions, 118 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 99d31541..6625e4b6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,6 +36,7 @@ add_filter(NAME src/core GROUPS organizerproxy apiuseraccount processrunner + qdirfiletree uilocker ) diff --git a/src/archivefiletree.cpp b/src/archivefiletree.cpp index 0b715f4f..6ba06924 100644 --- a/src/archivefiletree.cpp +++ b/src/archivefiletree.cpp @@ -33,23 +33,11 @@ class ArchiveFileEntry : public virtual FileTreeEntry { public: /** - * @brief Create a new entry corresponding to a file. + * @brief Create a new entry. * - * @param parent The tree containing this file. - * @param name The name of this file. - * @param index The index of the file in the archive. - * @param time The modification time of this file. - */ - ArchiveFileEntry(std::shared_ptr<const IFileTree> parent, QString name, int index, QDateTime time) : - FileTreeEntry(parent, name, time), m_Index(index) { - } - - /** - * @brief Create a new entry corresponding to a directory. - * - * @param parent The tree containing this directory. - * @param name The name of this directory. - * @param index The index of the directory in the archive, or -1. + * @param parent The tree containing this entry. + * @param name The name of this entry. + * @param index The index of the entry in the archive. */ ArchiveFileEntry(std::shared_ptr<const IFileTree> parent, QString name, int index) : FileTreeEntry(parent, name), m_Index(index) { @@ -98,7 +86,7 @@ public: // Overrides: /** * @override */ - std::shared_ptr<FileTreeEntry> addFile(QString path, QDateTime time = QDateTime()) override { + std::shared_ptr<FileTreeEntry> addFile(QString path) override { // Cannot add file to an archive. throw UnsupportedOperationException(QObject::tr("Cannot create file within an archive.")); } @@ -159,7 +147,7 @@ protected: return std::make_shared<ArchiveFileTreeImpl>(parent, name, -1, std::vector<File>{}); } - virtual void doPopulate(std::shared_ptr<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& entries) const override { + virtual bool doPopulate(std::shared_ptr<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& entries) const override { // Sort by name: std::sort(std::begin(m_Files), std::end(m_Files), @@ -200,7 +188,7 @@ protected: // If it is not a directory, then it is a file in directly under this tree: if (!std::get<1>(p)) { entries.push_back( - std::make_shared<ArchiveFileEntry>(parent, currentName, std::get<2>(p), QDateTime())); + std::make_shared<ArchiveFileEntry>(parent, currentName, std::get<2>(p))); currentName = ""; } else { @@ -219,6 +207,9 @@ protected: if (currentName != "") { entries.push_back(std::make_shared<ArchiveFileTreeImpl>(parent, currentName, currentIndex, std::move(currentFiles))); } + + // Let the parent class sort the entries: + return false; } virtual std::shared_ptr<IFileTree> doClone() const override { diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index d4e6a444..62a97591 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -34,7 +34,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "selectiondialog.h" #include "modinfo.h" #include <scopeguard.h> -#include <installationtester.h> #include <utility.h> #include <scopeguard.h> diff --git a/src/modinfo.cpp b/src/modinfo.cpp index 7f888bdc..379fa071 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -97,11 +97,12 @@ ModInfo::Ptr ModInfo::createFromPlugin(const QString &modName, const QString &espName, const QStringList &bsaNames, ModInfo::EModType modType, + const MOBase::IPluginGame* game, DirectoryEntry **directoryStructure, PluginContainer *pluginContainer) { QMutexLocker locker(&s_Mutex); ModInfo::Ptr result = ModInfo::Ptr( - new ModInfoForeign(modName, espName, bsaNames, modType, directoryStructure, pluginContainer)); + new ModInfoForeign(modName, espName, bsaNames, modType, game, directoryStructure, pluginContainer)); s_Collection.push_back(result); return result; } @@ -128,11 +129,12 @@ QString ModInfo::getContentTypeName(int contentType) } void ModInfo::createFromOverwrite(PluginContainer *pluginContainer, + const MOBase::IPluginGame* game, MOShared::DirectoryEntry **directoryStructure) { QMutexLocker locker(&s_Mutex); - s_Collection.push_back(ModInfo::Ptr(new ModInfoOverwrite(pluginContainer, directoryStructure))); + s_Collection.push_back(ModInfo::Ptr(new ModInfoOverwrite(pluginContainer, game, directoryStructure))); } unsigned int ModInfo::getNumMods() @@ -274,12 +276,13 @@ void ModInfo::updateFromDisc(const QString &modDirectory, unmanaged->referenceFile(modName).absoluteFilePath(), unmanaged->secondaryFiles(modName), modType, + game, directoryStructure, pluginContainer); } } - createFromOverwrite(pluginContainer, directoryStructure); + createFromOverwrite(pluginContainer, game, directoryStructure); std::sort(s_Collection.begin(), s_Collection.end(), ModInfo::ByName); diff --git a/src/modinfo.h b/src/modinfo.h index 2c108378..f582cc32 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -232,7 +232,8 @@ public: * @param bsaNames names of archives * @return a new mod */ - static ModInfo::Ptr createFromPlugin(const QString &modName, const QString &espName, const QStringList &bsaNames, ModInfo::EModType modType, MOShared::DirectoryEntry **directoryStructure, PluginContainer *pluginContainer); + static ModInfo::Ptr createFromPlugin(const QString &modName, const QString &espName, const QStringList &bsaNames, ModInfo::EModType modType, + const MOBase::IPluginGame* game, MOShared::DirectoryEntry **directoryStructure, PluginContainer *pluginContainer); // whether the given name is used for separators // @@ -826,6 +827,7 @@ protected: private: static void createFromOverwrite(PluginContainer *pluginContainer, + const MOBase::IPluginGame* game, MOShared::DirectoryEntry **directoryStructure); protected: diff --git a/src/modinfoforeign.cpp b/src/modinfoforeign.cpp index e8f9548a..19413891 100644 --- a/src/modinfoforeign.cpp +++ b/src/modinfoforeign.cpp @@ -46,9 +46,10 @@ ModInfoForeign::ModInfoForeign(const QString &modName, const QString &referenceFile, const QStringList &archives, ModInfo::EModType modType, + const MOBase::IPluginGame* gamePlugin, DirectoryEntry **directoryStructure, PluginContainer *pluginContainer) - : ModInfoWithConflictInfo(pluginContainer, directoryStructure), + : ModInfoWithConflictInfo(pluginContainer, gamePlugin, directoryStructure), m_ReferenceFile(referenceFile), m_Archives(archives), m_ModType(modType) { m_CreationTime = QFileInfo(referenceFile).birthTime(); diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h index da2c865b..ae4241ee 100644 --- a/src/modinfoforeign.h +++ b/src/modinfoforeign.h @@ -71,6 +71,7 @@ public: protected: ModInfoForeign(const QString &modName, const QString &referenceFile, const QStringList &archives, ModInfo::EModType modType, + const MOBase::IPluginGame *gamePlugin, MOShared::DirectoryEntry **directoryStructure, PluginContainer *pluginContainer); private: diff --git a/src/modinfooverwrite.cpp b/src/modinfooverwrite.cpp index 1f7f9318..3b914134 100644 --- a/src/modinfooverwrite.cpp +++ b/src/modinfooverwrite.cpp @@ -6,8 +6,8 @@ #include <QApplication> #include <QDirIterator> -ModInfoOverwrite::ModInfoOverwrite(PluginContainer *pluginContainer, MOShared::DirectoryEntry **directoryStructure) - : ModInfoWithConflictInfo(pluginContainer, directoryStructure) +ModInfoOverwrite::ModInfoOverwrite(PluginContainer *pluginContainer, const MOBase::IPluginGame *game, MOShared::DirectoryEntry **directoryStructure) + : ModInfoWithConflictInfo(pluginContainer, game, directoryStructure) { testValid(); } diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h index 0bcf6f27..9770ecbb 100644 --- a/src/modinfooverwrite.h +++ b/src/modinfooverwrite.h @@ -68,7 +68,7 @@ public: virtual void addInstalledFile(int, int) override {} private: - ModInfoOverwrite(PluginContainer *pluginContainer, MOShared::DirectoryEntry **directoryStructure ); + ModInfoOverwrite(PluginContainer *pluginContainer, const MOBase::IPluginGame* game, MOShared::DirectoryEntry **directoryStructure); }; diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index a1ef5701..d89716da 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -25,11 +25,10 @@ namespace { } ModInfoRegular::ModInfoRegular(PluginContainer *pluginContainer, const IPluginGame *game, const QDir &path, DirectoryEntry **directoryStructure) - : ModInfoWithConflictInfo(pluginContainer, directoryStructure) + : ModInfoWithConflictInfo(pluginContainer, game, directoryStructure) , m_Name(path.dirName()) , m_Path(path.absolutePath()) , m_Repository() - , m_GamePlugin(game) , m_GameName(game->gameShortName()) , m_IsAlternate(false) , m_Converted(false) diff --git a/src/modinforegular.h b/src/modinforegular.h index 75b24a6b..0f22b6cb 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -432,9 +432,6 @@ private: QString m_CustomURL; bool m_HasCustomURL; - // Current game plugin running in MO2: - MOBase::IPluginGame const* m_GamePlugin; - // Game name for the mod, can be different from the actual game running in MO2 // e.g., for Skyrim / Skyrim SE. QString m_GameName; diff --git a/src/modinfoseparator.h b/src/modinfoseparator.h index 80734bcf..4cfb9ea0 100644 --- a/src/modinfoseparator.h +++ b/src/modinfoseparator.h @@ -53,10 +53,10 @@ protected: private: - ModInfoSeparator - ( - PluginContainer* pluginContainer, const MOBase::IPluginGame* game, const QDir& path, - MOShared::DirectoryEntry** directoryStructure); + ModInfoSeparator( + PluginContainer* pluginContainer, + const MOBase::IPluginGame* game, const QDir& path, + MOShared::DirectoryEntry** directoryStructure); }; #endif diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp index d0516d06..0c67b4f7 100644 --- a/src/modinfowithconflictinfo.cpp +++ b/src/modinfowithconflictinfo.cpp @@ -1,17 +1,20 @@ #include "modinfowithconflictinfo.h" -#include "installationtester.h" #include "utility.h" #include "shared/directoryentry.h" #include "shared/filesorigin.h" #include "shared/fileentry.h" #include <filesystem> +#include "moddatachecker.h" +#include "qdirfiletree.h" + using namespace MOBase; using namespace MOShared; namespace fs = std::filesystem; -ModInfoWithConflictInfo::ModInfoWithConflictInfo(PluginContainer *pluginContainer, DirectoryEntry **directoryStructure) - : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false), m_HasHiddenFiles(false) {} +ModInfoWithConflictInfo::ModInfoWithConflictInfo( + PluginContainer *pluginContainer, const MOBase::IPluginGame* gamePlugin, DirectoryEntry **directoryStructure) + : ModInfo(pluginContainer), m_GamePlugin(gamePlugin), m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false), m_HasHiddenFiles(false) {} void ModInfoWithConflictInfo::clearCaches() { @@ -295,30 +298,12 @@ bool ModInfoWithConflictInfo::hasHiddenFiles() const bool ModInfoWithConflictInfo::doTestValid() const { + auto mdc = m_GamePlugin->feature<ModDataChecker>(); - bool valid = false; - QDirIterator dirIter(absolutePath()); - while (dirIter.hasNext()) { - dirIter.next(); - if (dirIter.fileInfo().isDir()) { - if (InstallationTester::isTopLevelDirectory(dirIter.fileName())) { - valid = true; - break; - } - } - else { - if (InstallationTester::isTopLevelSuffix(dirIter.fileName())) { - valid = true; - break; - } - } - } - - // NOTE: in Qt 4.7 it seems that QDirIterator leaves a file handle open if it is not iterated to the - // end - while (dirIter.hasNext()) { - dirIter.next(); + if (mdc) { + auto qdirfiletree = QDirFileTree::makeTree(absolutePath()); + return mdc->dataLooksValid(qdirfiletree); } - return valid; + return true; } diff --git a/src/modinfowithconflictinfo.h b/src/modinfowithconflictinfo.h index 0bb7c422..94a61c62 100644 --- a/src/modinfowithconflictinfo.h +++ b/src/modinfowithconflictinfo.h @@ -10,8 +10,6 @@ class ModInfoWithConflictInfo : public ModInfo public: - ModInfoWithConflictInfo(PluginContainer *pluginContainer, MOShared::DirectoryEntry **directoryStructure); - std::vector<ModInfo::EConflictFlag> getConflictFlags() const override; virtual std::vector<ModInfo::EFlag> getFlags() const override; @@ -43,6 +41,11 @@ protected: **/ virtual bool doTestValid() const; + ModInfoWithConflictInfo( + PluginContainer* pluginContainer, + const MOBase::IPluginGame* gamePlugin, + MOShared::DirectoryEntry** directoryStructure); + private: enum EConflictType { @@ -80,6 +83,9 @@ private: private: + // Current game plugin running in MO2: + MOBase::IPluginGame const* m_GamePlugin; + MOShared::DirectoryEntry **m_DirectoryStructure; mutable EConflictType m_CurrentConflictState; diff --git a/src/modlist.cpp b/src/modlist.cpp index 9fbd3de4..ea4aa2e3 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -20,7 +20,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "modlist.h" #include "messagedialog.h" -#include "installationtester.h" #include "qtgroupingproxy.h" #include "viewmarkingscrollbar.h" #include "modlistsortproxy.h" diff --git a/src/organizercore.cpp b/src/organizercore.cpp index a6d6e34f..feab76a7 100644 --- a/src/organizercore.cpp +++ b/src/organizercore.cpp @@ -834,10 +834,8 @@ QStringList OrganizerCore::listDirectories(const QString &directoryName) const if (!directoryName.isEmpty()) dir = dir->findSubDirectoryRecursive(ToWString(directoryName)); if (dir != nullptr) { - std::vector<DirectoryEntry *>::iterator current, end; - dir->getSubDirectories(current, end); - for (; current != end; ++current) { - result.append(ToQString((*current)->getName())); + for (const auto& d : dir->getSubDirectories()) { + result.append(ToQString(d->getName())); } } return result; @@ -1926,14 +1924,12 @@ std::vector<Mapping> OrganizerCore::fileMapping( } // recurse into subdirectories - std::vector<DirectoryEntry *>::const_iterator current, end; - directoryEntry->getSubDirectories(current, end); - for (; current != end; ++current) { - int origin = (*current)->anyOrigin(); + for (const auto& d : directoryEntry->getSubDirectories()) { + int origin = d->anyOrigin(); QString originPath = QString::fromStdWString(base->getOriginByID(origin).getPath()); - QString dirName = QString::fromStdWString((*current)->getName()); + QString dirName = QString::fromStdWString(d->getName()); QString source = originPath + relPath + dirName; QString target = dataPath + relPath + dirName; @@ -1942,7 +1938,7 @@ std::vector<Mapping> OrganizerCore::fileMapping( result.push_back({source, target, true, writeDestination}); std::vector<Mapping> subRes = fileMapping( - dataPath, relPath + dirName + "\\", base, *current, createDestination); + dataPath, relPath + dirName + "\\", base, d, createDestination); result.insert(result.end(), subRes.begin(), subRes.end()); } return result; diff --git a/src/qdirfiletree.cpp b/src/qdirfiletree.cpp new file mode 100644 index 00000000..770a9df8 --- /dev/null +++ b/src/qdirfiletree.cpp @@ -0,0 +1,57 @@ +#include "qdirfiletree.h" + +#include <QDirIterator> + +using namespace MOBase; + +class QDirFileTreeImpl : public QDirFileTree { +public: + + + /** + * + */ + QDirFileTreeImpl(std::shared_ptr<const IFileTree> parent, QDir dir) : + FileTreeEntry(parent, dir.dirName()), QDirFileTree(), qDir(dir) { } + +protected: + + /** + * No mutable operations allowed. + */ + bool beforeReplace(IFileTree const* dstTree, FileTreeEntry const* destination, FileTreeEntry const* source) override { return false; } + bool beforeInsert(IFileTree const* entry, FileTreeEntry const* name) override { return false; } + bool beforeRemove(IFileTree const* entry, FileTreeEntry const* name) override { return false; } + std::shared_ptr<FileTreeEntry> makeFile(std::shared_ptr<const IFileTree> parent, QString name) const override { return nullptr; } + std::shared_ptr<IFileTree> makeDirectory(std::shared_ptr<const IFileTree> parent, QString name) const override { return nullptr; } + + bool doPopulate(std::shared_ptr<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& entries) const override { + auto infoList = qDir.entryInfoList(qDir.filter() | QDir::NoDotAndDotDot, QDir::Name | QDir::DirsFirst | QDir::IgnoreCase); + for (auto& info : infoList) { + if (info.isDir()) { + entries.push_back(std::make_shared<QDirFileTreeImpl>(parent, QDir(info.absoluteFilePath()))); + } + else { + entries.push_back(createFileEntry(parent, info.fileName())); + } + } + + // Vector is already sorted: + return true; + } + + std::shared_ptr<IFileTree> QDirFileTree::doClone() const { + return std::make_shared<QDirFileTreeImpl>(nullptr, qDir); + } + +private: + QDir qDir; + +}; + +/** + * + */ +std::shared_ptr<const QDirFileTree> QDirFileTree::makeTree(QDir directory) { + return std::make_shared<QDirFileTreeImpl>(nullptr, directory); +} diff --git a/src/qdirfiletree.h b/src/qdirfiletree.h new file mode 100644 index 00000000..219a3a6f --- /dev/null +++ b/src/qdirfiletree.h @@ -0,0 +1,56 @@ +/* +Copyright (C) MO2 Team. All rights reserved. + +This file is part of Mod Organizer. + +Mod Organizer is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +Mod Organizer is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef ARCHIVEFILENETRY_H +#define ARCHIVEFILENTRY_H + +#include <QDir> + +#include "ifiletree.h" + + +/** + * @brief Class that expose a directory on the drive, using QDir, as a `MOBase::IFileTree`. + * + * The tree is lazily populated: each subtree is only populated (from the disk) when needed, + * as specified by IFileTree. + * + * This class does not expose mutable operations, so any mutable operations will + * fail. + */ +class QDirFileTree : public MOBase::IFileTree { +public: + + /** + * @brief Create a new file tree representing the given directory. + * + * @param directory Directory to represent. + * + * @return a file tree representing the given directory. + */ + static std::shared_ptr<const QDirFileTree> makeTree(QDir directory); + +protected: + + using IFileTree::IFileTree; + + virtual bool doPopulate(std::shared_ptr<const IFileTree> parent, std::vector<std::shared_ptr<FileTreeEntry>>& entries) const = 0; +}; + +#endif diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp index 43408dcf..c4b467d6 100644 --- a/src/shared/directoryentry.cpp +++ b/src/shared/directoryentry.cpp @@ -67,7 +67,8 @@ static bool SupportOptimizedFind() return (::VerifyVersionInfo(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, mask) == TRUE);
}
-static bool DirCompareByName(const DirectoryEntry* lhs, const DirectoryEntry* rhs)
+bool DirCompareByName::operator()(
+ const DirectoryEntry* lhs, const DirectoryEntry* rhs) const
{
return _wcsicmp(lhs->getName().c_str(), rhs->getName().c_str()) < 0;
}
@@ -156,13 +157,6 @@ void DirectoryEntry::addDir( }
});
- elapsed(stats.sortTimes, [&]{
- std::sort(
- m_SubDirectories.begin(),
- m_SubDirectories.end(),
- &DirCompareByName);
- });
-
m_Populated = true;
}
@@ -647,15 +641,6 @@ void DirectoryEntry::addFiles( onFile((Context*)pcx, path, ft);
}
);
-
- {
- std::scoped_lock lock(m_SubDirMutex);
-
- std::sort(
- m_SubDirectories.begin(),
- m_SubDirectories.end(),
- &DirCompareByName);
- }
}
void DirectoryEntry::onDirectoryStart(Context* cx, std::wstring_view path)
@@ -671,17 +656,6 @@ void DirectoryEntry::onDirectoryStart(Context* cx, std::wstring_view path) void DirectoryEntry::onDirectoryEnd(Context* cx, std::wstring_view path)
{
elapsed(cx->stats.dirTimes, [&] {
- auto* current = cx->current.top();
-
- {
- std::scoped_lock lock(current->m_SubDirMutex);
-
- std::sort(
- current->m_SubDirectories.begin(),
- current->m_SubDirectories.end(),
- &DirCompareByName);
- }
-
cx->current.pop();
});
}
@@ -842,7 +816,7 @@ void DirectoryEntry::removeDirRecursive() void DirectoryEntry::addDirectoryToList(DirectoryEntry* e, std::wstring nameLc)
{
- m_SubDirectories.push_back(e);
+ m_SubDirectories.insert(e);
m_SubDirectoriesLookup.emplace(std::move(nameLc), e);
}
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h index a28ceeae..0ee3c919 100644 --- a/src/shared/directoryentry.h +++ b/src/shared/directoryentry.h @@ -46,10 +46,18 @@ namespace std namespace MOShared
{
+struct DirCompareByName
+{
+ bool operator()(const DirectoryEntry* a, const DirectoryEntry* b) const;
+};
+
+
class DirectoryEntry
{
public:
- DirectoryEntry(
+ using SubDirectories = std::set<DirectoryEntry*, DirCompareByName>;
+
+ DirectoryEntry(
std::wstring name, DirectoryEntry* parent, OriginID originID);
DirectoryEntry(
@@ -137,15 +145,7 @@ public: std::vector<FileEntryPtr> getFiles() const;
- void getSubDirectories(
- std::vector<DirectoryEntry*>::const_iterator& begin,
- std::vector<DirectoryEntry*>::const_iterator& end) const
- {
- begin = m_SubDirectories.begin();
- end = m_SubDirectories.end();
- }
-
- const std::vector<DirectoryEntry*>& getSubDirectories() const
+ const SubDirectories& getSubDirectories() const
{
return m_SubDirectories;
}
@@ -238,7 +238,6 @@ public: private:
using FilesMap = std::map<std::wstring, FileIndex>;
using FilesLookup = std::unordered_map<DirectoryEntryFileKey, FileIndex>;
- using SubDirectories = std::vector<DirectoryEntry*>;
using SubDirectoriesLookup = std::unordered_map<std::wstring, DirectoryEntry*>;
boost::shared_ptr<FileRegister> m_FileRegister;
diff --git a/src/version.rc b/src/version.rc index b845233d..b0969b89 100644 --- a/src/version.rc +++ b/src/version.rc @@ -4,7 +4,7 @@ // Otherwise, if letters are used in VER_FILEVERSION_STR, uses the full MOBase::VersionInfo parser // Otherwise, uses the numbers from VER_FILEVERSION and sets the release type as pre-alpha #define VER_FILEVERSION 2,3,0 -#define VER_FILEVERSION_STR "2.3.0alpha8\0" +#define VER_FILEVERSION_STR "2.3.0alpha9\0" VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION @@ -24,7 +24,7 @@ BEGIN VALUE "FileDescription", "Mod Organizer 2 GUI\0" VALUE "OriginalFilename", "ModOrganizer.exe\0" VALUE "InternalName", "ModOrganizer2\0" - VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2019 Mod Organizer 2 contributors\0" + VALUE "LegalCopyright", "Copyright 2011-2016 Sebastian Herbord\r\nCopyright 2016-2020 Mod Organizer 2 contributors\0" VALUE "ProductName", "Mod Organizer 2\0" VALUE "ProductVersion", VER_FILEVERSION_STR END |
