The-Simpsons-Hit-and-Run/game/code/loading/consolefilehandler.cpp

238 lines
6.5 KiB
C++

//=============================================================================
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
//
// File: consolefilehandler.cpp
//
// Description: Implement ConsoleFileHandler
//
// History: 3/25/2002 + Created -- Darwin Chau
//
//=============================================================================
//========================================
// System Includes
//========================================
#include <string.h>
// Pure 3D
#include <p3d/utility.hpp>
// Foundation Tech
#include <raddebug.hpp>
//========================================
// Project Includes
//========================================
#include <loading/consolefilehandler.h>
#include <memory/srrmemory.h>
#include <console/console.h>
//******************************************************************************
//
// Global Data, Local Data, Local Classes
//
//******************************************************************************
//******************************************************************************
//
// Public Member Functions
//
//******************************************************************************
//==============================================================================
// ConsoleFileHandler::ConsoleFileHandler
//==============================================================================
// Description: Constructor.
//
// Parameters: None.
//
// Return: N/A.
//
//==============================================================================
ConsoleFileHandler::ConsoleFileHandler()
:
mpConsoleFile( 0 ),
mAsyncLoadState( NONE ),
mFileDataBuffer( 0 )
{
}
//==============================================================================
// ConsoleFileHandler::~ConsoleFileHandler
//==============================================================================
// Description: Destructor.
//
// Parameters: None.
//
// Return: N/A.
//
//==============================================================================
ConsoleFileHandler::~ConsoleFileHandler()
{
}
//==============================================================================
// ConsoleFileHandler::LoadFile
//==============================================================================
//
// Description: Load a Pure3D file asynchronously.
//
// Parameters: filename - fully qualified path and filename
// pCallback - client callback to invoke when load is complete
// pUserData - optional client supplied user data
//
// Return: None.
//
//==============================================================================
void ConsoleFileHandler::LoadFile
(
const char* filename,
FileHandler::LoadFileCallback* pCallback,
void* pUserData,
GameMemoryAllocator heap
)
{
rAssert( filename );
rAssert( pCallback );
mpCallback = pCallback;
// by default, use FTT IRadFiles
//
mAsyncLoadState = OPENFILE;
radFileOpen( &mpConsoleFile,
filename,
false,
OpenExisting,
NormalPriority,
0,
GMA_TEMP );
rAssert( mpConsoleFile != 0 );
mpConsoleFile->AddCompletionCallback( this,
reinterpret_cast<void*>(pUserData) );
}
//==============================================================================
// ConsoleFileHandler::OnFileOperationsComplete
//==============================================================================
//
// Description: Pure3D (via FTech) invokes this callback when the async load
// is complete.
//
// Parameters: pUserData - optional client supplied user data
//
// Return: None.
//
//==============================================================================
void ConsoleFileHandler::OnFileOperationsComplete( void* pUserData )
{
switch( mAsyncLoadState )
{
case OPENFILE:
{
MEMTRACK_PUSH_GROUP( "ConsoleFileHandler" );
unsigned int length = mpConsoleFile->GetSize();
mFileDataBuffer = new(GMA_TEMP) char[length + 1];
mpConsoleFile->ReadAsync( mFileDataBuffer, length );
mpConsoleFile->AddCompletionCallback( this, (void*)pUserData );
mAsyncLoadState = READDATA;
MEMTRACK_POP_GROUP("ConsoleFileHandler");
}
break;
case READDATA:
{
unsigned int length = mpConsoleFile->GetSize();
mFileDataBuffer[length] = '\0';
GetConsole()->Evaluate( mFileDataBuffer, mpConsoleFile->GetFilename() );
delete[]( GMA_TEMP, mFileDataBuffer );
mFileDataBuffer = 0;
mpConsoleFile->Release();
mpConsoleFile = 0;
mAsyncLoadState = DONE;
//
// Percolate the callback up to the client. This must be done last!!!
//
mpCallback->OnLoadFileComplete( pUserData );
}
break;
default:
{
rAssert( 0 );
}
}
}
//==============================================================================
// ConsoleFileHandler::LoadFileSync
//==============================================================================
//
// Description: Load a Pure3D file synchronously.
//
// Parameters: filename - fully qualified path and filename
//
// Return: None.
//
//==============================================================================
void ConsoleFileHandler::LoadFileSync( const char* filename )
{
MEMTRACK_PUSH_GROUP( "ConsoleFileHandler" );
rAssert( filename );
radFileOpen( &mpConsoleFile,
filename,
false,
OpenExisting,
NormalPriority,
0,
GMA_TEMP );
rAssert( mpConsoleFile != 0 );
mpConsoleFile->WaitForCompletion();
unsigned int length = mpConsoleFile->GetSize();
mFileDataBuffer = new(GMA_TEMP) char[length + 1];
mpConsoleFile->ReadAsync( mFileDataBuffer, length );
mpConsoleFile->WaitForCompletion();
mFileDataBuffer[length] = '\0';
GetConsole()->Evaluate( mFileDataBuffer, filename );
delete[]( GMA_TEMP, mFileDataBuffer );
mFileDataBuffer = 0;
mpConsoleFile->Release();
mpConsoleFile = 0;
MEMTRACK_POP_GROUP("ConsoleFileHandler");
}
//******************************************************************************
//
// Private Member Functions
//
//******************************************************************************