//**************************************************************************** //** //** VFS.H //** Header - Virtual File System //** //** Project: VFS //** Component: VFS //** Author: Michael Walter //** //** History: //** 18.06.2001 Created (Michael Walter) //**************************************************************************** #ifndef __VFS_H__ #define __VFS_H__ //============================================================================ // INTERFACE REQUIRED HEADERS //============================================================================ #include "VFS_Types.h" //============================================================================ // INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS //============================================================================ // The Handle Type. enum VFS_Handle { VFS_HANDLE_FORCE_DWORD = 0xFFFFFFFF }; // The current Version. const VFS_DWORD VFS_VERSION = 0x0100; const VFS_CHAR VFS_PATH_SEPARATOR = VFS_TEXT( '/' ); const VFS_CHAR* VFS_ARCHIVE_FILE_EXTENSION = VFS_TEXT( "PAK" ); const VFS_Handle VFS_INVALID_HANDLE = ( VFS_Handle ) 0; const VFS_DWORD VFS_ERROR = 0xFFFFFFFF; // The File_Open/Create() Flags. enum VFS_OpenFlags { VFS_READ = 0x0001, VFS_WRITE = 0x0002 }; // The File_Seek() Origin. enum VFS_SeekOrigin { VFS_SET, VFS_CURRENT, VFS_END }; // The Error Constants. enum VFS_ErrorCode { VFS_ERROR_NONE, VFS_ERROR_NOT_INITIALIZED_YET, VFS_ERROR_ALREADY_INITIALIZED, VFS_ERROR_ALREADY_EXISTS, VFS_ERROR_NOT_FOUND, VFS_ERROR_INVALID_PARAMETER, VFS_ERROR_GENERIC, VFS_ERROR_READ_ONLY, VFS_NUM_ERRORS }; // The Type of an Entity enum VFS_EntityType { VFS_FILE, VFS_DIRECTORY, VFS_ARCHIVE_FILE }; // The Filter Reader and Writer Procedures. typedef VFS_BOOL ( *VFS_FilterReadProc )( VFS_BYTE* pBuffer, VFS_DWORD dwBytesToRead, VFS_DWORD* pBytesRead = NULL ); typedef VFS_BOOL ( *VFS_FilterWriteProc )( VFS_BYTE* pBuffer, VFS_DWORD dwBytesToWrite, VFS_DWORD* pBytesWritten = NULL ); // An Iteration Procedure. typedef VFS_BOOL ( *VFS_DirIterationProc )( struct VFS_EntityInfo* pInfo ); // A List of Filter Names. typedef std::vector< class VFS_Filter* > VFS_FilterList; typedef std::vector< VFS_String > VFS_FilterNameList; typedef std::vector< VFS_String > VFS_RootPathList; typedef std::vector< struct VFS_EntityInfo > VFS_EntityInfoList; typedef std::vector< VFS_String > VFS_FileNameList; //============================================================================ // INTERFACE COMPONENT HEADERS //============================================================================ //============================================================================ // INTERFACE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES //============================================================================ //============================================================================ // INTERFACE STRUCTURES / UTILITY CLASSES //============================================================================ // A Filter for the VFS. class VFS_Filter { public: // Constructor. VFS_Filter( const VFS_String& strName, const VFS_String& strDescription ) : m_strName( strName ), m_strDescription( strDescription ) {} // The Filter's Name. VFS_String m_strName; // The Filter's Description. VFS_String m_strDescription; // Encoding / Decoding Procedures. virtual VFS_BOOL Encode( VFS_FilterReadProc Reader, VFS_FilterWriteProc Writer ); virtual VFS_BOOL Decode( VFS_FilterReadProc Reader, VFS_FilterWriteProc Writer ); // Filter State Management. virtual VFS_BOOL LoadData( VFS_FilterReadProc Reader ); virtual VFS_BOOL SaveData( VFS_FilterWriteProc Writer ); }; // Information about a VFS Entity. struct VFS_EntityInfo { // The Entity Type. VFS_EntityType eType; // Is the Entity archived (Archive files are NEVER archived)? VFS_BOOL bArchived; // The complete Path and the Name. VFS_String strPath; VFS_String strName; // The Size ( 0 for Directories ). VFS_LONGLONG dwSize; }; // A tree entry of an entity information tree. struct VFS_ContentTreeEntry { // A pointer to the parent. VFS_ContentTreeEntry* pParent; // A pointer to the previous sibling. VFS_ContentTreeEntry* pPrev; // A pointer to the next sibling. VFS_ContentTreeEntry* pNext; // A pointer to the first child entry ( NULL for files ). VFS_ContentTreeEntry* pChild; // The entity information record. VFS_EntityInfo Info; }; //============================================================================ // INTERFACE DATA DECLARATIONS //============================================================================ //============================================================================ // INTERFACE FUNCTION PROTOTYPES //============================================================================ /////////////////////////////////////////////////////////////////////////////// // Basic VFS Interface. /////////////////////////////////////////////////////////////////////////////// // Initialize / Shutdown the VFS. VFS_BOOL VFS_Init(); VFS_BOOL VFS_Shutdown(); VFS_BOOL VFS_IsInit(); // Register / Unregister a Filter. VFS_BOOL VFS_RegisterFilter( VFS_Filter* pFilter ); VFS_BOOL VFS_UnregisterFilter( VFS_Filter* pFilter ); VFS_BOOL VFS_UnregisterFilter( VFS_DWORD dwIndex ); VFS_BOOL VFS_UnregisterFilter( const VFS_String& strFilterName ); VFS_BOOL VFS_ExistsFilter( const VFS_String& strFilterName ); const VFS_Filter* VFS_GetFilter( const VFS_String& strFilterName ); VFS_DWORD VFS_GetNumFilters(); const VFS_Filter* VFS_GetFilter( VFS_DWORD dwIndex ); VFS_BOOL VFS_GetFilters( VFS_FilterList& Filters ); VFS_BOOL VFS_GetFilterNames( VFS_FilterNameList& FilterNames ); // Root Path Handling. VFS_BOOL VFS_AddRootPath( const VFS_String& strRootPath ); VFS_BOOL VFS_RemoveRootPath( const VFS_String& strRootPath ); VFS_BOOL VFS_RemoveRootPath( VFS_DWORD dwIndex ); VFS_DWORD VFS_GetNumRootPaths(); VFS_BOOL VFS_GetRootPath( VFS_DWORD dwIndex, VFS_String& strRootPath ); VFS_BOOL VFS_GetRootPaths( VFS_RootPathList& RootPaths ); // Flush the VFS (close all unused Archives etc). VFS_BOOL VFS_Flush(); // Information. VFS_BOOL VFS_ExistsEntity( const VFS_String& strPath ); VFS_BOOL VFS_GetEntityInfo( const VFS_String& strPath, VFS_EntityInfo& Info ); VFS_WORD VFS_GetVersion(); // Error Handling. VFS_ErrorCode VFS_GetLastError(); VFS_BOOL VFS_GetErrorString( VFS_ErrorCode eError, VFS_String& Error ); /////////////////////////////////////////////////////////////////////////////// // The File Interface (the file interface will try to create a file in each root path. If no root path has been added, the current directory will be used instead). /////////////////////////////////////////////////////////////////////////////// // Create / Open / Close a File. VFS_Handle VFS_File_Create( const VFS_String& strFile, VFS_DWORD dwFlags ); VFS_Handle VFS_File_Open( const VFS_String& strFile, VFS_DWORD dwFlags ); VFS_BOOL VFS_File_Close( VFS_Handle hHandle ); // Read / Write from / to the File. VFS_BOOL VFS_File_Read( VFS_Handle hHandle, VFS_BYTE* pBuffer, VFS_DWORD dwToRead, VFS_DWORD* pRead = NULL ); VFS_BOOL VFS_File_Write( VFS_Handle hHandle, const VFS_BYTE* pBuffer, VFS_DWORD dwToWrite, VFS_DWORD* pWritten = NULL ); // Direct File Reading / Writing. VFS_BOOL VFS_File_ReadEntireFile( const VFS_String& strFile, VFS_BYTE* pByte ); VFS_BOOL VFS_File_WriteEntireFile( const VFS_String& strFile, const VFS_BYTE* pBuffer, VFS_DWORD dwToWrite, VFS_DWORD* dwWritten ); // Positioning. VFS_BOOL VFS_File_Seek( VFS_Handle hHandle, VFS_LONGLONG dwPos, VFS_SeekOrigin eOrigin = VFS_SET ); VFS_LONGLONG VFS_File_Tell( VFS_Handle hHandle ); // Sizing. VFS_BOOL VFS_File_Resize( VFS_Handle hHandle, VFS_LONGLONG dwSize ); VFS_LONGLONG VFS_File_GetSize( VFS_Handle hHandle ); // Information. VFS_BOOL VFS_File_Exists( const VFS_String& strFile ); VFS_BOOL VFS_File_GetInfo( const VFS_String& strFile, VFS_EntityInfo& Info ); VFS_BOOL VFS_File_GetInfo( VFS_Handle hHandle, VFS_EntityInfo& Info ); // File Management. VFS_BOOL VFS_File_Delete( const VFS_String& strFile ); VFS_BOOL VFS_File_Copy( const VFS_String& strFrom, const VFS_String& strTo ); VFS_BOOL VFS_File_Move( const VFS_String& strFrom, const VFS_String& strTo ); VFS_BOOL VFS_File_Rename( const VFS_String& strFrom, const VFS_String& strTo ); // pszTo has to be a single File Name without a Path. // Set the Filters used by a File (file must exist be an Archive). VFS_BOOL VFS_File_SetUsedFilters( const VFS_String& strFile, const VFS_FilterNameList& Filters ); VFS_BOOL VFS_File_GetUsedFilters( const VFS_String& strFile, VFS_FilterNameList& Filters ); /////////////////////////////////////////////////////////////////////////////// // The Archive Interface (Never provide a extension for the archive, instead, change the VFS_ARCHIVE_EXTENSION definition and recompile; I removed some functions because they seemed to become to slow, such as VFS_AddFile() and so. You can only create archives in the first root path). /////////////////////////////////////////////////////////////////////////////// // Create an Archive. VFS_BOOL VFS_Archive_CreateFromDirectory( const VFS_String& strArchive, const VFS_String& strDirectory, const VFS_FilterNameList& DefaultFilters, VFS_BOOL bRecursive = VFS_TRUE ); VFS_BOOL VFS_Archive_CreateFromFileList( const VFS_String& strArchive, const VFS_FileNameList& Files, const VFS_FilterNameList& DefaultFilters ); // Set the default Filters for an Archive VFS_BOOL VFS_Archive_SetDefaultFilters( const VFS_String& strArchive, const VFS_FilterNameList& Filters ); VFS_BOOL VFS_Archive_GetDefaultFilters( const VFS_String& strArchive, VFS_FilterNameList& Filters ); // Update the Filter List for an Archive. VFS_BOOL VFS_Archive_UpdateFilterList( const VFS_String& strArchive ); // Extract an Archive. VFS_BOOL VFS_Archive_Extract( const VFS_String& strArchive, const VFS_String& strTargetDir ); // Information. VFS_BOOL VFS_Archive_Exists( const VFS_String& strArchive ); VFS_BOOL VFS_Archive_GetInfo( const VFS_String& strDir, VFS_EntityInfo& Info ); // Archive Management. VFS_BOOL VFS_Archive_Delete( const VFS_String& strArchive ); // Flush the Archive System. VFS_BOOL VFS_Archive_Flush(); /////////////////////////////////////////////////////////////////////////////// // The Directory Interface (You can only create/delete standard directories in the first root path). /////////////////////////////////////////////////////////////////////////////// // Directory Management. VFS_BOOL VFS_Dir_Create( const VFS_String& strDir, VFS_BOOL bRecursive = VFS_FALSE ); // Recursive mode would create a directory c:\alpha\beta even if alpha doesn't exist. VFS_BOOL VFS_Dir_Delete( const VFS_String& strDir, VFS_BOOL bRecursive = VFS_FALSE ); // Recursive mode would delete a directory c:\alpha even if it contains files and/or subdirectories. // Information. VFS_BOOL VFS_Dir_Exists( const VFS_String& strDir ); VFS_BOOL VFS_Dir_GetInfo( const VFS_String& strDir, VFS_EntityInfo& Info ); // Iterate a Directory and call the iteration procedure for each VFS_BOOL VFS_Dir_Iterate( const VFS_String& strDir, VFS_DirIterationProc pIterationProc, VFS_BOOL bRecursive = VFS_FALSE ); // Get the Contents of a Directory. VFS_BOOL VFS_Dir_GetContents( const VFS_String& strDir, VFS_EntityInfoList& EntityInfoList, VFS_BOOL bRecursive = VFS_FALSE ); // Set the default Filters for a Directory (which must reside in an Archive). VFS_BOOL VFS_Dir_SetDefaultFilters( const VFS_String& strDir, const VFS_FilterNameList& Filters ); VFS_BOOL VFS_Dir_GetDefaultFilters( const VFS_String& strDir, VFS_FilterNameList& Filters ); // Get the Contents of a Directory as a tree structure. VFS_BOOL VFS_Dir_GetContentTree( const VFS_String& strDir, VFS_ContentTreeEntry*& First, VFS_BOOL bRecursive = VFS_FALSE ); VFS_BOOL VFS_Dir_FreeContentTree( VFS_ContentTreeEntry* pFirst ); /////////////////////////////////////////////////////////////////////////////// // The Utility Interface /////////////////////////////////////////////////////////////////////////////// // File Name Management Functions. VFS_BOOL VFS_Util_GetPath( const VFS_String& strFileName, VFS_String& pszPath ); VFS_BOOL VFS_Util_GetName( const VFS_String& strFileName, VFS_String& pszName ); VFS_BOOL VFS_Util_GetBaseName( const VFS_String& strFileName, VFS_String& pszBaseName ); VFS_BOOL VFS_Util_GetExtension( const VFS_String& strFileName, VFS_String& pszExtension ); //============================================================================ // INTERFACE OBJECT CLASS DEFINITIONS //============================================================================ //============================================================================ // INTERFACE TRAILING HEADERS //============================================================================ #endif // __VFS_H__