//====== Copyright (c), Valve Corporation, All rights reserved. =======
//
// Purpose: Holds the CNetPacket class
//
//=============================================================================


#include "stdafx.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"


namespace GCSDK
{

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CNetPacket::CNetPacket()
{
	m_cRef = 0;
	m_pubData = NULL;
	m_cubData = 0;
}


//-----------------------------------------------------------------------------
// Purpose: Destructor, validates refcount
//-----------------------------------------------------------------------------
CNetPacket::~CNetPacket()
{
	Assert( m_cRef == 0 );
}


//-----------------------------------------------------------------------------
// Purpose: Inits all members
// Input  : hConnection - connection we're from
//			pubData - message data
//			cubData - message size
//			*pubNetworkBuffer - network buffer that contains the message
//								assumes control of this memory
//-----------------------------------------------------------------------------
void CNetPacket::Init( uint32 cubData, const void* pCopyData )
{
	Assert( cubData );

	m_pubData = (uint8 *)g_MemPoolMsg.Alloc( cubData );
	m_cubData = cubData;
	
	if( pCopyData )
	{
		Q_memcpy( m_pubData, pCopyData, cubData );
	}

	AddRef();
}


//-----------------------------------------------------------------------------
// Purpose: adds to refcount
//-----------------------------------------------------------------------------
void CNetPacket::AddRef()		
{ 
	++m_cRef;
}

//-----------------------------------------------------------------------------
void CNetPacket::InitAdoptBuffer( uint32 cubData, uint8* pubData )
{
	Assert( !m_pubData );
	
	m_pubData = pubData;
	m_cubData = cubData;

	AddRef();
}

//-----------------------------------------------------------------------------
void CNetPacket::OrphanBuffer()
{
	m_pubData = NULL;
	m_cubData = 0;
}

//-----------------------------------------------------------------------------
// Purpose: decrements refcount 
//-----------------------------------------------------------------------------
void CNetPacket::Release()	
{ 
	Assert( m_cRef > 0 );
	if ( --m_cRef == 0 ) 
	{
		// delete the network buffer we're associated with, if we have one
		if ( m_pubData )
		{
			g_MemPoolMsg.Free( m_pubData );
		}
		// delete ourselves
		g_cNetPacket--;
		CNetPacketPool::sm_MemPoolNetPacket.Free( this );
	}
}

} // namespace GCSDK