//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Holds function bodies for GCSDK // //============================================================================= #include "stdafx.h" #include "gcmsg.h" #include "msgprotobuf.h" #include "tier0/memdbgoff.h" #ifdef GC namespace GCSDK { IMPLEMENT_CLASS_MEMPOOL( CStructNetPacket, 1000, UTLMEMORYPOOL_GROW_SLOW ); } #endif // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" namespace GCSDK { CUtlString GCMsgHdr_t::GetHeaderDescription( ) { CUtlString desc; desc.Format( "gc msg %s, SteamID %llu", PchMsgNameFromEMsg( m_eMsg ), m_ulSteamID ); return desc; } CUtlString GCMsgHdrEx_t::GetHeaderDescription( ) { CUtlString desc; desc.Format( "gc msg %s, SteamID %llu, version %hd, job source %llu, job target %llu", PchMsgNameFromEMsg( m_eMsg ), m_ulSteamID, m_nHdrVersion, m_JobIDSource, m_JobIDTarget ); return desc; } CUtlString GCMsgInterHdr_t::GetHeaderDescription( ) { CUtlString desc; desc.Format( "gc inter msg %s, SourceAppID %d, version %hd, job source %llu, job target %llu", PchMsgNameFromEMsg( m_eMsg ), m_unSourceAppId, m_nHdrVersion, m_JobIDSource, m_JobIDTarget ); return desc; } //----------------------------------------------------------------------------- // Purpose: Takes a pNetPacket, then converts it to the appropriate actual message // type and return the IMsgNetPacket interface. //----------------------------------------------------------------------------- IMsgNetPacket *IMsgNetPacketFromCNetPacket( CNetPacket *pNetPacket ) { uint32 cubPkt = pNetPacket->CubData(); uint8* pubPkt = pNetPacket->PubData(); if ( cubPkt >= sizeof( ProtoBufMsgHeader_t ) && ( ( ( ProtoBufMsgHeader_t *) pubPkt )->m_EMsgFlagged & k_EMsgProtoBufFlag ) ) { CProtoBufNetPacket *pMsgNetPacket = new CProtoBufNetPacket( pNetPacket, GCProtoBufMsgSrc_Unspecified, CSteamID(), 0, 0x7FFFFFFF & ( ( ProtoBufMsgHeader_t *) pubPkt )->m_EMsgFlagged ); if ( !pMsgNetPacket->IsValid() ) { pMsgNetPacket->Release(); return NULL; } return pMsgNetPacket; } else { if ( cubPkt >= sizeof( GCMsgHdrEx_t ) ) { CStructNetPacket *pMsgNetPacket = (CStructNetPacket*)malloc( sizeof( CStructNetPacket ) ); Construct( pMsgNetPacket, pNetPacket ); return pMsgNetPacket; } } EmitError( SPEW_GC, "IMsgNetPacketFromCNetPacket: malformed packet, size %d bytes\n", cubPkt ); for ( uint32 i = 0 ; i < cubPkt ; i += 16 ) { char buf[512]; char *d = buf; d += Q_snprintf(d, 12, "%08X:", i ); for ( uint32 j = i ; j < i+16 && j < cubPkt ; ++j ) { d += Q_snprintf(d, 8, " %02X", pubPkt[j] ); } *d = '\0'; EmitError( SPEW_GC, "%s\n", buf ); } AssertMsg( false, "IMsgNetPacketFromCNetPacket couldn't detect any appropriate msg format, returning NULL." ); return NULL; } } // namespace GCSDK