source-engine/tracker/AdminServer/MasterMsgHandler.cpp

77 lines
2.0 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================
#include "MasterMsgHandler.h"
#include "IGameList.h"
#include "serverpage.h"
#include <VGUI_Controls.h>
#include <VGUI_IVGui.h>
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CMasterMsgHandler::CMasterMsgHandler( IGameList *baseobject, HANDLERTYPE type, void *typeinfo /*= NULL*/ )
: CMsgHandler( type, typeinfo )
{
m_pGameList = baseobject;
}
//-----------------------------------------------------------------------------
// Purpose: Process cracked message
//-----------------------------------------------------------------------------
bool CMasterMsgHandler::Process( netadr_t *from, CMsgBuffer *msg )
{
// Skip the control character
msg->ReadByte();
// Skip the return character
msg->ReadByte();
// Get the batch ID
int unique = msg->ReadLong();
// Remainder of message length is 6 byte IP addresses
int nNumAddresses = msg->GetCurSize() - msg->GetReadCount();
assert( !( nNumAddresses % 6 ) );
// Each address is 6 bytes long
nNumAddresses /= 6;
while (nNumAddresses-- > 0)
{
serveritem_t server;
memset(&server, 0, sizeof(server));
for (int i = 0; i < 4; i++)
{
server.ip[i] = msg->ReadByte();
}
server.port = msg->ReadShort();
server.port = (server.port & 0xff) << 8 | (server.port & 0xff00) >> 8; // roll your own ntohs
server.received = 0;
server.listEntry = NULL;
server.doNotRefresh = false;
server.hadSuccessfulResponse = false;
server.map[0] = 0;
server.gameDir[0] = 0;
m_pGameList->AddNewServer(server);
}
if (!unique)
{
m_pGameList->ListReceived(false, 0);
}
else
{
// wait until we've refreshed the list before getting next batch of servers
m_pGameList->ListReceived(true, unique);
}
return true;
}