source-engine-2018-hl2_src/replay/baserecordingsessionblock.h

109 lines
3.6 KiB
C
Raw Permalink Normal View History

2020-04-23 00:56:21 +08:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
//=======================================================================================//
#ifndef BASERECORDINGSESSIONBLOCK_H
#define BASERECORDINGSESSIONBLOCK_H
#ifdef _WIN32
#pragma once
#endif
//----------------------------------------------------------------------------------------
#include "replay/replayhandle.h"
#include "replay/basereplayserializeable.h"
#include "genericpersistentmanager.h"
#include "baserecordingsession.h"
#include "utlstring.h"
#include "compression.h"
//----------------------------------------------------------------------------------------
class KeyValues;
class CBaseReplayContext;
class IReplayContext;
//----------------------------------------------------------------------------------------
class CBaseRecordingSessionBlock : public CBaseReplaySerializeable
{
typedef CBaseReplaySerializeable BaseClass;
public:
CBaseRecordingSessionBlock( IReplayContext *pContext );
//
// IReplaySerializeable
//
virtual const char *GetSubKeyTitle() const;
virtual const char *GetPath() const;
virtual bool Read( KeyValues *pIn );
virtual void Write( KeyValues *pOut );
virtual void OnDelete();
enum RemoteStatus_t
{
STATUS_INVALID = -2,
STATUS_ERROR = -1,
STATUS_WRITING,
STATUS_READYFORDOWNLOAD,
MAX_STATUS
};
static const char *GetRemoteStatusStringSafe( RemoteStatus_t nStatus );
enum Error_t
{
ERROR_NONE,
ERROR_NOTONDISK, // The replay was lost somehow - eg a server crash before the replay had a chance to write to disk
ERROR_WRITEFAILED, // The disk write somehow failed
};
bool ReadHash( KeyValues *pIn, const char *pHashName );
void WriteHash( KeyValues *pOut, const char *pHashName ) const;
bool HasValidHash() const;
// Get a filled out sub key specifically for writing to the session info file
void WriteSessionInfoDataToBuffer( CUtlBuffer &buf ) const;
RemoteStatus_t m_nRemoteStatus; // This represents the block's status on the server
Error_t m_nHttpError;
int32 m_iReconstruction; // For client-side reconstruction of sessions, this represents the index of the given block
ReplayHandle_t m_hSession; // What session is this partial replay a part of?
uint32 m_uFileSize; // Size in bytes of the binary block file (if compressed, this represents the compressed file size)
uint32 m_uUncompressedSize; // If compressed, this represents the uncompressed file size
char m_szFullFilename[512]; // Filename for the .block file itself.
// NOTE: On the server, full path info is written - on client, only filename is written
CompressorType_t m_nCompressorType; // What type of compressor/decompressor was/should be used, if any? Can be COMPRESSORTYPE_INVALID if not compressed.
uint8 m_aHash[16]; // Server sets this and client compares to validate downloaded block data
bool m_bHashValid; // Do we have a valid hash?
IReplayContext *m_pContext;
};
//----------------------------------------------------------------------------------------
//
// For serializing blocks - format version implied in header.
//
// In case this format changes, we have some legroom (m_aUnused).
//
struct RecordingSessionBlockSpec_t
{
int32 m_iReconstruction;
uint8 m_uRemoteStatus;
uint8 m_aHash[16];
int8 m_nCompressorType;
uint32 m_uFileSize;
uint32 m_uUncompressedSize;
uint8 m_aUnused[8];
};
#define MIN_SESSION_INFO_PAYLOAD_SIZE sizeof( RecordingSessionBlockSpec_t )
//----------------------------------------------------------------------------------------
#endif // BASERECORDINGSESSIONBLOCK_H