aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/shared/saverestore_stringtable.h
blob: 3e2ba82161574a7b63d3699c7c5ccba5b50e1bc3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//

#ifndef SAVERESTORE_STRINGTABLE_H
#define SAVERESTORE_STRINGTABLE_H

#if defined( _WIN32 )
#pragma once
#endif


#include "isaverestore.h"
#include "networkstringtabledefs.h"


//-------------------------------------

class CStringTableSaveRestoreOps : public CDefSaveRestoreOps
{
public:
	void Init( INetworkStringTable* pNetworkStringTable )
	{
		m_pStringTable = pNetworkStringTable;
	}

	// save data type interface
	virtual void Save( const SaveRestoreFieldInfo_t &fieldInfo, ISave *pSave )
	{
		int *pStringIndex = (int *)fieldInfo.pField;
		const char *pString = m_pStringTable->GetString( *pStringIndex );
		int nLen = Q_strlen( pString ) + 1;
		pSave->WriteInt( &nLen );
		pSave->WriteString( pString );
	}
	
	virtual void Restore( const SaveRestoreFieldInfo_t &fieldInfo, IRestore *pRestore )
	{
		int *pStringIndex = (int *)fieldInfo.pField;
		int nLen = pRestore->ReadInt();
		char *pTemp = (char *)stackalloc( nLen );
		pRestore->ReadString( pTemp, nLen, nLen );
		*pStringIndex = m_pStringTable->AddString( CBaseEntity::IsServer(), pTemp );
	}
	
	virtual void MakeEmpty( const SaveRestoreFieldInfo_t &fieldInfo )
	{
		int *pStringIndex = (int *)fieldInfo.pField;
		*pStringIndex = INVALID_STRING_INDEX;
	}

	virtual bool IsEmpty( const SaveRestoreFieldInfo_t &fieldInfo )
	{
		int *pStringIndex = (int *)fieldInfo.pField;
		return *pStringIndex == INVALID_STRING_INDEX;
	}

private:
	INetworkStringTable *m_pStringTable;
};

#endif // SAVERESTORE_STRINGTABLE_H