source-engine/engine/networkstringtable.h

213 lines
6.5 KiB
C
Raw Permalink Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef NETWORKSTRINGTABLE_H
#define NETWORKSTRINGTABLE_H
#ifdef _WIN32
#pragma once
#endif
#include "networkstringtabledefs.h"
#include "networkstringtableitem.h"
#include <utldict.h>
#include <utlbuffer.h>
#include "tier1/bitbuf.h"
class SVC_CreateStringTable;
class CBaseClient;
abstract_class INetworkStringDict
{
public:
virtual ~INetworkStringDict() {}
virtual unsigned int Count() = 0;
virtual void Purge() = 0;
virtual const char *String( int index ) = 0;
virtual bool IsValidIndex( int index ) = 0;
virtual int Insert( const char *pString ) = 0;
virtual int Find( const char *pString ) = 0;
virtual CNetworkStringTableItem &Element( int index ) = 0;
virtual const CNetworkStringTableItem &Element( int index ) const = 0;
};
//-----------------------------------------------------------------------------
// Purpose: Client/Server shared string table definition
//-----------------------------------------------------------------------------
class CNetworkStringTable : public INetworkStringTable
{
public:
// Construction
CNetworkStringTable( TABLEID id, const char *tableName, int maxentries, int userdatafixedsize, int userdatanetworkbits, bool bIsFilenames );
virtual ~CNetworkStringTable( void );
public:
// INetworkStringTable interface:
const char *GetTableName( void ) const;
TABLEID GetTableId( void ) const;
int GetNumStrings( void ) const;
int GetMaxStrings( void ) const;
int GetEntryBits( void ) const;
// Networking
void SetTick( int tick );
bool ChangedSinceTick( int tick ) const;
int AddString( bool bIsServer, const char *value, int length = -1, const void *userdata = NULL );
const char *GetString( int stringNumber );
void SetStringUserData( int stringNumber, int length, const void *userdata );
const void *GetStringUserData( int stringNumber, int *length );
int FindStringIndex( char const *string );
void SetStringChangedCallback( void *object, pfnStringChanged changeFunc );
bool HasFileNameStrings() const;
bool IsUserDataFixedSize() const;
int GetUserDataSizeBits() const;
int GetUserDataSize() const;
public:
#ifndef SHARED_NET_STRING_TABLES
int WriteUpdate( CBaseClient *client, bf_write &buf, int tick_ack );
void ParseUpdate( bf_read &buf, int entries );
// HLTV change history & rollback
void EnableRollback();
void RestoreTick(int tick);
// local backdoor tables
void SetMirrorTable( INetworkStringTable *table );
void UpdateMirrorTable( int tick_ack );
void CopyStringTable(CNetworkStringTable * table);
// buffer IO
void WriteStringTable( bf_write& buf );
bool ReadStringTable( bf_read& buf );
bool WriteBaselines( SVC_CreateStringTable &msg, char *msg_buffer, int msg_buffer_size );
#endif
void TriggerCallbacks( int tick_ack );
CNetworkStringTableItem *GetItem( int i );
// debug ouptput
virtual void Dump( void );
virtual void Lock( bool bLock );
void SetAllowClientSideAddString( bool state );
pfnStringChanged GetCallback();
protected:
void DataChanged( int stringNumber, CNetworkStringTableItem *item );
// Destroy string table
void DeleteAllStrings( void );
CNetworkStringTable( const CNetworkStringTable & ); // not implemented, not allowed
TABLEID m_id;
char *m_pszTableName;
// Must be a power of 2, so encoding can determine # of bits to use based on log2
int m_nMaxEntries;
int m_nEntryBits;
int m_nTickCount;
int m_nLastChangedTick;
bool m_bChangeHistoryEnabled : 1;
bool m_bLocked : 1;
bool m_bAllowClientSideAddString : 1;
bool m_bUserDataFixedSize : 1;
bool m_bIsFilenames : 1;
int m_nUserDataSize;
int m_nUserDataSizeBits;
// Change function callback
pfnStringChanged m_changeFunc;
// Optional context/object
void *m_pObject;
// pointer to local backdoor table
INetworkStringTable *m_pMirrorTable;
INetworkStringDict *m_pItems;
INetworkStringDict *m_pItemsClientSide; // For m_bAllowClientSideAddString, these items are non-networked and are referenced by a negative string index!!!
};
//-----------------------------------------------------------------------------
// Purpose: Implements game .dll string table interface
//-----------------------------------------------------------------------------
class CNetworkStringTableContainer : public INetworkStringTableContainer
{
public:
// Construction
CNetworkStringTableContainer( void );
~CNetworkStringTableContainer( void );
public:
// Implement INetworkStringTableContainer
INetworkStringTable *CreateStringTable( const char *tableName, int maxentries, int userdatafixedsize = 0, int userdatanetworkbits = 0 ) { return CreateStringTableEx( tableName, maxentries, userdatafixedsize, userdatanetworkbits, false ); }
INetworkStringTable *CreateStringTableEx( const char *tableName, int maxentries, int userdatafixedsize = 0, int userdatanetworkbits = 0, bool bIsFilenames = false );
void RemoveAllTables( void );
// table infos
INetworkStringTable *FindTable( const char *tableName ) const ;
INetworkStringTable *GetTable( TABLEID stringTable ) const;
int GetNumTables( void ) const;
virtual void SetAllowClientSideAddString( INetworkStringTable *table, bool bAllowClientSideAddString );
public:
// Update a client (called once during packet sending per client)
void SetTick( int tick_count);
#ifndef SHARED_NET_STRING_TABLES
// rollback feature
void EnableRollback( bool bState );
void RestoreTick( int tick );
// Buffer I/O
void WriteStringTables( bf_write& buf );
bool ReadStringTables( bf_read& buf );
void WriteUpdateMessage( CBaseClient *client, int tick_ack, bf_write &buf );
void WriteBaselines( bf_write &buf );
void DirectUpdate( int tick_ack ); // fill mirror table directly with updates
#endif
void TriggerCallbacks( int tick_ack ); // fire callback functions
// Guards so game .dll can't create tables at the wrong time
void AllowCreation( bool state );
// Print table data to console
void Dump( void );
// Sets the lock and returns the previous lock state
bool Lock( bool bLock );
void SetAllowClientSideAddString( bool state );
private:
bool m_bAllowCreation; // creat guard Guard
int m_nTickCount; // current tick
bool m_bLocked; // currently locked?
bool m_bEnableRollback; // enables rollback feature
CUtlVector < CNetworkStringTable* > m_Tables; // the string tables
};
#endif // NETWORKSTRINGTABLE_H