//========= 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 #include #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