summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/archivefiletree.cpp29
-rw-r--r--src/installationmanager.cpp1
-rw-r--r--src/modinfo.cpp9
-rw-r--r--src/modinfo.h4
-rw-r--r--src/modinfoforeign.cpp3
-rw-r--r--src/modinfoforeign.h1
-rw-r--r--src/modinfooverwrite.cpp4
-rw-r--r--src/modinfooverwrite.h2
-rw-r--r--src/modinforegular.cpp3
-rw-r--r--src/modinforegular.h3
-rw-r--r--src/modinfoseparator.h8
-rw-r--r--src/modinfowithconflictinfo.cpp37
-rw-r--r--src/modinfowithconflictinfo.h10
-rw-r--r--src/modlist.cpp1
-rw-r--r--src/organizercore.cpp16
-rw-r--r--src/qdirfiletree.cpp57
-rw-r--r--src/qdirfiletree.h56
-rw-r--r--src/shared/directoryentry.cpp32
-rw-r--r--src/shared/directoryentry.h21
-rw-r--r--src/version.rc4
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