summaryrefslogtreecommitdiff
path: root/src/modinfowithconflictinfo.cpp
diff options
context:
space:
mode:
authorLostDragonist <lost.dragonist@gmail.com>2019-05-03 21:32:33 -0500
committerLostDragonist <lost.dragonist@gmail.com>2019-05-03 21:32:33 -0500
commit179a73857125ee604f42b0d5c2d765183c86d2c7 (patch)
treeb9b3f9d62bd5640de839d150a53ab8ef119dab9c /src/modinfowithconflictinfo.cpp
parente2b799bd6b5cfd51969fefd1dab5e5b1b7e5f81c (diff)
parent907c5468424b48774f5da2a6b5f96f26590987b0 (diff)
Merge pull request #695 from ModOrganizer2/Develop
Stage for Release 2.2.0
Diffstat (limited to 'src/modinfowithconflictinfo.cpp')
-rw-r--r--src/modinfowithconflictinfo.cpp121
1 files changed, 112 insertions, 9 deletions
diff --git a/src/modinfowithconflictinfo.cpp b/src/modinfowithconflictinfo.cpp
index e88ba29d..7a2b0071 100644
--- a/src/modinfowithconflictinfo.cpp
+++ b/src/modinfowithconflictinfo.cpp
@@ -7,7 +7,7 @@ using namespace MOBase;
using namespace MOShared;
ModInfoWithConflictInfo::ModInfoWithConflictInfo(PluginContainer *pluginContainer, DirectoryEntry **directoryStructure)
- : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure) {}
+ : ModInfo(pluginContainer), m_DirectoryStructure(directoryStructure), m_HasLooseOverwrite(false) {}
void ModInfoWithConflictInfo::clearCaches()
{
@@ -32,6 +32,31 @@ std::vector<ModInfo::EFlag> ModInfoWithConflictInfo::getFlags() const
} 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 */ }
+ }
+ 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 */ }
+ }
return result;
}
@@ -40,6 +65,10 @@ void ModInfoWithConflictInfo::doConflictCheck() const
{
m_OverwriteList.clear();
m_OverwrittenList.clear();
+ m_ArchiveOverwriteList.clear();
+ m_ArchiveOverwrittenList.clear();
+ m_ArchiveLooseOverwriteList.clear();
+ m_ArchiveLooseOverwrittenList.clear();
bool providesAnything = false;
@@ -51,34 +80,74 @@ void ModInfoWithConflictInfo::doConflictCheck() const
std::wstring name = ToWString(this->name());
m_CurrentConflictState = CONFLICT_NONE;
+ m_ArchiveConflictState = CONFLICT_NONE;
+ m_ArchiveConflictLooseState = CONFLICT_NONE;
if ((*m_DirectoryStructure)->originExists(name)) {
FilesOrigin &origin = (*m_DirectoryStructure)->getOriginByName(name);
std::vector<FileEntry::Ptr> files = origin.getFiles();
// for all files in this origin
for (FileEntry::Ptr file : files) {
- const std::vector<std::pair<int, std::wstring>> &alternatives = file->getAlternatives();
- if ((alternatives.size() == 0) || (alternatives.begin()->first == dataID)) {
+ auto alternatives = file->getAlternatives();
+ if ((alternatives.size() == 0) || (alternatives.back().first == dataID)) {
// no alternatives -> no conflict
providesAnything = true;
} else {
+ // Get the archive data for the current mod
+ bool found = file->getOrigin() == origin.getID();
+ std::pair<std::wstring, int> archiveData;
+ if (found)
+ archiveData = file->getArchive();
+ else {
+ for (auto alts : alternatives) {
+ if (alts.first == origin.getID()) {
+ archiveData = alts.second;
+ break;
+ }
+ }
+ }
+
+ // If this is not the origin then determine the correct overwrite
if (file->getOrigin() != origin.getID()) {
FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(file->getOrigin());
unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
- m_OverwrittenList.insert(altIndex);
+ if (file->getArchive().first.size() == 0)
+ if (archiveData.first.size() == 0)
+ m_OverwrittenList.insert(altIndex);
+ else
+ m_ArchiveLooseOverwrittenList.insert(altIndex);
+ else
+ m_ArchiveOverwrittenList.insert(altIndex);
} else {
providesAnything = true;
}
- // for all non-providing alternative origins
+ // Sort out the alternatives
for (auto altInfo : alternatives) {
if ((altInfo.first != dataID) && (altInfo.first != origin.getID())) {
FilesOrigin &altOrigin = (*m_DirectoryStructure)->getOriginByID(altInfo.first);
- unsigned int altIndex = ModInfo::getIndex(ToQString(altOrigin.getName()));
- if (origin.getPriority() > altOrigin.getPriority()) {
- m_OverwriteList.insert(altIndex);
+ QString altOriginName = ToQString(altOrigin.getName());
+ unsigned int altIndex = ModInfo::getIndex(altOriginName);
+ if (altInfo.second.first.size() == 0) {
+ if (archiveData.first.size() == 0) {
+ if (origin.getPriority() > altOrigin.getPriority()) {
+ m_OverwriteList.insert(altIndex);
+ } else {
+ m_OverwrittenList.insert(altIndex);
+ }
+ } else {
+ m_ArchiveLooseOverwrittenList.insert(altIndex);
+ }
} else {
- m_OverwrittenList.insert(altIndex);
+ if (archiveData.first.size() == 0) {
+ m_ArchiveLooseOverwriteList.insert(altIndex);
+ } else {
+ if (archiveData.second > altInfo.second.second) {
+ m_ArchiveOverwriteList.insert(altIndex);
+ } else if (archiveData.second < altInfo.second.second) {
+ m_ArchiveOverwrittenList.insert(altIndex);
+ }
+ }
}
}
}
@@ -95,6 +164,20 @@ void ModInfoWithConflictInfo::doConflictCheck() const
m_CurrentConflictState = CONFLICT_OVERWRITE;
else if (!m_OverwrittenList.empty())
m_CurrentConflictState = CONFLICT_OVERWRITTEN;
+
+ if (!m_ArchiveOverwriteList.empty() && !m_ArchiveOverwrittenList.empty())
+ m_ArchiveConflictState = CONFLICT_MIXED;
+ else if (!m_ArchiveOverwriteList.empty())
+ m_ArchiveConflictState = CONFLICT_OVERWRITE;
+ else if (!m_ArchiveOverwrittenList.empty())
+ m_ArchiveConflictState = CONFLICT_OVERWRITTEN;
+
+ if (!m_ArchiveLooseOverwrittenList.empty() && !m_ArchiveLooseOverwriteList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_MIXED;
+ else if (!m_ArchiveLooseOverwrittenList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_OVERWRITTEN;
+ else if (!m_ArchiveLooseOverwriteList.empty())
+ m_ArchiveConflictLooseState = CONFLICT_OVERWRITE;
}
}
}
@@ -110,6 +193,26 @@ ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isConflicted() c
return m_CurrentConflictState;
}
+ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isArchiveConflicted() const
+{
+ QTime now = QTime::currentTime();
+ if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) {
+ doConflictCheck();
+ }
+
+ return m_ArchiveConflictState;
+}
+
+ModInfoWithConflictInfo::EConflictType ModInfoWithConflictInfo::isLooseArchiveConflicted() const
+{
+ QTime now = QTime::currentTime();
+ if (m_LastConflictCheck.isNull() || (m_LastConflictCheck.secsTo(now) > 10)) {
+ doConflictCheck();
+ }
+
+ return m_ArchiveConflictLooseState;
+}
+
bool ModInfoWithConflictInfo::isRedundant() const
{