#include "ifilesystem.h" #include "tier1/interface.h" #include "tier0/lib.h" class CLIBCFileHandle : public IFileHandle { public: FILE *m_pFile; }; class CLIBCFileSystem : public IFileSystem { public: virtual void Init() override {}; virtual void Shutdown() override {}; virtual IFileHandle *Open( const char *szFileName, int eOpCode ) override { const char *szOperation; FILE *pFile; CLIBCFileHandle *pHandle = NULL; switch (eOpCode) { case FILEMODE_READ: szOperation = "r"; break; default: V_printf("Operation is not supported\n"); break; } pFile = V_fopen(szFileName, szOperation); if (!pFile) return NULL; pHandle = new CLIBCFileHandle; pHandle->m_pFileSystem = this; pHandle->m_pFile = pFile; return pHandle; } virtual size_t Write( IFileHandle *pFile, const void *pData, size_t nDataSize ) override { return 0; } virtual size_t Read( IFileHandle *pFile, void *pData, size_t nDataSize ) override { CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; if (!pHandle) return 0; return V_fread( pData, 1, nDataSize, pHandle->m_pFile ); } virtual size_t Seek( IFileHandle *pFile, ESeekMode eSeekMode, size_t nOffset ) override { CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; int eLibcSeekMode = 0; switch (eSeekMode) { case SEEKMODE_SET: eLibcSeekMode = SEEK_SET; break; case SEEKMODE_RELATIVE_END: eLibcSeekMode = SEEK_END; break; case SEEKMODE_RELATIVE_START: eLibcSeekMode = SEEK_CUR; break; } if (!pHandle) return 0; return V_fseek( pHandle->m_pFile, eLibcSeekMode, nOffset ); } virtual size_t Tell( IFileHandle *pFile ) override { CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; if (!pHandle) return 0; return V_ftell(pHandle->m_pFile); } virtual void Close( IFileHandle *pFile ) override { CLIBCFileHandle *pHandle = (CLIBCFileHandle*)pFile; if (!pHandle) return; V_fclose(pHandle->m_pFile); delete pHandle; } }; EXPOSE_INTERFACE(CLIBCFileSystem, IFileSystem, FILESYSTEM_BACKEND_INTERFACE_NAME);