//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef FILESYSTEM_PASSTHRU_H #define FILESYSTEM_PASSTHRU_H #ifdef _WIN32 #pragma once #endif #include #include #include "filesystem.h" #ifdef AsyncRead #undef AsyncRead #undef AsyncReadMutiple #endif // // These classes pass all filesystem interface calls through to another // filesystem interface. They can be used anytime you want to override a couple // things in a filesystem. VMPI uses this to override the base filesystem calls // while allowing the rest of the filesystem functionality to work on the // master. // template class CInternalFileSystemPassThru : public Base { public: CInternalFileSystemPassThru() { m_pBaseFileSystemPassThru = NULL; } virtual void InitPassThru(IBaseFileSystem *pBaseFileSystemPassThru) { m_pBaseFileSystemPassThru = pBaseFileSystemPassThru; } virtual int Read(void *pOutput, int size, FileHandle_t file) { return m_pBaseFileSystemPassThru->Read(pOutput, size, file); } virtual int Write(void const *pInput, int size, FileHandle_t file) { return m_pBaseFileSystemPassThru->Write(pInput, size, file); } virtual FileHandle_t Open(const char *pFileName, const char *pOptions, const char *pathID) { return m_pBaseFileSystemPassThru->Open(pFileName, pOptions, pathID); } virtual void Close(FileHandle_t file) { m_pBaseFileSystemPassThru->Close(file); } virtual void Seek(FileHandle_t file, int pos, FileSystemSeek_t seekType) { m_pBaseFileSystemPassThru->Seek(file, pos, seekType); } virtual unsigned int Tell(FileHandle_t file) { return m_pBaseFileSystemPassThru->Tell(file); } virtual unsigned int Size(FileHandle_t file) { return m_pBaseFileSystemPassThru->Size(file); } virtual unsigned int Size(const char *pFileName, const char *pPathID) { return m_pBaseFileSystemPassThru->Size(pFileName, pPathID); } virtual void Flush(FileHandle_t file) { m_pBaseFileSystemPassThru->Flush(file); } virtual bool Precache(const char *pFileName, const char *pPathID) { return m_pBaseFileSystemPassThru->Precache(pFileName, pPathID); } virtual bool FileExists(const char *pFileName, const char *pPathID) { return m_pBaseFileSystemPassThru->FileExists(pFileName, pPathID); } virtual bool IsFileWritable(char const *pFileName, const char *pPathID) { return m_pBaseFileSystemPassThru->IsFileWritable(pFileName, pPathID); } virtual bool SetFileWritable(char const *pFileName, bool writable, const char *pPathID) { return m_pBaseFileSystemPassThru->SetFileWritable(pFileName, writable, pPathID); } virtual long GetFileTime(const char *pFileName, const char *pPathID) { return m_pBaseFileSystemPassThru->GetFileTime(pFileName, pPathID); } virtual bool ReadFile(const char *pFileName, const char *pPath, CUtlBuffer &buf, int nMaxBytes = 0, int nStartingByte = 0, FSAllocFunc_t pfnAlloc = NULL) { return m_pBaseFileSystemPassThru->ReadFile( pFileName, pPath, buf, nMaxBytes, nStartingByte, pfnAlloc); } virtual bool WriteFile(const char *pFileName, const char *pPath, CUtlBuffer &buf) { return m_pBaseFileSystemPassThru->WriteFile(pFileName, pPath, buf); } virtual bool UnzipFile(const char *pFileName, const char *pPath, const char *pDestination) { return m_pBaseFileSystemPassThru->UnzipFile(pFileName, pPath, pDestination); } protected: IBaseFileSystem *m_pBaseFileSystemPassThru; }; class CBaseFileSystemPassThru : public CInternalFileSystemPassThru { public: }; class CFileSystemPassThru : public CInternalFileSystemPassThru { public: typedef CInternalFileSystemPassThru BaseClass; CFileSystemPassThru() { m_pFileSystemPassThru = NULL; } virtual void InitPassThru(IFileSystem *pFileSystemPassThru, bool bBaseOnly) { if (!bBaseOnly) m_pFileSystemPassThru = pFileSystemPassThru; BaseClass::InitPassThru(pFileSystemPassThru); } // IAppSystem stuff. // Here's where the app systems get to learn about each other virtual bool Connect(CreateInterfaceFn factory) { return m_pFileSystemPassThru->Connect(factory); } virtual void Disconnect() { m_pFileSystemPassThru->Disconnect(); } virtual void *QueryInterface(const char *pInterfaceName) { return m_pFileSystemPassThru->QueryInterface(pInterfaceName); } virtual InitReturnVal_t Init() { return m_pFileSystemPassThru->Init(); } virtual void Shutdown() { m_pFileSystemPassThru->Shutdown(); } virtual void RemoveAllSearchPaths(void) { m_pFileSystemPassThru->RemoveAllSearchPaths(); } virtual void AddSearchPath(const char *pPath, const char *pathID, SearchPathAdd_t addType) { m_pFileSystemPassThru->AddSearchPath(pPath, pathID, addType); } virtual bool RemoveSearchPath(const char *pPath, const char *pathID) { return m_pFileSystemPassThru->RemoveSearchPath(pPath, pathID); } virtual void RemoveFile(char const *pRelativePath, const char *pathID) { m_pFileSystemPassThru->RemoveFile(pRelativePath, pathID); } virtual bool RenameFile(char const *pOldPath, char const *pNewPath, const char *pathID) { return m_pFileSystemPassThru->RenameFile(pOldPath, pNewPath, pathID); } virtual void CreateDirHierarchy(const char *path, const char *pathID) { m_pFileSystemPassThru->CreateDirHierarchy(path, pathID); } virtual bool IsDirectory(const char *pFileName, const char *pathID) { return m_pFileSystemPassThru->IsDirectory(pFileName, pathID); } virtual void FileTimeToString(char *pStrip, int maxCharsIncludingTerminator, long fileTime) { m_pFileSystemPassThru->FileTimeToString( pStrip, maxCharsIncludingTerminator, fileTime); } virtual void SetBufferSize(FileHandle_t file, unsigned nBytes) { m_pFileSystemPassThru->SetBufferSize(file, nBytes); } virtual bool IsOk(FileHandle_t file) { return m_pFileSystemPassThru->IsOk(file); } virtual bool EndOfFile(FileHandle_t file) { return m_pFileSystemPassThru->EndOfFile(file); } virtual char *ReadLine(char *pOutput, int maxChars, FileHandle_t file) { return m_pFileSystemPassThru->ReadLine(pOutput, maxChars, file); } virtual int FPrintf(FileHandle_t file, PRINTF_FORMAT_STRING const char *pFormat, ...) { char str[8192]; va_list marker; va_start(marker, pFormat); _vsnprintf(str, sizeof(str), pFormat, marker); va_end(marker); return m_pFileSystemPassThru->FPrintf(file, "%s", str); } virtual CSysModule *LoadModule(const char *pFileName, const char *pPathID, bool bValidatedDllOnly) { return m_pFileSystemPassThru->LoadModule(pFileName, pPathID, bValidatedDllOnly); } virtual void UnloadModule(CSysModule *pModule) { m_pFileSystemPassThru->UnloadModule(pModule); } virtual const char *FindFirst(const char *pWildCard, FileFindHandle_t *pHandle) { return m_pFileSystemPassThru->FindFirst(pWildCard, pHandle); } virtual const char *FindNext(FileFindHandle_t handle) { return m_pFileSystemPassThru->FindNext(handle); } virtual bool FindIsDirectory(FileFindHandle_t handle) { return m_pFileSystemPassThru->FindIsDirectory(handle); } virtual void FindClose(FileFindHandle_t handle) { m_pFileSystemPassThru->FindClose(handle); } virtual const char *GetLocalPath(const char *pFileName, OUT_Z_CAP(maxLenInChars) char *pDest, int maxLenInChars) { return m_pFileSystemPassThru->GetLocalPath(pFileName, pDest, maxLenInChars); } virtual bool FullPathToRelativePath(const char *pFullpath, OUT_Z_CAP(maxLenInChars) char *pDest, int maxLenInChars) { return m_pFileSystemPassThru->FullPathToRelativePath(pFullpath, pDest, maxLenInChars); } virtual bool GetCaseCorrectFullPath_Ptr( const char *pFullPath, OUT_Z_CAP(maxLenInChars) char *pDest, int maxLenInChars) { return m_pFileSystemPassThru->GetCaseCorrectFullPath_Ptr( pFullPath, pDest, maxLenInChars); } virtual bool GetCurrentDirectory(char *pDirectory, int maxlen) { return m_pFileSystemPassThru->GetCurrentDirectory(pDirectory, maxlen); } virtual void PrintOpenedFiles(void) { m_pFileSystemPassThru->PrintOpenedFiles(); } virtual void PrintSearchPaths(void) { m_pFileSystemPassThru->PrintSearchPaths(); } virtual void SetWarningFunc( void (*pfnWarning)(PRINTF_FORMAT_STRING const char *fmt, ...)) { m_pFileSystemPassThru->SetWarningFunc(pfnWarning); } virtual void SetWarningLevel(FileWarningLevel_t level) { m_pFileSystemPassThru->SetWarningLevel(level); } virtual void AddLoggingFunc(void (*pfnLogFunc)(const char *fileName, const char *accessType)) { m_pFileSystemPassThru->AddLoggingFunc(pfnLogFunc); } virtual void RemoveLoggingFunc(FileSystemLoggingFunc_t logFunc) { m_pFileSystemPassThru->RemoveLoggingFunc(logFunc); } virtual FSAsyncStatus_t AsyncReadMultiple( const FileAsyncRequest_t *pRequests, int nRequests, FSAsyncControl_t *pControls) { return m_pFileSystemPassThru->AsyncReadMultiple(pRequests, nRequests, pControls); } virtual FSAsyncStatus_t AsyncReadMultipleCreditAlloc( const FileAsyncRequest_t *pRequests, int nRequests, const char *pszFile, int line, FSAsyncControl_t *pControls) { return m_pFileSystemPassThru->AsyncReadMultipleCreditAlloc( pRequests, nRequests, pszFile, line, pControls); } virtual FSAsyncStatus_t AsyncFinish(FSAsyncControl_t hControl, bool wait) { return m_pFileSystemPassThru->AsyncFinish(hControl, wait); } virtual FSAsyncStatus_t AsyncGetResult(FSAsyncControl_t hControl, void **ppData, int *pSize) { return m_pFileSystemPassThru->AsyncGetResult(hControl, ppData, pSize); } virtual FSAsyncStatus_t AsyncAbort(FSAsyncControl_t hControl) { return m_pFileSystemPassThru->AsyncAbort(hControl); } virtual FSAsyncStatus_t AsyncStatus(FSAsyncControl_t hControl) { return m_pFileSystemPassThru->AsyncStatus(hControl); } virtual FSAsyncStatus_t AsyncFlush() { return m_pFileSystemPassThru->AsyncFlush(); } virtual void AsyncAddRef(FSAsyncControl_t hControl) { m_pFileSystemPassThru->AsyncAddRef(hControl); } virtual void AsyncRelease(FSAsyncControl_t hControl) { m_pFileSystemPassThru->AsyncRelease(hControl); } virtual FSAsyncStatus_t AsyncBeginRead(const char *pszFile, FSAsyncFile_t *phFile) { return m_pFileSystemPassThru->AsyncBeginRead(pszFile, phFile); } virtual FSAsyncStatus_t AsyncEndRead(FSAsyncFile_t hFile) { return m_pFileSystemPassThru->AsyncEndRead(hFile); } virtual void AsyncAddFetcher(IAsyncFileFetch *pFetcher) { m_pFileSystemPassThru->AsyncAddFetcher(pFetcher); } virtual void AsyncRemoveFetcher(IAsyncFileFetch *pFetcher) { m_pFileSystemPassThru->AsyncRemoveFetcher(pFetcher); } virtual const FileSystemStatistics *GetFilesystemStatistics() { return m_pFileSystemPassThru->GetFilesystemStatistics(); } virtual WaitForResourcesHandle_t WaitForResources( const char *resourcelist) { return m_pFileSystemPassThru->WaitForResources(resourcelist); } virtual bool GetWaitForResourcesProgress(WaitForResourcesHandle_t handle, float *progress, bool *complete) { return m_pFileSystemPassThru->GetWaitForResourcesProgress( handle, progress, complete); } virtual void CancelWaitForResources(WaitForResourcesHandle_t handle) { m_pFileSystemPassThru->CancelWaitForResources(handle); } virtual int HintResourceNeed(const char *hintlist, int forgetEverything) { return m_pFileSystemPassThru->HintResourceNeed(hintlist, forgetEverything); } virtual bool IsFileImmediatelyAvailable(const char *pFileName) { return m_pFileSystemPassThru->IsFileImmediatelyAvailable(pFileName); } virtual void GetLocalCopy(const char *pFileName) { m_pFileSystemPassThru->GetLocalCopy(pFileName); } virtual FileNameHandle_t FindOrAddFileName(char const *pFileName) { return m_pFileSystemPassThru->FindOrAddFileName(pFileName); } virtual FileNameHandle_t FindFileName(char const *pFileName) { return m_pFileSystemPassThru->FindFileName(pFileName); } virtual bool String(const FileNameHandle_t &handle, char *buf, int buflen) { return m_pFileSystemPassThru->String(handle, buf, buflen); } virtual bool IsOk2(FileHandle_t file) { return IsOk(file); } virtual void RemoveSearchPaths(const char *szPathID) { m_pFileSystemPassThru->RemoveSearchPaths(szPathID); } virtual bool IsSteam() const { return m_pFileSystemPassThru->IsSteam(); } virtual FilesystemMountRetval_t MountSteamContent(int nExtraAppId = -1) { return m_pFileSystemPassThru->MountSteamContent(nExtraAppId); } virtual const char *FindFirstEx(const char *pWildCard, const char *pPathID, FileFindHandle_t *pHandle) { return m_pFileSystemPassThru->FindFirstEx(pWildCard, pPathID, pHandle); } virtual void MarkPathIDByRequestOnly(const char *pPathID, bool bRequestOnly) { m_pFileSystemPassThru->MarkPathIDByRequestOnly(pPathID, bRequestOnly); } virtual bool AddPackFile(const char *fullpath, const char *pathID) { return m_pFileSystemPassThru->AddPackFile(fullpath, pathID); } virtual FSAsyncStatus_t AsyncAppend(const char *pFileName, const void *pSrc, int nSrcBytes, bool bFreeMemory, FSAsyncControl_t *pControl) { return m_pFileSystemPassThru->AsyncAppend(pFileName, pSrc, nSrcBytes, bFreeMemory, pControl); } virtual FSAsyncStatus_t AsyncWrite(const char *pFileName, const void *pSrc, int nSrcBytes, bool bFreeMemory, bool bAppend, FSAsyncControl_t *pControl) { return m_pFileSystemPassThru->AsyncWrite( pFileName, pSrc, nSrcBytes, bFreeMemory, bAppend, pControl); } virtual FSAsyncStatus_t AsyncWriteFile(const char *pFileName, const CUtlBuffer *pSrc, int nSrcBytes, bool bFreeMemory, bool bAppend, FSAsyncControl_t *pControl) { return m_pFileSystemPassThru->AsyncWriteFile( pFileName, pSrc, nSrcBytes, bFreeMemory, bAppend, pControl); } virtual FSAsyncStatus_t AsyncAppendFile(const char *pDestFileName, const char *pSrcFileName, FSAsyncControl_t *pControl) { return m_pFileSystemPassThru->AsyncAppendFile(pDestFileName, pSrcFileName, pControl); } virtual void AsyncFinishAll(int iToPriority) { m_pFileSystemPassThru->AsyncFinishAll(iToPriority); } virtual void AsyncFinishAllWrites() { m_pFileSystemPassThru->AsyncFinishAllWrites(); } virtual FSAsyncStatus_t AsyncSetPriority(FSAsyncControl_t hControl, int newPriority) { return m_pFileSystemPassThru->AsyncSetPriority(hControl, newPriority); } virtual bool AsyncSuspend() { return m_pFileSystemPassThru->AsyncSuspend(); } virtual bool AsyncResume() { return m_pFileSystemPassThru->AsyncResume(); } virtual const char *RelativePathToFullPath( const char *pFileName, const char *pPathID, OUT_Z_CAP(maxLenInChars) char *pDest, int maxLenInChars, PathTypeFilter_t pathFilter = FILTER_NONE, PathTypeQuery_t *pPathType = NULL) { return m_pFileSystemPassThru->RelativePathToFullPath( pFileName, pPathID, pDest, maxLenInChars, pathFilter, pPathType); } virtual int GetSearchPath(const char *pathID, bool bGetPackFiles, OUT_Z_CAP(maxLenInChars) char *pDest, int maxLenInChars) { return m_pFileSystemPassThru->GetSearchPath(pathID, bGetPackFiles, pDest, maxLenInChars); } virtual FileHandle_t OpenEx(const char *pFileName, const char *pOptions, unsigned flags = 0, const char *pathID = 0, char **ppszResolvedFilename = NULL) { return m_pFileSystemPassThru->OpenEx(pFileName, pOptions, flags, pathID, ppszResolvedFilename); } virtual int ReadEx(void *pOutput, int destSize, int size, FileHandle_t file) { return m_pFileSystemPassThru->ReadEx(pOutput, destSize, size, file); } virtual int ReadFileEx(const char *pFileName, const char *pPath, void **ppBuf, bool bNullTerminate, bool bOptimalAlloc, int nMaxBytes = 0, int nStartingByte = 0, FSAllocFunc_t pfnAlloc = NULL) { return m_pFileSystemPassThru->ReadFileEx( pFileName, pPath, ppBuf, bNullTerminate, bOptimalAlloc, nMaxBytes, nStartingByte, pfnAlloc); } #if defined(TRACK_BLOCKING_IO) virtual void EnableBlockingFileAccessTracking(bool state) { m_pFileSystemPassThru->EnableBlockingFileAccessTracking(state); } virtual bool IsBlockingFileAccessEnabled() const { return m_pFileSystemPassThru->IsBlockingFileAccessEnabled(); } virtual IBlockingFileItemList *RetrieveBlockingFileAccessInfo() { return m_pFileSystemPassThru->RetrieveBlockingFileAccessInfo(); } #endif virtual void SetupPreloadData() {} virtual void DiscardPreloadData() {} virtual void LoadCompiledKeyValues(KeyValuesPreloadType_t type, char const *archiveFile) { m_pFileSystemPassThru->LoadCompiledKeyValues(type, archiveFile); } // If the "PreloadedData" hasn't been purged, then this'll try and instance // the KeyValues using the fast path of compiled keyvalues loaded during // startup. Otherwise, it'll just fall through to the regular KeyValues // loading routines virtual KeyValues *LoadKeyValues(KeyValuesPreloadType_t type, char const *filename, char const *pPathID = 0) { return m_pFileSystemPassThru->LoadKeyValues(type, filename, pPathID); } virtual bool LoadKeyValues(KeyValues &head, KeyValuesPreloadType_t type, char const *filename, char const *pPathID = 0) { return m_pFileSystemPassThru->LoadKeyValues(head, type, filename, pPathID); } virtual bool ExtractRootKeyName(KeyValuesPreloadType_t type, char *outbuf, size_t bufsize, char const *filename, char const *pPathID = 0) { return m_pFileSystemPassThru->ExtractRootKeyName(type, outbuf, bufsize, filename, pPathID); } virtual bool GetFileTypeForFullPath(char const *pFullPath, wchar_t *buf, size_t bufSizeInBytes) { return m_pFileSystemPassThru->GetFileTypeForFullPath(pFullPath, buf, bufSizeInBytes); } virtual bool GetOptimalIOConstraints(FileHandle_t hFile, unsigned *pOffsetAlign, unsigned *pSizeAlign, unsigned *pBufferAlign) { return m_pFileSystemPassThru->GetOptimalIOConstraints( hFile, pOffsetAlign, pSizeAlign, pBufferAlign); } virtual void *AllocOptimalReadBuffer(FileHandle_t hFile, unsigned nSize, unsigned nOffset) { return m_pFileSystemPassThru->AllocOptimalReadBuffer(hFile, nOffset, nSize); } virtual void FreeOptimalReadBuffer(void *p) { m_pFileSystemPassThru->FreeOptimalReadBuffer(p); } virtual void BeginMapAccess() { m_pFileSystemPassThru->BeginMapAccess(); } virtual void EndMapAccess() { m_pFileSystemPassThru->EndMapAccess(); } virtual bool ReadToBuffer(FileHandle_t hFile, CUtlBuffer &buf, int nMaxBytes = 0, FSAllocFunc_t pfnAlloc = NULL) { return m_pFileSystemPassThru->ReadToBuffer(hFile, buf, nMaxBytes, pfnAlloc); } virtual bool FullPathToRelativePathEx(const char *pFullPath, const char *pPathId, OUT_Z_CAP(maxLenInChars) char *pDest, int maxLenInChars) { return m_pFileSystemPassThru->FullPathToRelativePathEx( pFullPath, pPathId, pDest, maxLenInChars); } virtual int GetPathIndex(const FileNameHandle_t &handle) { return m_pFileSystemPassThru->GetPathIndex(handle); } virtual long GetPathTime(const char *pPath, const char *pPathID) { return m_pFileSystemPassThru->GetPathTime(pPath, pPathID); } virtual DVDMode_t GetDVDMode() { return m_pFileSystemPassThru->GetDVDMode(); } virtual void EnableWhitelistFileTracking(bool bEnable, bool bCacheAllVPKHashes, bool bRecalculateAndCheckHashes) { m_pFileSystemPassThru->EnableWhitelistFileTracking( bEnable, bCacheAllVPKHashes, bRecalculateAndCheckHashes); } virtual void RegisterFileWhitelist(IPureServerWhitelist *pWhiteList, IFileList **ppFilesToReload) OVERRIDE { m_pFileSystemPassThru->RegisterFileWhitelist(pWhiteList, ppFilesToReload); } virtual void MarkAllCRCsUnverified() { m_pFileSystemPassThru->MarkAllCRCsUnverified(); } virtual void CacheFileCRCs(const char *pPathname, ECacheCRCType eType, IFileList *pFilter) { return m_pFileSystemPassThru->CacheFileCRCs(pPathname, eType, pFilter); } virtual EFileCRCStatus CheckCachedFileHash(const char *pPathID, const char *pRelativeFilename, int nFileFraction, FileHash_t *pFileHash) { return m_pFileSystemPassThru->CheckCachedFileHash( pPathID, pRelativeFilename, nFileFraction, pFileHash); } virtual int GetUnverifiedFileHashes(CUnverifiedFileHash *pFiles, int nMaxFiles) { return m_pFileSystemPassThru->GetUnverifiedFileHashes(pFiles, nMaxFiles); } virtual int GetWhitelistSpewFlags() { return m_pFileSystemPassThru->GetWhitelistSpewFlags(); } virtual void SetWhitelistSpewFlags(int spewFlags) { m_pFileSystemPassThru->SetWhitelistSpewFlags(spewFlags); } virtual void InstallDirtyDiskReportFunc(FSDirtyDiskReportFunc_t func) { m_pFileSystemPassThru->InstallDirtyDiskReportFunc(func); } virtual FileCacheHandle_t CreateFileCache() { return m_pFileSystemPassThru->CreateFileCache(); } virtual void AddFilesToFileCache(FileCacheHandle_t cacheId, const char **ppFileNames, int nFileNames, const char *pPathID) { m_pFileSystemPassThru->AddFilesToFileCache(cacheId, ppFileNames, nFileNames, pPathID); } virtual bool IsFileCacheFileLoaded(FileCacheHandle_t cacheId, const char *pFileName) { return m_pFileSystemPassThru->IsFileCacheFileLoaded(cacheId, pFileName); } virtual bool IsFileCacheLoaded(FileCacheHandle_t cacheId) { return m_pFileSystemPassThru->IsFileCacheLoaded(cacheId); } virtual void DestroyFileCache(FileCacheHandle_t cacheId) { m_pFileSystemPassThru->DestroyFileCache(cacheId); } virtual bool RegisterMemoryFile( CMemoryFileBacking *pFile, CMemoryFileBacking **ppExistingFileWithRef) { return m_pFileSystemPassThru->RegisterMemoryFile(pFile, ppExistingFileWithRef); } virtual void UnregisterMemoryFile(CMemoryFileBacking *pFile) { m_pFileSystemPassThru->UnregisterMemoryFile(pFile); } virtual void CacheAllVPKFileHashes(bool bCacheAllVPKHashes, bool bRecalculateAndCheckHashes) { return m_pFileSystemPassThru->CacheAllVPKFileHashes( bCacheAllVPKHashes, bRecalculateAndCheckHashes); } virtual bool CheckVPKFileHash(int PackFileID, int nPackFileNumber, int nFileFraction, MD5Value_t &md5Value) { return m_pFileSystemPassThru->CheckVPKFileHash( PackFileID, nPackFileNumber, nFileFraction, md5Value); } virtual void NotifyFileUnloaded(const char *pszFilename, const char *pPathId) OVERRIDE { m_pFileSystemPassThru->NotifyFileUnloaded(pszFilename, pPathId); } protected: IFileSystem *m_pFileSystemPassThru; }; // This is so people who change the filesystem interface are forced to add the // passthru wrapper into CFileSystemPassThru, so they don't break VMPI. inline void GiveMeACompileError() { CFileSystemPassThru asdf; } #endif // FILESYSTEM_PASSTHRU_H