about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-02-21 11:23:30 +0100
committeroy <Tom_Adams@web.de>2011-02-21 11:23:30 +0100
commit088ec3e2f3ba0419612846db8f3687f5e2de1348 (patch)
treef12d7d6a55a7ef668dcc58ee64d0869ea7434e21 /src/engine
parent4f91026a01436d95cb20b3a994e96dce5072544e (diff)
downloadzcatch-088ec3e2f3ba0419612846db8f3687f5e2de1348.tar.gz
zcatch-088ec3e2f3ba0419612846db8f3687f5e2de1348.zip
made the client's map search work with sub folders. Closes #254
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/client.cpp15
-rw-r--r--src/engine/client/client.h2
-rw-r--r--src/engine/shared/storage.cpp63
-rw-r--r--src/engine/storage.h1
4 files changed, 78 insertions, 3 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index 850c1d52..67f954dd 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -378,19 +378,21 @@ void CFileCollection::AddEntry(int64 Timestamp)
 	}
 }
 
-void CFileCollection::FilelistCallback(const char *pFilename, int IsDir, int StorageType, void *pUser)
+int CFileCollection::FilelistCallback(const char *pFilename, int IsDir, int StorageType, void *pUser)
 {
 	CFileCollection *pThis = static_cast<CFileCollection *>(pUser);
 
 	// check for valid file name format
 	if(IsDir || !pThis->IsFilenameValid(pFilename))
-		return;
+		return 0;
 
 	// extract the timestamp
 	int64 Timestamp = pThis->ExtractTimestamp(pFilename+pThis->m_FileDescLength+1);
 
 	// add the entry
 	pThis->AddEntry(Timestamp);
+
+	return 0;
 }
 
 
@@ -991,6 +993,15 @@ const char *CClient::LoadMapSearch(const char *pMapName, int WantedCrc)
 	// try the downloaded maps
 	str_format(aBuf, sizeof(aBuf), "downloadedmaps/%s_%08x.map", pMapName, WantedCrc);
 	pError = LoadMap(pMapName, aBuf, WantedCrc);
+	if(!pError)
+		return pError;
+
+	// search for the map within subfolders
+	char aFilename[128];
+	str_format(aFilename, sizeof(aFilename), "%s.map", pMapName);
+	if(Storage()->FindFile(aFilename, "maps", IStorage::TYPE_ALL, aBuf, sizeof(aBuf)));
+		pError = LoadMap(pMapName, aBuf, WantedCrc);
+
 	return pError;
 }
 
diff --git a/src/engine/client/client.h b/src/engine/client/client.h
index c073139a..8768f23a 100644
--- a/src/engine/client/client.h
+++ b/src/engine/client/client.h
@@ -99,7 +99,7 @@ public:
 	void Init(IStorage *pStorage, const char *pPath, const char *pFileDesc, const char *pFileExt, int MaxEntries);
 	void AddEntry(int64 Timestamp);
 
-	static void FilelistCallback(const char *pFilename, int IsDir, int StorageType, void *pUser);
+	static int FilelistCallback(const char *pFilename, int IsDir, int StorageType, void *pUser);
 };
 
 
diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp
index ffbd3aff..3d7257f4 100644
--- a/src/engine/shared/storage.cpp
+++ b/src/engine/shared/storage.cpp
@@ -282,6 +282,69 @@ public:
 		return 0;		
 	}
  	
+	struct CFindCBData
+	{
+		CStorage *pStorage;
+		const char *pFilename;
+		const char *pPath;
+		char *pBuffer;
+		int BufferSize;
+	};
+
+	static int FindFileCallback(const char *pName, int IsDir, int Type, void *pUser)
+	{
+		CFindCBData Data = *static_cast<CFindCBData *>(pUser);
+		if(IsDir)
+		{
+			if(pName[0] == '.')
+				return 0;
+
+			// search within the folder
+			char aBuf[MAX_PATH_LENGTH];
+			char aPath[MAX_PATH_LENGTH];
+			str_format(aPath, sizeof(aPath), "%s/%s", Data.pPath, pName);
+			Data.pPath = aPath;
+			fs_listdir(Data.pStorage->GetPath(Type, aPath, aBuf, sizeof(aBuf)), FindFileCallback, Type, &Data);
+		}
+		else if(!str_comp(pName, Data.pFilename))
+		{
+			// found the file = end
+			str_format(Data.pBuffer, Data.BufferSize, "%s/%s", Data.pPath, Data.pFilename);
+			return 1;
+		}
+
+		return 0;
+	}
+
+	virtual bool FindFile(const char *pFilename, const char *pPath, int Type, char *pBuffer, int BufferSize)
+	{
+		if(BufferSize < 1)
+			return false;
+		
+		pBuffer[0] = 0;
+		char aBuf[MAX_PATH_LENGTH];
+		CFindCBData Data;
+		Data.pStorage = this;
+		Data.pFilename = pFilename;
+		Data.pPath = pPath;
+		Data.pBuffer = pBuffer;
+		Data.BufferSize = BufferSize;
+
+		if(Type == TYPE_ALL)
+		{
+			// search within all available directories
+			for(int i = 0; i < m_NumPaths; ++i)
+				fs_listdir(GetPath(i, pPath, aBuf, sizeof(aBuf)), FindFileCallback, i, &Data);
+		}
+		else if(Type >= 0 && Type < m_NumPaths)
+		{
+			// search within wanted directory
+			fs_listdir(GetPath(Type, pPath, aBuf, sizeof(aBuf)), FindFileCallback, Type, &Data);
+		}
+
+		return pBuffer[0] != 0;
+	}
+
 	virtual bool RemoveFile(const char *pFilename, int Type)
 	{
 		if(Type < 0 || Type >= m_NumPaths)
diff --git a/src/engine/storage.h b/src/engine/storage.h
index 7ac9feff..e0cab12f 100644
--- a/src/engine/storage.h
+++ b/src/engine/storage.h
@@ -17,6 +17,7 @@ public:
 	
 	virtual void ListDirectory(int Type, const char *pPath, FS_LISTDIR_CALLBACK pfnCallback, void *pUser) = 0;
 	virtual IOHANDLE OpenFile(const char *pFilename, int Flags, int Type, char *pBuffer = 0, int BufferSize = 0) = 0;
+	virtual bool FindFile(const char *pFilename, const char *pPath, int Type, char *pBuffer, int BufferSize) = 0;
 	virtual bool RemoveFile(const char *pFilename, int Type) = 0;
 	virtual bool RenameFile(const char* pOldFilename, const char* pNewFilename, int Type) = 0;
 	virtual bool CreateFolder(const char *pFoldername, int Type) = 0;