summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2014-05-05 18:24:15 +0200
committerTannin <devnull@localhost>2014-05-05 18:24:15 +0200
commit0eb1662a0eaf8eee680cab5b913fff3fcc9b8b2f (patch)
tree4cccf64266f73d9acabc15e517abd510da79b582 /src/shared
parent164ec25a75a9d5b5fcbafbe321935ba37fe0885c (diff)
- very effective optimization to findfirstfile-calls
- several configuration files are now only saved to disk if the content actually changed. This should also get rid of a problem where plugins.txt was re-written immediately after starting the game (causing a conflict with the game) - reduced "noise" from hook.dll - removed some debugging messages
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/directoryentry.cpp29
-rw-r--r--src/shared/directoryentry.h6
2 files changed, 25 insertions, 10 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 b298cdd9..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);
@@ -319,7 +323,7 @@ private:
std::vector<DirectoryEntry*> m_SubDirectories;
DirectoryEntry *m_Parent;
- int m_Origin;
+ std::set<int> m_Origins;
bool m_Populated;