From 0eb1662a0eaf8eee680cab5b913fff3fcc9b8b2f Mon Sep 17 00:00:00 2001 From: Tannin Date: Mon, 5 May 2014 18:24:15 +0200 Subject: - 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 --- src/shared/directoryentry.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'src/shared/directoryentry.cpp') 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 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, boost::shared_ptr 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()); } -- cgit v1.3.1