#ifndef RAGE_FILE_DRIVER_H #define RAGE_FILE_DRIVER_H #include "RageFile.h" #include "RageFileManager.h" class RageFileObj; class FilenameDB; class RageFileDriver { public: RageFileDriver( FilenameDB *db ) { FDB = db; } virtual ~RageFileDriver(); virtual RageFileObj *Open( const CString &path, int mode, RageFile &p, int &err ) = 0; virtual void GetDirListing( const CString &sPath, CStringArray &AddTo, bool bOnlyDirs, bool bReturnPathToo ); virtual RageFileManager::FileType GetFileType( const CString &sPath ); virtual int GetFileSizeInBytes( const CString &sFilePath ); virtual int GetFileHash( const CString &sPath ); virtual int GetPathValue( const CString &path ); virtual bool Ready() { return true; } /* see RageFileManager::MountpointIsReady */ virtual void FlushDirCache( const CString &sPath ); virtual bool Remove( const CString &sPath ) { return false; } protected: FilenameDB *FDB; }; class RageFileObj { protected: RageFile &parent; void SetError( const CString &err ); public: RageFileObj( RageFile &p ): parent(p) { } virtual ~RageFileObj() { } void ClearError(); // virtual CString RealPath() const { return parent->GetPath(); } virtual int Seek( int offset ); virtual int SeekCur( int offset ); virtual int GetFileSize(); virtual CString GetDisplayPath() const { return parent.GetRealPath(); } /* Raw I/O: */ virtual int Read(void *buffer, size_t bytes) = 0; virtual int Write(const void *buffer, size_t bytes) = 0; virtual int Flush() { return 0; } virtual void Rewind() = 0; virtual RageFileObj *Copy( RageFile &p ) const = 0; }; /* This is used to register the driver, so RageFileManager can see it. */ struct FileDriverEntry { FileDriverEntry( CString Type ); virtual ~FileDriverEntry(); virtual RageFileDriver *Create( CString Root ) const = 0; CString m_Type; const FileDriverEntry *m_Link; }; RageFileDriver *MakeFileDriver( CString Type, CString Root ); #endif