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