This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Combat/ffactorylist.cpp

212 lines
6.8 KiB
C++

/*
** 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 ;
}