allow VFS drivers to register themselves

This commit is contained in:
Glenn Maynard
2004-02-10 23:39:45 +00:00
parent e2e692f77a
commit 1b69bfdff9
6 changed files with 54 additions and 11 deletions
+24
View File
@@ -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
+12
View File
@@ -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
+6
View File
@@ -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
{
+6
View File
@@ -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;
+5 -11
View File
@@ -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 );
+1
View File
@@ -36,6 +36,7 @@ public:
private:
RageFileObj *OpenForWriting( const CString &sPath, int mode, RageFile &p, int &err );
void MountInitialFilesystems();
};
extern RageFileManager *FILEMAN;