//====== Copyright c 1996-2007, Valve Corporation, All rights reserved. =======//
//
// Purpose: 
//
// $NoKeywords: $
//
//=============================================================================//

#ifndef VMFMESHDATASUPPORT_H
#define VMFMESHDATASUPPORT_H
#ifdef _WIN32
#pragma once
#endif

//////////////////////////////////////////////////////////////////////////
//
// Special implementation of custom load/save chunks for entities
//
//////////////////////////////////////////////////////////////////////////

#include "vmfentitysupport.h"

class CVmfMeshDataSupport_SaveLoadHandler : public IMapEntitySaveLoadHandler
{
public:
	CVmfMeshDataSupport_SaveLoadHandler();
	~CVmfMeshDataSupport_SaveLoadHandler();

public:
	virtual int GetCustomSectionVer() { return 1; }

public:
	virtual void SetCurrentEntity( IMapEntity_Type_t *pEntity ) { m_pEntity = pEntity; }

public:
	virtual ChunkFileResult_t LoadKeyValueBegin( CChunkFile *pFile );
	virtual ChunkFileResult_t LoadKeyValue( const char *szKey, const char *szValue );
	virtual ChunkFileResult_t LoadKeyValueEnd( CChunkFile *pFile, ChunkFileResult_t eLoadResult );

protected:
	ChunkFileResult_t LoadKeyValue_Hdr( const char *szKey, const char *szValue );
	ChunkFileResult_t LoadKeyValue_Ver1( const char *szKey, const char *szValue );

protected:
	ChunkFileResult_t WriteDataChunk( CChunkFile *pFile, char const *szHash );
	ChunkFileResult_t WriteBufferData( CChunkFile *pFile, CUtlBuffer &bufData, char const *szPrefix );
	void LoadInitHeader();
	bool LoadHaveHeader();
	ChunkFileResult_t LoadHaveLines( int numHaveLines );
	ChunkFileResult_t LoadSaveFullData();

protected:
	virtual ChunkFileResult_t OnFileDataLoaded( CUtlBuffer &bufData ) = 0;
	virtual ChunkFileResult_t OnFileDataWriting( CChunkFile *pFile, char const *szHash );

protected:
	enum State
	{
		LOAD_VERSION = 0,
		LOAD_HDR_END
	};
	enum StateVer1
	{
		LOAD_HASH = LOAD_HDR_END + 1,
		LOAD_PREFIX,
		LOAD_HEADER,
		LOAD_DATA
	};
	int m_eLoadState;
	int m_iLoadVer;

	struct Header_t
	{
		char sHash[ MAX_PATH ];
		char sPrefix[ MAX_PATH ];
		int numBytes;
		int numEncBytes;
		int numLines;
		int numHaveLines;
	}
	m_hLoadHeader;

	CUtlBuffer m_bufLoadData;
	IMapEntity_Type_t *m_pEntity;
};

#endif // #ifndef VMFMESHDATASUPPORT_H