You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.2 KiB
112 lines
3.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
//=======================================================================================// |
|
|
|
#include "cl_recordingsessionblock.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//---------------------------------------------------------------------------------------- |
|
|
|
CClientRecordingSessionBlock::CClientRecordingSessionBlock( IReplayContext *pContext ) |
|
: CBaseRecordingSessionBlock( pContext ), |
|
m_uBytesDownloaded( 0 ), |
|
m_nDownloadStatus( DOWNLOADSTATUS_WAITING ), |
|
m_nHttpError( HTTP_ERROR_NONE ), |
|
m_bDataInvalid( false ), |
|
m_nDownloadAttempts( 0 ) |
|
{ |
|
} |
|
|
|
bool CClientRecordingSessionBlock::NeedsUpdate() const |
|
{ |
|
// TODO: Is this correct? |
|
return m_nDownloadStatus != DOWNLOADSTATUS_DOWNLOADED; |
|
} |
|
|
|
bool CClientRecordingSessionBlock::ShouldDownloadNow() const |
|
{ |
|
return m_nRemoteStatus == STATUS_READYFORDOWNLOAD && |
|
m_nDownloadStatus == DOWNLOADSTATUS_READYTODOWNLOAD; |
|
} |
|
|
|
bool CClientRecordingSessionBlock::DownloadedSuccessfully() const |
|
{ |
|
return m_nDownloadStatus == DOWNLOADSTATUS_DOWNLOADED && |
|
m_nHttpError == HTTP_ERROR_NONE; |
|
} |
|
|
|
bool CClientRecordingSessionBlock::Read( KeyValues *pIn ) |
|
{ |
|
if ( !BaseClass::Read( pIn ) ) |
|
return false; |
|
|
|
m_nDownloadStatus = (DownloadStatus_t)pIn->GetInt( "download_status" ); |
|
m_nHttpError = (HTTPError_t)pIn->GetInt( "download_error" ); |
|
m_uBytesDownloaded = (uint32)pIn->GetInt( "bytes_downloaded", 0 ); |
|
m_bDataInvalid = pIn->GetInt( "data_invalid", 0 ) != 0; |
|
|
|
// Read relative path and construct full path - must have a filename |
|
const char *pBlockFile = pIn->GetString( "filename" ); |
|
if ( !V_strlen( pBlockFile ) ) |
|
{ |
|
AssertMsg( 0, "No block filename!" ); |
|
return false; |
|
} |
|
|
|
V_snprintf( m_szFullFilename, sizeof( m_szFullFilename ), "%s%s", GetPath(), pBlockFile ); |
|
|
|
return true; |
|
} |
|
|
|
void CClientRecordingSessionBlock::Write( KeyValues *pOut ) |
|
{ |
|
BaseClass::Write( pOut ); |
|
|
|
pOut->SetInt( "download_status", (int)m_nDownloadStatus ); |
|
pOut->SetInt( "download_error", (int)m_nHttpError ); |
|
pOut->SetInt( "bytes_downloaded", m_uBytesDownloaded ); |
|
pOut->SetInt( "data_invalid", (int)m_bDataInvalid ); |
|
|
|
// Get just the filename and write that |
|
pOut->SetString( "filename", V_UnqualifiedFileName( m_szFullFilename ) ); |
|
} |
|
|
|
void CClientRecordingSessionBlock::OnDelete() |
|
{ |
|
BaseClass::OnDelete(); |
|
|
|
// Remove the actual binary block file itself |
|
g_pFullFileSystem->RemoveFile( m_szFullFilename ); |
|
} |
|
|
|
bool CClientRecordingSessionBlock::AttemptToResetForDownload() |
|
{ |
|
// Attempt to download again? |
|
if ( ++m_nDownloadAttempts < 3 ) |
|
{ |
|
DBG( "Trying downloading again.\n" ); |
|
|
|
m_nDownloadStatus = CClientRecordingSessionBlock::DOWNLOADSTATUS_READYTODOWNLOAD; |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
bool CClientRecordingSessionBlock::ValidateData( const void *pData, int nSize, unsigned char *pOutHash/*=NULL*/ ) const |
|
{ |
|
unsigned char aDigest[16]; |
|
if ( !g_pEngine->MD5_HashBuffer( aDigest, (const unsigned char *)pData, nSize, NULL ) ) |
|
return false; |
|
|
|
if ( pOutHash ) |
|
{ |
|
V_memcpy( pOutHash, aDigest, sizeof( aDigest ) ); |
|
} |
|
|
|
return V_memcmp( aDigest, m_aHash, sizeof( m_aHash ) ) == 0; |
|
} |
|
|
|
//----------------------------------------------------------------------------------------
|
|
|