You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.0 KiB
76 lines
2.0 KiB
//========= 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;
|
|
}
|
|
|