From 1b69bfdff93081c8d800fdc649f9904dc9d8fc0c Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Tue, 10 Feb 2004 23:39:45 +0000 Subject: [PATCH] allow VFS drivers to register themselves --- stepmania/src/RageFileDriver.cpp | 24 ++++++++++++++++++++++++ stepmania/src/RageFileDriver.h | 12 ++++++++++++ stepmania/src/RageFileDriverDirect.cpp | 6 ++++++ stepmania/src/RageFileDriverZip.cpp | 6 ++++++ stepmania/src/RageFileManager.cpp | 16 +++++----------- stepmania/src/RageFileManager.h | 1 + 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/stepmania/src/RageFileDriver.cpp b/stepmania/src/RageFileDriver.cpp index c78ddcd376..b4ef95e339 100644 --- a/stepmania/src/RageFileDriver.cpp +++ b/stepmania/src/RageFileDriver.cpp @@ -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 diff --git a/stepmania/src/RageFileDriver.h b/stepmania/src/RageFileDriver.h index f657b91554..899b419245 100644 --- a/stepmania/src/RageFileDriver.h +++ b/stepmania/src/RageFileDriver.h @@ -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 diff --git a/stepmania/src/RageFileDriverDirect.cpp b/stepmania/src/RageFileDriverDirect.cpp index 620ad280d7..105bd18695 100644 --- a/stepmania/src/RageFileDriverDirect.cpp +++ b/stepmania/src/RageFileDriverDirect.cpp @@ -20,6 +20,12 @@ #include #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 { diff --git a/stepmania/src/RageFileDriverZip.cpp b/stepmania/src/RageFileDriverZip.cpp index b60c9b4a11..32d443fdcd 100644 --- a/stepmania/src/RageFileDriverZip.cpp +++ b/stepmania/src/RageFileDriverZip.cpp @@ -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; diff --git a/stepmania/src/RageFileManager.cpp b/stepmania/src/RageFileManager.cpp index ccf765ca5f..35d29fe102 100644 --- a/stepmania/src/RageFileManager.cpp +++ b/stepmania/src/RageFileManager.cpp @@ -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 ); diff --git a/stepmania/src/RageFileManager.h b/stepmania/src/RageFileManager.h index f85e44f8a8..5a562cef8b 100644 --- a/stepmania/src/RageFileManager.h +++ b/stepmania/src/RageFileManager.h @@ -36,6 +36,7 @@ public: private: RageFileObj *OpenForWriting( const CString &sPath, int mode, RageFile &p, int &err ); + void MountInitialFilesystems(); }; extern RageFileManager *FILEMAN;