summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/directoryentry.cpp29
-rw-r--r--src/shared/directoryentry.h7
-rw-r--r--src/shared/error_report.cpp4
-rw-r--r--src/shared/gameinfo.cpp8
-rw-r--r--src/shared/gameinfo.h1
-rw-r--r--src/shared/skyriminfo.cpp2
6 files changed, 37 insertions, 14 deletions
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp
index a232ea19..6311ba25 100644
--- a/src/shared/directoryentry.cpp
+++ b/src/shared/directoryentry.cpp
@@ -235,6 +235,9 @@ std::vector<FileEntry::Ptr> FilesOrigin::getFiles() const
void FileEntry::addOrigin(int origin, FILETIME fileTime, const std::wstring &archive)
{
+ if (m_Parent != NULL) {
+ m_Parent->propagateOrigin(origin);
+ }
if (m_Origin == -1) {
m_Origin = origin;
m_FileTime = fileTime;
@@ -385,29 +388,25 @@ std::wstring FileEntry::getRelativePath() const
//
DirectoryEntry::DirectoryEntry(const std::wstring &name, DirectoryEntry *parent, int originID)
: m_OriginConnection(new OriginConnection),
- m_Name(name), m_Parent(parent), m_Populated(false), m_Origin(originID), m_TopLevel(true)
+ m_Name(name), m_Parent(parent), m_Populated(false), m_TopLevel(true)
{
m_FileRegister.reset(new FileRegister(m_OriginConnection));
+ m_Origins.insert(originID);
LEAK_TRACE;
}
DirectoryEntry::DirectoryEntry(const std::wstring &name, DirectoryEntry *parent, int originID,
boost::shared_ptr<FileRegister> fileRegister, boost::shared_ptr<OriginConnection> originConnection)
: m_FileRegister(fileRegister), m_OriginConnection(originConnection),
- m_Name(name), m_Parent(parent), m_Populated(false), m_Origin(originID), m_TopLevel(false)
+ m_Name(name), m_Parent(parent), m_Populated(false), m_TopLevel(false)
{
LEAK_TRACE;
+ m_Origins.insert(originID);
}
DirectoryEntry::~DirectoryEntry()
{
-/* if (m_TopLevel) {
- if (m_FileRegister.use_count() > 1) {
-log("this should not happen");
- delete m_FileRegister.get();
- }
- }*/
LEAK_UNTRACE;
clear();
}
@@ -479,6 +478,14 @@ void DirectoryEntry::addFromBSA(const std::wstring &originName, std::wstring &di
m_Populated = true;
}
+void DirectoryEntry::propagateOrigin(int origin)
+{
+ m_Origins.insert(origin);
+ if (m_Parent != NULL) {
+ m_Parent->propagateOrigin(origin);
+ }
+}
+
static bool SupportOptimizedFind()
{
@@ -603,6 +610,10 @@ void DirectoryEntry::removeDir(const std::wstring &path)
}
}
+bool DirectoryEntry::hasContentsFromOrigin(int originID) const
+{
+ return m_Origins.find(originID) != m_Origins.end();
+}
void DirectoryEntry::insertFile(const std::wstring &filePath, FilesOrigin &origin, FILETIME fileTime)
{
@@ -656,7 +667,7 @@ int DirectoryEntry::anyOrigin() const
return res;
}
}
- return m_Origin;
+ return *(m_Origins.begin());
}
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h
index 15af5e9e..f691603f 100644
--- a/src/shared/directoryentry.h
+++ b/src/shared/directoryentry.h
@@ -213,6 +213,8 @@ public:
void addFromOrigin(const std::wstring &originName, const std::wstring &directory, int priority);
void addFromBSA(const std::wstring &originName, std::wstring &directory, const std::wstring &fileName, int priority);
+ void propagateOrigin(int origin);
+
const std::wstring &getName() const;
boost::shared_ptr<FileRegister> getFileRegister() { return m_FileRegister; }
@@ -269,6 +271,8 @@ public:
}
}
+ bool hasContentsFromOrigin(int originID) const;
+
private:
DirectoryEntry(const DirectoryEntry &reference);
@@ -281,6 +285,7 @@ private:
file = m_FileRegister->getFile(iter->second);
} else {
file = m_FileRegister->createFile(fileName, this);
+ // TODO this has been observed to cause a crash, no clue why
m_Files[fileName] = file->getIndex();
}
file->addOrigin(origin.getID(), fileTime, archive);
@@ -318,7 +323,7 @@ private:
std::vector<DirectoryEntry*> m_SubDirectories;
DirectoryEntry *m_Parent;
- int m_Origin;
+ std::set<int> m_Origins;
bool m_Populated;
diff --git a/src/shared/error_report.cpp b/src/shared/error_report.cpp
index c1b25229..02ff2d56 100644
--- a/src/shared/error_report.cpp
+++ b/src/shared/error_report.cpp
@@ -36,7 +36,6 @@ void reportError(LPCSTR format, ...)
va_end(argList);
MessageBoxA(NULL, buffer, "Error", MB_OK | MB_ICONERROR);
- LocalFree(buffer);
}
void reportError(LPCWSTR format, ...)
@@ -52,7 +51,6 @@ void reportError(LPCWSTR format, ...)
va_end(argList);
MessageBoxW(NULL, buffer, L"Error", MB_OK | MB_ICONERROR);
- LocalFree(buffer);
}
@@ -99,4 +97,4 @@ std::wstring getCurrentErrorStringW()
return result;
}
}
-} // namespace MOShared
+} // namespace MOShared
diff --git a/src/shared/gameinfo.cpp b/src/shared/gameinfo.cpp
index 00bb42fd..b580a226 100644
--- a/src/shared/gameinfo.cpp
+++ b/src/shared/gameinfo.cpp
@@ -172,6 +172,14 @@ std::wstring GameInfo::getLogDir() const
}
+std::wstring GameInfo::getLootDir() const
+{
+ std::wostringstream temp;
+ temp << m_OrganizerDirectory << "\\loot";
+ return temp.str();
+}
+
+
std::wstring GameInfo::getTutorialDir() const
{
std::wostringstream temp;
diff --git a/src/shared/gameinfo.h b/src/shared/gameinfo.h
index 10775e6c..89c9402d 100644
--- a/src/shared/gameinfo.h
+++ b/src/shared/gameinfo.h
@@ -113,6 +113,7 @@ public:
virtual std::wstring getCacheDir() const;
virtual std::wstring getOverwriteDir() const;
virtual std::wstring getLogDir() const;
+ virtual std::wstring getLootDir() const;
virtual std::wstring getTutorialDir() const;
virtual bool requiresBSAInvalidation() const { return true; }
diff --git a/src/shared/skyriminfo.cpp b/src/shared/skyriminfo.cpp
index 1620bcc3..bf7500e6 100644
--- a/src/shared/skyriminfo.cpp
+++ b/src/shared/skyriminfo.cpp
@@ -106,7 +106,7 @@ GameInfo::LoadOrderMechanism SkyrimInfo::getLoadOrderMechanism() const
return TYPE_FILETIME;
}
} catch (const std::exception &e) {
- reportError("TESV.exe is invalid: %s", e.what());
+ log("TESV.exe is invalid: %s", e.what());
return TYPE_FILETIME;
}
}