| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** Confidential - Westwood Studios ***
- ***********************************************************************************************
- * *
- * Project Name : Commando *
- * *
- * $Archive:: /Commando/Code/Combat/ffactorylist.cpp $*
- * *
- * $Author:: Patrick $*
- * *
- * $Modtime:: 2/21/02 3:22p $*
- * *
- * $Revision:: 8 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "ffactorylist.h"
- #include "wwfile.h"
- FileFactoryListClass * FileFactoryListClass::Instance = NULL;
- /*
- **
- */
- FileFactoryListClass::FileFactoryListClass( void ) :
- SearchStartIndex( 0 ),
- TempFactory( NULL )
- {
- WWASSERT( Instance == NULL );
- Instance = this;
- }
- FileFactoryListClass::~FileFactoryListClass( void )
- {
- WWASSERT( Instance == this );
- Instance = NULL;
- }
- /*
- **
- */
- void FileFactoryListClass::Add_FileFactory( FileFactoryClass * factory, const char *name )
- {
- FactoryList.Add( factory );
- FactoryNameList.Add( name );
- Reset_Search_Start ();
- }
- /*
- **
- */
- void FileFactoryListClass::Remove_FileFactory( FileFactoryClass * factory )
- {
- for (int index = 0; index < FactoryList.Count (); index ++) {
- //
- // If this is the factory we're looking for, then remove
- // it from the list.
- //
- if (FactoryList[index] == factory) {
- FactoryList.Delete (index);
- FactoryNameList.Delete (index);
- Reset_Search_Start ();
- break;
- }
- }
- return ;
- }
- /***********************************************************************************************
- * FileFactoryListClass::Remove_FileFactory -- Remove any old file factory *
- * *
- * *
- * *
- * INPUT: Nothing *
- * *
- * OUTPUT: Ptr to removed factory. NULL if none in the list *
- * *
- * WARNINGS: None *
- * *
- * HISTORY: *
- * 9/7/2001 4:40PM ST : Created *
- *=============================================================================================*/
- FileFactoryClass *FileFactoryListClass::Remove_FileFactory(void)
- {
- FileFactoryClass *factory = NULL;
- if (FactoryList.Count()) {
- factory = FactoryList[0];
- FactoryList.Delete(0);
- FactoryNameList.Delete(0);
- }
- Reset_Search_Start ();
- return(factory);
- }
- void FileFactoryListClass::Add_Temp_FileFactory( FileFactoryClass * factory )
- {
- WWASSERT( TempFactory == NULL );
- TempFactory = factory;
- }
- FileFactoryClass * FileFactoryListClass::Remove_Temp_FileFactory( void )
- {
- FileFactoryClass * factory = TempFactory;
- TempFactory = NULL;
- return factory;
- }
- FileClass * FileFactoryListClass::Get_File( char const *filename )
- {
- // Very kludgly...
- // Then the temp factory
- if ( TempFactory ) {
- FileClass * file = TempFactory->Get_File( filename );
- if ( file != NULL ) {
- if ( file->Is_Available() ) {
- return file;
- } else {
- TempFactory->Return_File( file );
- }
- }
- }
- // Try the first in the list...
- if ( SearchStartIndex < FactoryList.Count() ) {
- FileClass * file = FactoryList[SearchStartIndex]->Get_File( filename );
- if ( file != NULL ) {
- if ( file->Is_Available() ) {
- return file;
- } else {
- FactoryList[SearchStartIndex]->Return_File( file );
- }
- }
- }
- // Then try the rest
- for ( int i = 0; i < FactoryList.Count(); i++ ) {
- if (i != SearchStartIndex) {
- FileClass * file = FactoryList[i]->Get_File( filename );
- if ( file != NULL ) {
- if ( file->Is_Available() ) {
- return file;
- } else {
- FactoryList[i]->Return_File( file );
- }
- }
- }
- }
- // Failed!
- // Just use the first and don't check for available
- if ( FactoryList.Count() > 0 ) {
- FileClass * file = FactoryList[0]->Get_File( filename );
- if ( file != NULL ) {
- return file;
- }
- }
- return NULL;
- }
- void FileFactoryListClass::Return_File( FileClass *file )
- {
- // This is kinda bad. Just return it to the first one. (Since they all do the same thing)
- FactoryList[0]->Return_File( file );
- }
- void FileFactoryListClass::Set_Search_Start( const char *name )
- {
- SearchStartIndex = 0;
- //
- // Try to find which mix file we should start searching from...
- //
- for (int index = 0; index < FactoryNameList.Count (); index ++) {
- if (FactoryNameList[index].Compare_No_Case( name ) == 0) {
- SearchStartIndex = index;
- break;
- }
- }
- return ;
- }
|