Browse Source

Merge pull request #241 from vmarkovtsev/develop

Fix issue #2068 - maps list update
Alexander Shishkin 9 years ago
parent
commit
9f9e1cea17

+ 5 - 0
client/CPreGame.cpp

@@ -1103,6 +1103,10 @@ void SelectionTab::filter( int size, bool selectFirst )
 std::unordered_set<ResourceID> SelectionTab::getFiles(std::string dirURI, int resType)
 std::unordered_set<ResourceID> SelectionTab::getFiles(std::string dirURI, int resType)
 {
 {
 	boost::to_upper(dirURI);
 	boost::to_upper(dirURI);
+	CResourceHandler::get()->updateFilteredFiles([&](const std::string & mount)
+	{
+		return boost::algorithm::starts_with(mount, dirURI);
+	});
 
 
 	std::unordered_set<ResourceID> ret = CResourceHandler::get()->getFilteredFiles([&](const ResourceID & ident)
 	std::unordered_set<ResourceID> ret = CResourceHandler::get()->getFilteredFiles([&](const ResourceID & ident)
 	{
 	{
@@ -1115,6 +1119,7 @@ std::unordered_set<ResourceID> SelectionTab::getFiles(std::string dirURI, int re
 
 
 void SelectionTab::parseMaps(const std::unordered_set<ResourceID> &files)
 void SelectionTab::parseMaps(const std::unordered_set<ResourceID> &files)
 {
 {
+	logGlobal->debug("Parsing %d maps", files.size());
 	allItems.clear();
 	allItems.clear();
 	for(auto & file : files)
 	for(auto & file : files)
 	{
 	{

+ 1 - 1
client/CPreGame.h

@@ -153,7 +153,7 @@ class SelectionTab : public CIntObject
 private:
 private:
 	std::unique_ptr<CAnimation> formatIcons;
 	std::unique_ptr<CAnimation> formatIcons;
 
 
-    void parseMaps(const std::unordered_set<ResourceID> &files);
+	void parseMaps(const std::unordered_set<ResourceID> &files);
 	void parseGames(const std::unordered_set<ResourceID> &files, bool multi);
 	void parseGames(const std::unordered_set<ResourceID> &files, bool multi);
 	void parseCampaigns(const std::unordered_set<ResourceID> & files );
 	void parseCampaigns(const std::unordered_set<ResourceID> & files );
 	std::unordered_set<ResourceID> getFiles(std::string dirURI, int resType);
 	std::unordered_set<ResourceID> getFiles(std::string dirURI, int resType);

+ 6 - 0
lib/filesystem/AdapterLoaders.cpp

@@ -102,6 +102,12 @@ std::set<boost::filesystem::path> CFilesystemList::getResourceNames(const Resour
 	return std::move(paths);
 	return std::move(paths);
 }
 }
 
 
+void CFilesystemList::updateFilteredFiles(std::function<bool(const std::string &)> filter) const
+{
+	for (auto & loader : loaders)
+		loader->updateFilteredFiles(filter);
+}
+
 std::unordered_set<ResourceID> CFilesystemList::getFilteredFiles(std::function<bool(const ResourceID &)> filter) const
 std::unordered_set<ResourceID> CFilesystemList::getFilteredFiles(std::function<bool(const ResourceID &)> filter) const
 {
 {
 	std::unordered_set<ResourceID> ret;
 	std::unordered_set<ResourceID> ret;

+ 5 - 3
lib/filesystem/AdapterLoaders.h

@@ -41,6 +41,7 @@ public:
 	bool existsResource(const ResourceID & resourceName) const override;
 	bool existsResource(const ResourceID & resourceName) const override;
 	std::string getMountPoint() const override;
 	std::string getMountPoint() const override;
 	boost::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
 	boost::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
+	void updateFilteredFiles(std::function<bool(const std::string &)> filter) const override {}
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 
 
 private:
 private:
@@ -58,8 +59,8 @@ class DLL_LINKAGE CFilesystemList : public ISimpleResourceLoader
 	std::set<ISimpleResourceLoader *> writeableLoaders;
 	std::set<ISimpleResourceLoader *> writeableLoaders;
 
 
 	//FIXME: this is only compile fix, should be removed in the end
 	//FIXME: this is only compile fix, should be removed in the end
-	CFilesystemList(CFilesystemList &) = delete;
-	CFilesystemList &operator=(CFilesystemList &) = delete;
+	CFilesystemList(CFilesystemList &) = delete;
+	CFilesystemList &operator=(CFilesystemList &) = delete;
 
 
 public:
 public:
 	CFilesystemList();
 	CFilesystemList();
@@ -70,7 +71,8 @@ public:
 	bool existsResource(const ResourceID & resourceName) const override;
 	bool existsResource(const ResourceID & resourceName) const override;
 	std::string getMountPoint() const override;
 	std::string getMountPoint() const override;
 	boost::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
 	boost::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
-	std::set<boost::filesystem::path> getResourceNames(const ResourceID & resourceName) const override;
+	std::set<boost::filesystem::path> getResourceNames(const ResourceID & resourceName) const override;
+	void updateFilteredFiles(std::function<bool(const std::string &)> filter) const override;
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 	bool createResource(std::string filename, bool update = false) override;
 	bool createResource(std::string filename, bool update = false) override;
 	std::vector<const ISimpleResourceLoader *> getResourcesWithName(const ResourceID & resourceName) const override;
 	std::vector<const ISimpleResourceLoader *> getResourcesWithName(const ResourceID & resourceName) const override;

+ 1 - 0
lib/filesystem/CArchiveLoader.h

@@ -61,6 +61,7 @@ public:
 	std::unique_ptr<CInputStream> load(const ResourceID & resourceName) const override;
 	std::unique_ptr<CInputStream> load(const ResourceID & resourceName) const override;
 	bool existsResource(const ResourceID & resourceName) const override;
 	bool existsResource(const ResourceID & resourceName) const override;
 	std::string getMountPoint() const override;
 	std::string getMountPoint() const override;
+	void updateFilteredFiles(std::function<bool(const std::string &)> filter) const override {}
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 
 
 private:
 private:

+ 10 - 2
lib/filesystem/CFilesystemLoader.cpp

@@ -8,10 +8,10 @@ namespace bfs = boost::filesystem;
 
 
 CFilesystemLoader::CFilesystemLoader(std::string _mountPoint, bfs::path baseDirectory, size_t depth, bool initial):
 CFilesystemLoader::CFilesystemLoader(std::string _mountPoint, bfs::path baseDirectory, size_t depth, bool initial):
     baseDirectory(std::move(baseDirectory)),
     baseDirectory(std::move(baseDirectory)),
-	mountPoint(std::move(_mountPoint)),
+    mountPoint(std::move(_mountPoint)),
     fileList(listFiles(mountPoint, depth, initial))
     fileList(listFiles(mountPoint, depth, initial))
 {
 {
-	logGlobal->traceStream() << "Filesystem loaded, " << fileList.size() << " files found";
+	logGlobal->traceStream() << "File system loaded, " << fileList.size() << " files found";
 }
 }
 
 
 std::unique_ptr<CInputStream> CFilesystemLoader::load(const ResourceID & resourceName) const
 std::unique_ptr<CInputStream> CFilesystemLoader::load(const ResourceID & resourceName) const
@@ -38,6 +38,14 @@ boost::optional<boost::filesystem::path> CFilesystemLoader::getResourceName(cons
 	return baseDirectory / fileList.at(resourceName);
 	return baseDirectory / fileList.at(resourceName);
 }
 }
 
 
+void CFilesystemLoader::updateFilteredFiles(std::function<bool(const std::string &)> filter) const
+{
+	if (filter(mountPoint))
+	{
+		fileList = listFiles(mountPoint, 1, false);
+	}
+}
+
 std::unordered_set<ResourceID> CFilesystemLoader::getFilteredFiles(std::function<bool(const ResourceID &)> filter) const
 std::unordered_set<ResourceID> CFilesystemLoader::getFilteredFiles(std::function<bool(const ResourceID &)> filter) const
 {
 {
 	std::unordered_set<ResourceID> foundID;
 	std::unordered_set<ResourceID> foundID;

+ 2 - 1
lib/filesystem/CFilesystemLoader.h

@@ -38,6 +38,7 @@ public:
 	std::string getMountPoint() const override;
 	std::string getMountPoint() const override;
 	bool createResource(std::string filename, bool update = false) override;
 	bool createResource(std::string filename, bool update = false) override;
 	boost::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
 	boost::optional<boost::filesystem::path> getResourceName(const ResourceID & resourceName) const override;
+	void updateFilteredFiles(std::function<bool(const std::string &)> filter) const override;
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 
 
 private:
 private:
@@ -50,7 +51,7 @@ private:
 	 * key = ResourceID for resource loader
 	 * key = ResourceID for resource loader
 	 * value = name that can be used to access file
 	 * value = name that can be used to access file
 	*/
 	*/
-	std::unordered_map<ResourceID, boost::filesystem::path> fileList;
+	mutable std::unordered_map<ResourceID, boost::filesystem::path> fileList;
 
 
 	/**
 	/**
 	 * Returns a list of pathnames denoting the files in the directory denoted by this pathname.
 	 * Returns a list of pathnames denoting the files in the directory denoted by this pathname.

+ 1 - 0
lib/filesystem/CZipLoader.h

@@ -56,6 +56,7 @@ public:
 	std::unique_ptr<CInputStream> load(const ResourceID & resourceName) const override;
 	std::unique_ptr<CInputStream> load(const ResourceID & resourceName) const override;
 	bool existsResource(const ResourceID & resourceName) const override;
 	bool existsResource(const ResourceID & resourceName) const override;
 	std::string getMountPoint() const override;
 	std::string getMountPoint() const override;
+	void updateFilteredFiles(std::function<bool(const std::string &)> filter) const override {}
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 	std::unordered_set<ResourceID> getFilteredFiles(std::function<bool(const ResourceID &)> filter) const override;
 };
 };
 
 

+ 8 - 1
lib/filesystem/ISimpleResourceLoader.h

@@ -70,7 +70,14 @@ public:
 	}
 	}
 
 
 	/**
 	/**
-	 * Get list of files that matches filter function
+	 * Update lists of files that match filter function
+	 *
+	 * @param filter Filter that returns true if specified mount point matches filter
+	 */
+	virtual void updateFilteredFiles(std::function<bool(const std::string &)> filter) const = 0;
+
+	/**
+	 * Get list of files that match filter function
 	 *
 	 *
 	 * @param filter Filter that returns true if specified ID matches filter
 	 * @param filter Filter that returns true if specified ID matches filter
 	 * @return Returns list of flies
 	 * @return Returns list of flies