diff options
| author | oy <Tom_Adams@web.de> | 2011-02-21 11:23:30 +0100 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-02-21 11:23:30 +0100 |
| commit | 088ec3e2f3ba0419612846db8f3687f5e2de1348 (patch) | |
| tree | f12d7d6a55a7ef668dcc58ee64d0869ea7434e21 /src/engine | |
| parent | 4f91026a01436d95cb20b3a994e96dce5072544e (diff) | |
| download | zcatch-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.cpp | 15 | ||||
| -rw-r--r-- | src/engine/client/client.h | 2 | ||||
| -rw-r--r-- | src/engine/shared/storage.cpp | 63 | ||||
| -rw-r--r-- | src/engine/storage.h | 1 |
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; |