summaryrefslogtreecommitdiff
path: root/src/modinfowithconflictinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modinfowithconflictinfo.cpp')
-rw-r--r--src/modinfowithconflictinfo.cpp170
1 files changed, 96 insertions, 74 deletions
diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp
index 7cdee6e6..8d496391 100644
--- a/src/modinfowithconflictinfo.cpp
+++ b/src/modinfowithconflictinfo.cpp
@@ -1,25 +1,33 @@
#include "modinfowithconflictinfo.h"
-#include "utility.h"
#include "shared/directoryentry.h"
-#include "shared/filesorigin.h"
#include "shared/fileentry.h"
+#include "shared/filesorigin.h"
+#include "utility.h"
#include <filesystem>
-#include "organizercore.h"
#include "iplugingame.h"
#include "moddatachecker.h"
+#include "organizercore.h"
#include "qdirfiletree.h"
using namespace MOBase;
using namespace MOShared;
namespace fs = std::filesystem;
-ModInfoWithConflictInfo::ModInfoWithConflictInfo(OrganizerCore& core) :
- ModInfo(core),
- m_FileTree([this]() { return QDirFileTree::makeTree(absolutePath()); }),
- m_Valid([this]() { return doIsValid(); }),
- m_Contents([this]() { return doGetContents(); }),
- m_Conflicts([this]() { return doConflictCheck(); }) { }
+ModInfoWithConflictInfo::ModInfoWithConflictInfo(OrganizerCore& core)
+ : ModInfo(core), m_FileTree([this]() {
+ return QDirFileTree::makeTree(absolutePath());
+ }),
+ m_Valid([this]() {
+ return doIsValid();
+ }),
+ m_Contents([this]() {
+ return doGetContents();
+ }),
+ m_Conflicts([this]() {
+ return doConflictCheck();
+ })
+{}
void ModInfoWithConflictInfo::clearCaches()
{
@@ -39,66 +47,68 @@ std::vector<ModInfo::EConflictFlag> ModInfoWithConflictInfo::getConflictFlags()
{
std::vector<ModInfo::EConflictFlag> result;
switch (isConflicted()) {
- case CONFLICT_MIXED: {
- result.push_back(ModInfo::FLAG_CONFLICT_MIXED);
- } break;
- case CONFLICT_OVERWRITE: {
- result.push_back(ModInfo::FLAG_CONFLICT_OVERWRITE);
- } break;
- case CONFLICT_OVERWRITTEN: {
- result.push_back(ModInfo::FLAG_CONFLICT_OVERWRITTEN);
- } break;
- case CONFLICT_REDUNDANT: {
- result.push_back(ModInfo::FLAG_CONFLICT_REDUNDANT);
- } break;
- default: { /* NOP */ }
+ case CONFLICT_MIXED: {
+ result.push_back(ModInfo::FLAG_CONFLICT_MIXED);
+ } break;
+ case CONFLICT_OVERWRITE: {
+ result.push_back(ModInfo::FLAG_CONFLICT_OVERWRITE);
+ } break;
+ case CONFLICT_OVERWRITTEN: {
+ result.push_back(ModInfo::FLAG_CONFLICT_OVERWRITTEN);
+ } break;
+ case CONFLICT_REDUNDANT: {
+ result.push_back(ModInfo::FLAG_CONFLICT_REDUNDANT);
+ } break;
+ default: { /* NOP */
+ }
}
switch (isLooseArchiveConflicted()) {
- case CONFLICT_MIXED: {
- result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
- result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN);
- } break;
- case CONFLICT_OVERWRITE: {
- result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
- } break;
- case CONFLICT_OVERWRITTEN: {
- result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN);
- } break;
- default: { /* NOP */ }
+ case CONFLICT_MIXED: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN);
+ } break;
+ case CONFLICT_OVERWRITE: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITE);
+ } break;
+ case CONFLICT_OVERWRITTEN: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_LOOSE_CONFLICT_OVERWRITTEN);
+ } break;
+ default: { /* NOP */
+ }
}
switch (isArchiveConflicted()) {
- case CONFLICT_MIXED: {
- result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED);
- } break;
- case CONFLICT_OVERWRITE: {
- result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITE);
- } break;
- case CONFLICT_OVERWRITTEN: {
- result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN);
- } break;
- default: { /* NOP */ }
+ case CONFLICT_MIXED: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_MIXED);
+ } break;
+ case CONFLICT_OVERWRITE: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITE);
+ } break;
+ case CONFLICT_OVERWRITTEN: {
+ result.push_back(ModInfo::FLAG_ARCHIVE_CONFLICT_OVERWRITTEN);
+ } break;
+ default: { /* NOP */
+ }
}
return result;
}
-
ModInfoWithConflictInfo::Conflicts ModInfoWithConflictInfo::doConflictCheck() const
{
Conflicts conflicts;
bool providesAnything = false;
- bool hasHiddenFiles = false;
+ bool hasHiddenFiles = false;
int dataID = 0;
if (m_Core.directoryStructure()->originExists(L"data")) {
dataID = m_Core.directoryStructure()->getOriginByName(L"data").getID();
}
- std::wstring name = ToWString(this->name());
+ std::wstring name = ToWString(this->name());
const std::wstring hideExt = ToWString(ModInfo::s_HiddenExt);
if (m_Core.directoryStructure()->originExists(name)) {
- FilesOrigin &origin = m_Core.directoryStructure()->getOriginByName(name);
+ FilesOrigin& origin = m_Core.directoryStructure()->getOriginByName(name);
std::vector<FileEntryPtr> files = origin.getFiles();
std::set<const DirectoryEntry*> checkedDirs;
@@ -111,8 +121,7 @@ ModInfoWithConflictInfo::Conflicts ModInfoWithConflictInfo::doConflictCheck() co
if (nameAsPath.extension().wstring().compare(hideExt) == 0) {
hasHiddenFiles = true;
- }
- else {
+ } else {
const DirectoryEntry* parent = file->getParent();
// iterate on all parent direEntries to check for .mohiddden
@@ -120,10 +129,10 @@ ModInfoWithConflictInfo::Conflicts ModInfoWithConflictInfo::doConflictCheck() co
auto insertResult = checkedDirs.insert(parent);
if (insertResult.second == false) {
- // if already present break as we can assume to have checked the parents as well
+ // if already present break as we can assume to have checked the parents
+ // as well
break;
- }
- else {
+ } else {
const fs::path dirPath(parent->getName());
if (dirPath.extension().wstring().compare(hideExt) == 0) {
hasHiddenFiles = true;
@@ -155,15 +164,15 @@ ModInfoWithConflictInfo::Conflicts ModInfoWithConflictInfo::doConflictCheck() co
// If this is not the origin then determine the correct overwrite
if (file->getOrigin() != origin.getID()) {
- FilesOrigin &altOrigin = m_Core.directoryStructure()->getOriginByID(file->getOrigin());
+ FilesOrigin& altOrigin =
+ m_Core.directoryStructure()->getOriginByID(file->getOrigin());
unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
if (!file->isFromArchive()) {
if (!archiveData.isValid())
conflicts.m_OverwrittenList.insert(altIndex);
else
conflicts.m_ArchiveLooseOverwrittenList.insert(altIndex);
- }
- else {
+ } else {
conflicts.m_ArchiveOverwrittenList.insert(altIndex);
}
} else {
@@ -172,8 +181,10 @@ ModInfoWithConflictInfo::Conflicts ModInfoWithConflictInfo::doConflictCheck() co
// Sort out the alternatives
for (const auto& altInfo : alternatives) {
- if ((altInfo.originID() != dataID) && (altInfo.originID() != origin.getID())) {
- FilesOrigin &altOrigin = m_Core.directoryStructure()->getOriginByID(altInfo.originID());
+ if ((altInfo.originID() != dataID) &&
+ (altInfo.originID() != origin.getID())) {
+ FilesOrigin& altOrigin =
+ m_Core.directoryStructure()->getOriginByID(altInfo.originID());
QString altOriginName = ToQString(altOrigin.getName());
unsigned int altIndex = ModInfo::getIndex(altOriginName);
if (!altInfo.isFromArchive()) {
@@ -205,21 +216,24 @@ ModInfoWithConflictInfo::Conflicts ModInfoWithConflictInfo::doConflictCheck() co
if (files.size() != 0) {
if (!providesAnything)
conflicts.m_CurrentConflictState = CONFLICT_REDUNDANT;
- else if (!conflicts.m_OverwriteList.empty() && !conflicts.m_OverwrittenList.empty())
+ else if (!conflicts.m_OverwriteList.empty() &&
+ !conflicts.m_OverwrittenList.empty())
conflicts.m_CurrentConflictState = CONFLICT_MIXED;
else if (!conflicts.m_OverwriteList.empty())
conflicts.m_CurrentConflictState = CONFLICT_OVERWRITE;
else if (!conflicts.m_OverwrittenList.empty())
conflicts.m_CurrentConflictState = CONFLICT_OVERWRITTEN;
- if (!conflicts.m_ArchiveOverwriteList.empty() && !conflicts.m_ArchiveOverwrittenList.empty())
+ if (!conflicts.m_ArchiveOverwriteList.empty() &&
+ !conflicts.m_ArchiveOverwrittenList.empty())
conflicts.m_ArchiveConflictState = CONFLICT_MIXED;
else if (!conflicts.m_ArchiveOverwriteList.empty())
conflicts.m_ArchiveConflictState = CONFLICT_OVERWRITE;
else if (!conflicts.m_ArchiveOverwrittenList.empty())
conflicts.m_ArchiveConflictState = CONFLICT_OVERWRITTEN;
- if (!conflicts.m_ArchiveLooseOverwrittenList.empty() && !conflicts.m_ArchiveLooseOverwriteList.empty())
+ if (!conflicts.m_ArchiveLooseOverwrittenList.empty() &&
+ !conflicts.m_ArchiveLooseOverwriteList.empty())
conflicts.m_ArchiveConflictLooseState = CONFLICT_MIXED;
else if (!conflicts.m_ArchiveLooseOverwrittenList.empty())
conflicts.m_ArchiveConflictLooseState = CONFLICT_OVERWRITTEN;
@@ -238,24 +252,25 @@ ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isConflicted() c
return m_Conflicts.value().m_CurrentConflictState;
}
-ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isArchiveConflicted() const
+ModInfoWithConflictInfo::EConflictType
+ModInfoWithConflictInfo::isArchiveConflicted() const
{
return m_Conflicts.value().m_ArchiveConflictState;
}
-ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isLooseArchiveConflicted() const
+ModInfoWithConflictInfo::EConflictType
+ModInfoWithConflictInfo::isLooseArchiveConflicted() const
{
return m_Conflicts.value().m_ArchiveConflictLooseState;
}
-
bool ModInfoWithConflictInfo::isRedundant() const
{
std::wstring name = ToWString(this->name());
if (m_Core.directoryStructure()->originExists(name)) {
- FilesOrigin &origin = m_Core.directoryStructure()->getOriginByName(name);
+ FilesOrigin& origin = m_Core.directoryStructure()->getOriginByName(name);
std::vector<FileEntryPtr> files = origin.getFiles();
- bool ignore = false;
+ bool ignore = false;
for (auto iter = files.begin(); iter != files.end(); ++iter) {
if ((*iter)->getOrigin(ignore) == origin.getID()) {
return false;
@@ -267,25 +282,27 @@ bool ModInfoWithConflictInfo::isRedundant() const
}
}
-
bool ModInfoWithConflictInfo::hasHiddenFiles() const
{
return m_Conflicts.value().m_HasHiddenFiles;
}
-void ModInfoWithConflictInfo::diskContentModified() {
+void ModInfoWithConflictInfo::diskContentModified()
+{
m_FileTree.invalidate();
m_Valid.invalidate();
m_Contents.invalidate();
}
-void ModInfoWithConflictInfo::prefetch() {
+void ModInfoWithConflictInfo::prefetch()
+{
// Populating the tree to 1-depth (IFileTree is lazy, so size() forces the
// tree to populate the first level):
fileTree()->size();
}
-bool ModInfoWithConflictInfo::doIsValid() const {
+bool ModInfoWithConflictInfo::doIsValid() const
+{
auto mdc = m_Core.managedGame()->feature<ModDataChecker>();
if (mdc) {
@@ -296,19 +313,24 @@ bool ModInfoWithConflictInfo::doIsValid() const {
return true;
}
-std::shared_ptr<const IFileTree> ModInfoWithConflictInfo::fileTree() const {
+std::shared_ptr<const IFileTree> ModInfoWithConflictInfo::fileTree() const
+{
return m_FileTree.value();
}
-bool ModInfoWithConflictInfo::isValid() const {
+bool ModInfoWithConflictInfo::isValid() const
+{
return m_Valid.value();
}
-const std::set<int>& ModInfoWithConflictInfo::getContents() const {
+const std::set<int>& ModInfoWithConflictInfo::getContents() const
+{
return m_Contents.value();
}
-bool ModInfoWithConflictInfo::hasContent(int content) const {
+bool ModInfoWithConflictInfo::hasContent(int content) const
+{
auto& contents = m_Contents.value();
- return std::find(std::begin(contents), std::end(contents), content) != std::end(contents);
+ return std::find(std::begin(contents), std::end(contents), content) !=
+ std::end(contents);
}