Commit ebba57d2 authored by D-AIRY's avatar D-AIRY

Moving level iteration to new filesystem class

parent c45c8492
......@@ -8,7 +8,7 @@ See the license in LICENSE
#include "FileSystem.h"
class CFileExtIterator final : public IFileSystem::IFileIterator
class CFileExtIterator final : public IFileIterator
{
private:
String m_sPath;
......@@ -21,7 +21,7 @@ private:
public:
CFileExtIterator(const char *szPath, const char *szExt = nullptr);
const char *XMETHODCALLTYPE next() override;
const char* XMETHODCALLTYPE next() override;
void XMETHODCALLTYPE reset() override;
......
......@@ -8,7 +8,7 @@ See the license in LICENSE
#include "FileSystem.h"
class CFileExtrPathsIterator final : public IFileSystem::IFileIterator
class CFileExtrPathsIterator final : public IFileIterator
{
private:
Array<String>* m_paths;
......@@ -22,7 +22,7 @@ private:
public:
CFileExtrPathsIterator(Array<String> *paths, const char *szExt = nullptr);
const char *XMETHODCALLTYPE next() override;
const char* XMETHODCALLTYPE next() override;
void XMETHODCALLTYPE reset() override;
......
......@@ -3,7 +3,7 @@
#include "FileSystem.h"
class CFileExtsIterator final : public IFileSystem::IFileIterator
class CFileExtsIterator final : public IFileIterator
{
private:
String m_sPath;
......@@ -21,7 +21,7 @@ private:
public:
CFileExtsIterator(const char *szPath, const char **szExts, int extArraySize);
const char *XMETHODCALLTYPE next() override;
const char* XMETHODCALLTYPE next() override;
void XMETHODCALLTYPE reset() override;
......
......@@ -333,7 +333,7 @@ time_t CFileSystem::getFileModifyTime(const char *szPath)
return filetimeToTime_t(lpFileInformation.ftLastWriteTime);
}
IFileSystem::IFileIterator *CFileSystem::getFolderList(const char *szPath)
IFileIterator *CFileSystem::getFolderList(const char *szPath)
{
if (isAbsolutePath(szPath))
{
......@@ -345,7 +345,7 @@ IFileSystem::IFileIterator *CFileSystem::getFolderList(const char *szPath)
return paths ? new CFolderPathsIterator(paths) : nullptr;
}
IFileSystem::IFileIterator *CFileSystem::getFileList(const char *szPath, const char *szExt)
IFileIterator *CFileSystem::getFileList(const char *szPath, const char *szExt)
{
if (isAbsolutePath(szPath))
{
......@@ -357,18 +357,18 @@ IFileSystem::IFileIterator *CFileSystem::getFileList(const char *szPath, const c
return paths ? new CFileExtrPathsIterator(paths, szExt) : nullptr;
}
IFileSystem::IFileIterator *CFileSystem::getFileList(const char *szPath, const char **szExts, int extsCount)
IFileIterator *CFileSystem::getFileList(const char *szPath, const char **szExts, int extsCount)
{
return new CFileExtsIterator(szPath, szExts, extsCount);
}
IFileSystem::IFileIterator *CFileSystem::getFileListRecursive(const char *szPath, const char *szExt = 0)
IFileIterator *CFileSystem::getFileListRecursive(const char *szPath, const char *szExt = 0)
{
assert(!"No Implementation");
return nullptr;
}
IFileSystem::IFileIterator *CFileSystem::getFileListRecursive(const char *szPath, const char **szExts, int extsCount)
IFileIterator *CFileSystem::getFileListRecursive(const char *szPath, const char **szExts, int extsCount)
{
assert(!"No Implementation");
return nullptr;
......
......@@ -8,7 +8,7 @@ See the license in LICENSE
#include "FileSystem.h"
class CFolderIterator final : public IFileSystem::IFileIterator
class CFolderIterator final : public IFileIterator
{
private:
String m_sPath;
......@@ -19,7 +19,7 @@ private:
public:
CFolderIterator(const char *szPath);
const char *XMETHODCALLTYPE next() override;
const char* XMETHODCALLTYPE next() override;
void XMETHODCALLTYPE reset() override;
......
......@@ -57,5 +57,5 @@ void CFolderPathsIterator::reset()
CFolderPathsIterator::~CFolderPathsIterator()
{
FIND_CLOSE(m_handle);
mem_delete_a(m_paths);
mem_delete(m_paths);
}
......@@ -8,7 +8,7 @@ See the license in LICENSE
#include "FileSystem.h"
class CFolderPathsIterator final : public IFileSystem::IFileIterator
class CFolderPathsIterator final : public IFileIterator
{
private:
......@@ -22,7 +22,7 @@ private:
public:
CFolderPathsIterator(Array<String> *paths);
const char *XMETHODCALLTYPE next() override;
const char* XMETHODCALLTYPE next() override;
void XMETHODCALLTYPE reset() override;
......
......@@ -129,62 +129,34 @@ struct CLevelInfo
char m_szLocalName[MAX_LEVEL_STRING]; //!< Отображаемое имя уровня
bool m_bHasPreview;
HANDLE m_hFind; //!< для внутреннего использования
IFileIterator *m_pIterator = NULL; //!< для внутреннего использования
};
BOOL EnumLevels(CLevelInfo *pInfo)
{
WIN32_FIND_DATA fd;
bool bFound = false;
if(!pInfo->m_hFind)
const char *szDirName = NULL;
if(!pInfo->m_pIterator)
{
if((pInfo->m_hFind = ::FindFirstFile((String(Core_RStringGet(G_RI_STRING_PATH_GS_LEVELS)) + "*").c_str(), &fd)) != INVALID_HANDLE_VALUE)
{
bFound = true;
}
pInfo->m_pIterator = Core_GetIXCore()->getFileSystem()->getFolderList("levels/");
}
else
if(pInfo->m_pIterator && (szDirName = pInfo->m_pIterator->next()))
{
if(::FindNextFile(pInfo->m_hFind, &fd))
{
bFound = true;
}
}
if(bFound)
{
while(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (!strcmp(fd.cFileName, ".") || !strcmp(fd.cFileName, "..")))
{
bFound = false;
if(::FindNextFile(pInfo->m_hFind, &fd))
{
if((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, ".."))
{
bFound = true;
break;
}
}
else
{
break;
}
}
bFound = true;
}
if(!bFound)
{
if(INVALID_HANDLE_VALUE != pInfo->m_hFind)
{
::FindClose(pInfo->m_hFind);
}
mem_release(pInfo->m_pIterator);
return(FALSE);
}
strncpy(pInfo->m_szName, fd.cFileName, MAX_LEVEL_STRING - 1);
const char *szLevelName = basename(szDirName);
strncpy(pInfo->m_szName, szLevelName, MAX_LEVEL_STRING - 1);
{
char szFullPath[1024];
sprintf(szFullPath, "%s%s/%s.lvl", Core_RStringGet(G_RI_STRING_PATH_GS_LEVELS), pInfo->m_szName, pInfo->m_szName);
sprintf(szFullPath, "levels/%s/%s.lvl", pInfo->m_szName, pInfo->m_szName);
ISXConfig *pConfig = Core_OpConfig(szFullPath);
if(pConfig->keyExists("level", "local_name"))
......@@ -193,11 +165,11 @@ BOOL EnumLevels(CLevelInfo *pInfo)
}
else
{
strncpy(pInfo->m_szLocalName, fd.cFileName, MAX_LEVEL_STRING - 1);
strncpy(pInfo->m_szLocalName, pInfo->m_szName, MAX_LEVEL_STRING - 1);
}
mem_release(pConfig);
sprintf(szFullPath, "%s%s/preview.bmp", Core_RStringGet(G_RI_STRING_PATH_GS_LEVELS), pInfo->m_szName);
sprintf(szFullPath, "levels/%s/preview.bmp", pInfo->m_szName);
pInfo->m_bHasPreview = FileExistsFile(szFullPath);
}
......
......@@ -38,6 +38,15 @@ enum FILE_OPEN_MODE
};
DEFINE_ENUM_FLAG_OPERATORS(FILE_OPEN_MODE);
class IFileIterator: public IXUnknown
{
public:
//! Возврат к первому элементу
virtual void XMETHODCALLTYPE reset() = 0;
//! Имя следующего файла, NULL если файлы закончились
virtual const char* XMETHODCALLTYPE next() = 0;
};
class IFile;
class IFileSystem: public IXUnknown
{
......@@ -66,24 +75,15 @@ public:
virtual bool isDirectory(const char *szPath) = 0;
//! возвращает время последнего изменения файла
virtual time_t getFileModifyTime(const char *szPath) = 0;
class IFileIterator
{
public:
//! Возврат к первому элементу
virtual void XMETHODCALLTYPE reset() = 0;
//! Имя следующего файла, NULL если файлы закончились
virtual const char * XMETHODCALLTYPE next() = 0;
};
//! Возвращает список всех папок
virtual IFileIterator *getFolderList(const char *szPath) = 0;
virtual IFileIterator* getFolderList(const char *szPath) = 0;
/*! возвращает массив со всеми данными находящимися по пути szPath,
szPath может быть не канонизирован и необязательно должен заканчиваться слэшем,
szPath уже может содержать фильтр (к примеру C:/*), но если его нет, тогда функция подставит сама
*/
virtual IFileIterator *getFileList(const char *szPath, const char *szExt = 0) = 0;
virtual IFileIterator* getFileList(const char *szPath, const char *szExt = 0) = 0;
//! То же, что и предыдущая, только для массива расширений
virtual IFileIterator *getFileList(const char *szPath, const char **szExts, int extsCount) = 0;
......@@ -92,10 +92,10 @@ public:
szPath не должен содержать фильтров, может быть не канонизирован и без последнего слэша,
szExt - расширение файла без точки
*/
virtual IFileIterator *getFileListRecursive(const char *szPath, const char *szExt = 0) = 0;
virtual IFileIterator* getFileListRecursive(const char *szPath, const char *szExt = 0) = 0;
//! То же, что предыдущая, только позволяет использовать массив расширений для поиска. Последний элемент массива NULL
virtual IFileIterator *getFileListRecursive(const char *szPath, const char **szExts, int extsCount) = 0;
virtual IFileIterator* getFileListRecursive(const char *szPath, const char **szExts, int extsCount) = 0;
//! Создает директорию по указанному пути, рекурсивно
virtual bool createDirectory(const char *szPath) = 0;
......@@ -104,7 +104,7 @@ public:
virtual bool deleteDirectory(const char *szPath) = 0;
//! Открыть файл. При открытии с возможностью записи файла, находящегося вне записываемого корня, файл копируется в записывающийся корень и открывается копия.
virtual IFile *openFile(const char *szPath, FILE_OPEN_MODE mode = FILE_MODE_READ) = 0;
virtual IFile* openFile(const char *szPath, FILE_OPEN_MODE mode = FILE_MODE_READ) = 0;
};
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment