From 68a06297d94c0a2780b0bbb4070813f931cdfc24 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 13 May 2013 00:47:33 +0300 Subject: fix resource files unloading while switching servers. --- src/gui/updaterwindow.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++ src/gui/updaterwindow.h | 10 +++++++++ 2 files changed, 66 insertions(+) (limited to 'src/gui') diff --git a/src/gui/updaterwindow.cpp b/src/gui/updaterwindow.cpp index 197b97e3a..a29514994 100644 --- a/src/gui/updaterwindow.cpp +++ b/src/gui/updaterwindow.cpp @@ -594,6 +594,29 @@ void UpdaterWindow::loadLocalUpdates(const std::string &dir) loadManaPlusUpdates(dir, resman); } +void UpdaterWindow::unloadUpdates(const std::string &dir) +{ + const ResourceManager *const resman = ResourceManager::getInstance(); + + std::vector updateFiles + = loadXMLFile(std::string(dir).append("/").append(xmlUpdateFile)); + + if (updateFiles.empty()) + { + updateFiles = loadTxtFile(std::string(dir).append( + "/").append(txtUpdateFile)); + } + + std::string fixPath = dir + "/fix"; + for (unsigned int updateIndex = 0, sz = static_cast( + updateFiles.size()); updateIndex < sz; updateIndex ++) + { + UpdaterWindow::removeUpdateFile(resman, dir, fixPath, + updateFiles[updateIndex].name); + } + unloadManaPlusUpdates(dir, resman); +} + void UpdaterWindow::loadManaPlusUpdates(const std::string &dir, const ResourceManager *const resman) { @@ -615,6 +638,27 @@ void UpdaterWindow::loadManaPlusUpdates(const std::string &dir, } } +void UpdaterWindow::unloadManaPlusUpdates(const std::string &dir, + const ResourceManager *const resman) +{ + std::string fixPath = dir + "/fix"; + std::vector updateFiles + = loadXMLFile(std::string(fixPath).append("/").append(xmlUpdateFile)); + + for (unsigned int updateIndex = 0, sz = static_cast( + updateFiles.size()); updateIndex < sz; updateIndex ++) + { + std::string name = updateFiles[updateIndex].name; + if (strStartWith(name, "manaplus_")) + { + struct stat statbuf; + std::string file = std::string(fixPath).append("/").append(name); + if (!stat(file.c_str(), &statbuf)) + resman->removeFromSearchPath(file); + } + } +} + void UpdaterWindow::addUpdateFile(const ResourceManager *const resman, const std::string &path, const std::string &fixPath, @@ -634,6 +678,18 @@ void UpdaterWindow::addUpdateFile(const ResourceManager *const resman, resman->addToSearchPath(tmpPath, append); } +void UpdaterWindow::removeUpdateFile(const ResourceManager *const resman, + const std::string &path, + const std::string &fixPath, + const std::string &file) +{ + resman->removeFromSearchPath(std::string(path).append("/").append(file)); + const std::string fixFile = std::string(fixPath).append("/").append(file); + struct stat statbuf; + if (!stat(fixFile.c_str(), &statbuf)) + resman->removeFromSearchPath(fixFile); +} + void UpdaterWindow::logic() { BLOCK_START("UpdaterWindow::logic") diff --git a/src/gui/updaterwindow.h b/src/gui/updaterwindow.h index 1ee35195a..3cc8392e5 100644 --- a/src/gui/updaterwindow.h +++ b/src/gui/updaterwindow.h @@ -126,15 +126,25 @@ class UpdaterWindow final : public Window, static void loadLocalUpdates(const std::string &dir); + static void unloadUpdates(const std::string &dir); + static void addUpdateFile(const ResourceManager *const resman, const std::string &path, const std::string &fixPath, const std::string &file, const bool append); + static void removeUpdateFile(const ResourceManager *const resman, + const std::string &path, + const std::string &fixPath, + const std::string &file); + static void loadManaPlusUpdates(const std::string &dir, const ResourceManager *const resman); + static void unloadManaPlusUpdates(const std::string &dir, + const ResourceManager *const resman); + private: void download(); -- cgit v1.2.3-70-g09d2