Exemplo n.º 1
0
/*
========================
idProfileMgr::OnLoadSettingsCompleted
========================
*/
void idProfileMgr::OnLoadSettingsCompleted( idSaveLoadParms* parms )
{





	// Don't process if error already detected
	if( parms->errorCode != SAVEGAME_E_NONE )
	{
		return;
	}
	
	// Serialize the loaded profile
	idFile_SaveGame** profileFileContainer = FindFromGenericPtr( parms->files, SAVEGAME_PROFILE_FILENAME );
	idFile_SaveGame* profileFile = profileFileContainer == NULL ? NULL : *profileFileContainer;
	
	bool foundProfile = profileFile != NULL && profileFile->Length() > 0;
	
	if( foundProfile )
	{
		idTempArray< byte > buffer( MAX_PROFILE_SIZE );
		
		// Serialize settings from this buffer
		profileFile->MakeReadOnly();
		unsigned int originalChecksum;
		profileFile->ReadBig( originalChecksum );
		
		int dataLength = profileFile->Length() - ( int )sizeof( originalChecksum );
		profileFile->ReadBigArray( buffer.Ptr(), dataLength );
		
		// Validate the checksum before we let the game serialize the settings
		unsigned int checksum = MD5_BlockChecksum( buffer.Ptr(), dataLength );
		if( originalChecksum != checksum )
		{
			idLib::Warning( "Checksum: 0x%08x, originalChecksum: 0x%08x, size = %d", checksum, originalChecksum, dataLength );
			parms->errorCode = SAVEGAME_E_CORRUPTED;
		}
		else
		{
			idBitMsg msg;
			msg.InitRead( buffer.Ptr(), ( int )buffer.Size() );
			idSerializer ser( msg, false );
			if( !profile->Serialize( ser ) )
			{
				parms->errorCode = SAVEGAME_E_CORRUPTED;
			}
		}
		
	}
	else
	{
		parms->errorCode = SAVEGAME_E_FILE_NOT_FOUND;
	}
}
Exemplo n.º 2
0
/*
========================
idSessionLocal::LoadGameCheckDescriptionFile
========================
*/
bool idSessionLocal::LoadGameCheckDescriptionFile( idSaveLoadParms & parms ) {
	idFile_SaveGame ** detailsFile = FindFromGenericPtr( parms.files, SAVEGAME_DETAILS_FILENAME );
	if ( detailsFile == NULL ) {
		parms.errorCode = SAVEGAME_E_FILE_NOT_FOUND;
		return false;
	}

	assert( *detailsFile != NULL );
	(*detailsFile)->MakeReadOnly();

	if ( !SavegameReadDetailsFromFile( *detailsFile, parms.description ) ) {
		parms.errorCode = SAVEGAME_E_CORRUPTED;
	} else {
		if ( parms.description.GetSaveVersion() > BUILD_NUMBER ) {
			parms.errorCode = SAVEGAME_E_INCOMPATIBLE_NEWER_VERSION;
		}
	}

	return ( parms.GetError() == SAVEGAME_E_NONE );
}