allow VFS drivers to register themselves
This commit is contained in:
@@ -124,6 +124,30 @@ void RageFileDriver::FlushDirCache( const CString &sPath )
|
||||
FDB->FlushDirCache();
|
||||
}
|
||||
|
||||
|
||||
const struct FileDriverEntry *g_FileDriverList = NULL;
|
||||
|
||||
FileDriverEntry::FileDriverEntry( CString Type )
|
||||
{
|
||||
m_Link = g_FileDriverList;
|
||||
g_FileDriverList = this;
|
||||
m_Type = Type;
|
||||
}
|
||||
|
||||
FileDriverEntry::~FileDriverEntry()
|
||||
{
|
||||
g_FileDriverList = NULL; /* invalidate */
|
||||
}
|
||||
|
||||
RageFileDriver *MakeFileDriver( CString Type, CString Root )
|
||||
{
|
||||
for( const FileDriverEntry *p = g_FileDriverList; p; p = p->m_Link )
|
||||
if( !p->m_Type.CompareNoCase(Type) )
|
||||
return p->Create( Root );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Copyright (c) 2003 by the person(s) listed below. All rights reserved.
|
||||
* Glenn Maynard
|
||||
|
||||
@@ -52,5 +52,17 @@ public:
|
||||
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
|
||||
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
static struct FileDriverEntry_DIR: public FileDriverEntry
|
||||
{
|
||||
FileDriverEntry_DIR(): FileDriverEntry( "DIR" ) { }
|
||||
RageFileDriver *Create( CString Root ) const { return new RageFileDriverDirect( Root ); }
|
||||
} const g_RegisterDriver;
|
||||
|
||||
/* This driver handles direct file access. */
|
||||
class DirectFilenameDB: public FilenameDB
|
||||
{
|
||||
|
||||
@@ -72,6 +72,12 @@ freely, subject to the following restrictions:
|
||||
|
||||
#define INBUFSIZE 1024*4
|
||||
|
||||
static struct FileDriverEntry_ZIP: public FileDriverEntry
|
||||
{
|
||||
FileDriverEntry_ZIP(): FileDriverEntry( "ZIP" ) { }
|
||||
RageFileDriver *Create( CString Root ) const { return new RageFileDriverZip( Root ); }
|
||||
} const g_RegisterDriver;
|
||||
|
||||
struct FileInfo
|
||||
{
|
||||
CString fn;
|
||||
|
||||
@@ -68,6 +68,11 @@ RageFileManager::RageFileManager()
|
||||
ld.MountPoint = "";
|
||||
g_Drivers.push_back( ld );
|
||||
|
||||
MountInitialFilesystems();
|
||||
}
|
||||
|
||||
void RageFileManager::MountInitialFilesystems()
|
||||
{
|
||||
/* Add file search paths, higher priority first. */
|
||||
#if defined(XBOX)
|
||||
RageFileManager::Mount( "dir", SYS_BASE_PATH, "" );
|
||||
@@ -210,17 +215,6 @@ bool RageFileManager::Remove( const CString &sPath )
|
||||
return Deleted;
|
||||
}
|
||||
|
||||
#include "RageFileDriverDirect.h"
|
||||
#include "RageFileDriverZip.h"
|
||||
RageFileDriver *MakeFileDriver( CString Type, CString Root )
|
||||
{
|
||||
if( !Type.CompareNoCase("DIR") )
|
||||
return new RageFileDriverDirect( Root );
|
||||
if( !Type.CompareNoCase("ZIP") )
|
||||
return new RageFileDriverZip( Root );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void RageFileManager::Mount( CString Type, CString Root, CString MountPoint )
|
||||
{
|
||||
LockMut( *g_Mutex );
|
||||
|
||||
@@ -36,6 +36,7 @@ public:
|
||||
|
||||
private:
|
||||
RageFileObj *OpenForWriting( const CString &sPath, int mode, RageFile &p, int &err );
|
||||
void MountInitialFilesystems();
|
||||
};
|
||||
|
||||
extern RageFileManager *FILEMAN;
|
||||
|
||||
Reference in New Issue
Block a user