Serious-Engine/Sources/Engine/Base/Win32/Win32FileSystem.cpp
Ryan C. Gordon 24cb244d43 First attempt to hand-merge Ryan's Linux and Mac OS X port.
This was a _ton_ of changes, made 15 years ago, so there are probably some
problems to work out still.

Among others: Engine/Base/Stream.* was mostly abandoned and will need to be
re-ported.

Still, this is a pretty good start, and probably holds a world record for
lines of changes or something.  :)
2016-03-28 23:46:13 -04:00

122 lines
2.7 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
/* rcg10072001 Implemented. */
// !!! FIXME: rcg10142001 This should really be using CTStrings...
#include <io.h>
#include <Engine/Engine.h>
#include <Engine/Base/FileSystem.h>
ENGINE_API CFileSystem *_pFileSystem = NULL;
class CWin32FileSystem : public CFileSystem
{
public:
CWin32FileSystem(const char *argv0, const char *gamename);
virtual ~CWin32FileSystem(void);
virtual void GetExecutablePath(char *buf, ULONG bufSize);
virtual void GetUserDirectory(char *buf, ULONG bufSize);
virtual CDynamicArray<CTString> *FindFiles(const char *dir,
const char *wildcard);
protected:
char *exePath;
char *userDir;
};
const char *CFileSystem::GetDirSeparator(void)
{
return("\\");
}
BOOL CFileSystem::IsDummyFile(const char *fname)
{
return( (strcmp(fname, ".") == 0) || (strcmp(fname, "..") == 0) );
}
BOOL CFileSystem::Exists(const char *fname)
{
ASSERTALWAYS("Write me!");
}
BOOL CFileSystem::IsDirectory(const char *fname)
{
ASSERTALWAYS("Write me!");
}
CFileSystem *CFileSystem::GetInstance(const char *argv0, const char *gamename)
{
return(new CWin32FileSystem(argv0, gamename));
}
CWin32FileSystem::CWin32FileSystem(const char *argv0, const char *gamename)
: exePath(NULL),
: userDir(NULL)
{
char buf[MAX_PATH];
memset(buf, '\0', sizeof (buf));
GetModuleFileName(NULL, buf, sizeof (buf) - 1);
exePath = new char[strlen(buf) + 1];
strcpy(exePath, buf);
userDir = new char[strlen(buf) + 1];
strcpy(userDir, buf);
ASSERTALWAYS("We need to chop \\bin\\debug off the string if it's there.\n");
}
CWin32FileSystem::~CWin32FileSystem(void)
{
delete[] exePath;
delete[] userDir;
}
void CWin32FileSystem::GetExecutablePath(char *buf, ULONG bufSize)
{
strncpy(buf, exePath, bufSize);
buf[bufSize - 1] = '\0'; // just in case.
}
void CWin32FileSystem::GetUserDirectory(char *buf, ULONG bufSize)
{
strncpy(buf, userDir, bufSize);
buf[bufSize - 1] = '\0'; // just in case.
}
CDynamicArray<CTString> CWin32FileSystem::FindFiles(const char *dir,
const char *wildcard)
{
CDynamicArray<CTString> *retval = new CDynamicArray<CTString>;
CTString str(dir);
if (dir[strlen(dir) - 1] != '\\')
str += "\\";
struct _finddata_t c_file;
long hFile = _findfirst( (const char *)(str+wildcard), &c_file );
for (BOOL bFileExists = hFile!=-1;
bFileExists;
bFileExists = _findnext( hFile, &c_file )==0)
{
*retval->New() = c_file.name;
}
_findclose(hFile);
return(retval);
}
// end of Win32FileSystem.cpp ...