hl2_src-leak-2017/src/Tracker/AdminServer/serverpage.cpp

907 lines
24 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose:
//
// $Workfile: $
// $Date: $
//
//-----------------------------------------------------------------------------
// $Log: $
//
// $NoKeywords: $
//=============================================================================
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <assert.h>
// base vgui interfaces
#include <VGUI_Controls.h>
#include <VGUI_IInput.h>
#include <VGUI_ISurface.h>
#include <VGUI_IScheme.h>
#include <VGUI_IVGui.h>
#include <VGUI_MouseCode.h>
#include "filesystem.h"
// vgui controls
#include <VGUI_Button.h>
#include <VGUI_CheckButton.h>
#include <VGUI_ComboBox.h>
#include <VGUI_FocusNavGroup.h>
#include <VGUI_Frame.h>
#include <VGUI_KeyValues.h>
#include <VGUI_ListPanel.h>
#include <VGUI_MessageBox.h>
#include <VGUI_Panel.h>
#include <VGUI_PropertySheet.h>
#include <VGUI_ToggleButton.h>
#include <VGUI_QueryBox.h>
// serverbrowser headers
#include "inetapi.h"
//#include "msgbuffer.h"
#include "proto_oob.h"
#include "ServerContextMenu.h"
#include "socket.h"
#include "util.h"
#include "vinternetdlg.h"
#include "dialogcvarchange.h"
//#include "ModList.h"
#include "DialogGameInfo.h"
#include "ConfigPanel.h"
// game list
#include "FavoriteGames.h"
#include "GamePanelInfo.h"
// tracker stuff
//#include "Tracker.h"
#include "TrackerProtocol.h"
//#include "OnlineStatus.h"
// interface to game engine / tracker
#include "IRunGameEngine.h"
using namespace vgui;
static VInternetDlg *s_InternetDlg = NULL;
CSysModule * g_hTrackerNetModule = NULL;
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
VInternetDlg::VInternetDlg( unsigned int userid ) : Frame(NULL, "VInternetDlg")
{
s_InternetDlg = this;
m_iUserID=userid;
m_bLoggedIn=false;
MakePopup();
m_pSavedData = NULL;
// create the controls
m_pContextMenu = new CServerContextMenu(this);
// m_pContextMenu->SetVisible(false);
m_pFavoriteGames = new CFavoriteGames(this);
SetMinimumSize(570, 550);
m_pGameList = m_pFavoriteGames;
// property sheet
m_pTabPanel = new PropertySheet(this, "GameTabs");
m_pTabPanel->SetTabWidth(150);
// m_pTabPanel->SetScrolling(true);
m_pTabPanel->AddPage(m_pFavoriteGames, "My Servers");
m_pTabPanel->AddActionSignalTarget(this);
m_pStatusLabel = new Label(this, "StatusLabel", "");
LoadControlSettings("Admin\\DialogAdminServer.res");
m_pStatusLabel->SetText("");
// Setup tracker objects
// tracker doc
//g_pTrackerDoc = new CTrackerDoc();
// create the networking
/*m_pServerSession = new CServerSession();
// load networking dll
char szDLL[_MAX_PATH];
// now load the net interface so we can use it
g_pFullFileSystem->GetLocalPath("Friends/TrackerNET.dll", szDLL);
g_pFullFileSystem->GetLocalCopy(szDLL);
g_hTrackerNetModule = Sys_LoadModule(szDLL);
CreateInterfaceFn netFactory = Sys_GetFactory(g_hTrackerNetModule);
m_pNet = (ITrackerNET *)netFactory(TRACKERNET_INTERFACE_VERSION, NULL);
m_pNet->Initialize(27030, 27100);
m_iServerAddr=m_pNet->GetNetAddress("tracker3.valvesoftware.com:1200");
// uncomment this to do the "tracker" magic
//SendInitialLogin();
*/
// load filters
LoadFilters();
// load window settings
LoadDialogState(this, "AdminServer");
// let us be ticked every frame
ivgui()->AddTickSignal(this->GetVPanel());
}
//-----------------------------------------------------------------------------
// Purpose: Destructor
//-----------------------------------------------------------------------------
VInternetDlg::~VInternetDlg()
{
// set a flag indicating the threads should kill themselves
// m_pNet->Shutdown(false);
// m_pNet->deleteThis();
// m_pNet = NULL;
Sys_UnloadModule(g_hTrackerNetModule);
}
//-----------------------------------------------------------------------------
// Purpose: Called once to set up
//-----------------------------------------------------------------------------
void VInternetDlg::Initialize()
{
SetTitle("Admin", true);
SetVisible(false);
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : serverID -
// Output : serveritem_t
//-----------------------------------------------------------------------------
serveritem_t &VInternetDlg::GetServer(unsigned int serverID)
{
return m_pGameList->GetServer(serverID);
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void VInternetDlg::Open( void )
{
m_pTabPanel->RequestFocus();
// if serverbrowser file is not there we will try to transfer the favorites list.
FileHandle_t f = g_pFullFileSystem->Open("AdminServer.vdf", "rb");
if (f)
{
g_pFullFileSystem->Close( f );
}
surface()->SetMinimized(GetVPanel(), false);
SetVisible(true);
RequestFocus();
m_pTabPanel->RequestFocus();
MoveToFront();
}
//-----------------------------------------------------------------------------
// Purpose: relayouts the dialogs controls
//-----------------------------------------------------------------------------
void VInternetDlg::PerformLayout()
{
BaseClass::PerformLayout();
int x, y, wide, tall;
GetClientArea(x, y, wide, tall);
// game list in middle
m_pTabPanel->SetBounds(8, y + 8, GetWide() - 16, tall - (28));
x += 4;
// status text along bottom
m_pStatusLabel->SetBounds(x + 2, (tall - y) + 40, wide - 6, 20);
m_pStatusLabel->SetContentAlignment(Label::a_northwest);
Repaint();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void VInternetDlg::OnClose()
{
// bug here if you exit before logging in.
SaveDialogState(this, "AdminServer");
SaveFilters();
Frame::OnClose();
}
//-----------------------------------------------------------------------------
// Purpose: Loads filter settings from disk
//-----------------------------------------------------------------------------
void VInternetDlg::LoadFilters()
{
// free any old filters
if (m_pSavedData)
{
m_pSavedData->deleteThis();
}
m_pSavedData = new KeyValues ("Filters");
if (!m_pSavedData->LoadFromFile(g_pFullFileSystem, "Admin\\AdminServer.vdf", true, "PLATFORM"))
{
// file not successfully loaded, create the default key
m_pSavedData->FindKey("List", true);
m_pSavedData->FindKey("List/Default", true);
m_pSavedData->SetString("DefaultFilter", "Default");
}
// load favorite servers
KeyValues *favorites = m_pSavedData->FindKey("Favorites", true);
m_bSaveRcon= m_pSavedData->FindKey("SaveRcon", true)->GetInt();
m_pFavoriteGames->LoadFavoritesList(favorites,m_bSaveRcon);
m_bAutoRefresh= m_pSavedData->FindKey("AutoRefresh", true)->GetInt();
if(!m_bAutoRefresh)
{
m_iRefreshTime=0;
}
else
{
m_iRefreshTime= m_pSavedData->FindKey("RefreshTime", true)->GetInt();
}
m_bGraphs= m_pSavedData->FindKey("ShowGraphs", true)->GetInt();
if(!m_bGraphs)
{
m_iGraphsRefreshTime=0;
}
else
{
m_iGraphsRefreshTime= m_pSavedData->FindKey("GraphsRefreshTime", true)->GetInt();
}
m_bDoLogging= m_pSavedData->FindKey("GetLogs", true)->GetInt();
m_pTabPanel->SetActivePage(m_pFavoriteGames);
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void VInternetDlg::SaveFilters()
{
// get the favorites list
KeyValues *favorites = m_pSavedData->FindKey("Favorites", true);
m_pFavoriteGames->SaveFavoritesList(favorites,m_bSaveRcon);
m_pSavedData->SaveToFile(g_pFullFileSystem, "Admin\\AdminServer.vdf", "PLATFORM");
}
void VInternetDlg::SetConfig(bool autorefresh,bool savercon,int refreshtime,bool graphs,int graphsrefreshtime,bool getlogs)
{
m_bAutoRefresh=autorefresh;
m_bDoLogging = getlogs;
m_bSaveRcon=savercon;
if(m_bAutoRefresh)
{
m_iRefreshTime=refreshtime;
}
else
{
m_iRefreshTime=0;
}
m_bGraphs = graphs;
if(graphs)
{
m_iGraphsRefreshTime=graphsrefreshtime;
}
else
{
m_iGraphsRefreshTime=0;
}
m_pSavedData->SetInt("AutoRefresh",autorefresh);
m_pSavedData->SetInt("SaveRcon",savercon);
m_pSavedData->SetInt("RefreshTime",refreshtime);
m_pSavedData->SetInt("GraphsRefreshTime",graphsrefreshtime);
m_pSavedData->SetInt("ShowGraphs",graphs);
m_pSavedData->SetInt("GetLogs",getlogs);
}
//-----------------------------------------------------------------------------
// Purpose: Updates status test at bottom of window
// Input : *fmt -
// ... -
//-----------------------------------------------------------------------------
void VInternetDlg::UpdateStatusText(const char *fmt, ...)
{
if ( !m_pStatusLabel )
return;
char str[ 1024 ];
va_list argptr;
va_start( argptr, fmt );
vsprintf( str, fmt, argptr );
va_end( argptr );
m_pStatusLabel->SetText( str );
}
//-----------------------------------------------------------------------------
// Purpose: returns a pointer to a static instance of this dialog
// Output : VInternetDlg
//----------------------------------------------------------------------------
VInternetDlg *VInternetDlg::GetInstance()
{
return s_InternetDlg;
}
//-----------------------------------------------------------------------------
// Purpose:
// Output : CServerContextMenu
//-----------------------------------------------------------------------------
CServerContextMenu *VInternetDlg::GetContextMenu()
{
return m_pContextMenu;
}
//-----------------------------------------------------------------------------
// Purpose: begins the process of joining a server from a game list
// the game info dialog it opens will also update the game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::JoinGame(IGameList *gameList, unsigned int serverIndex)
{
// open the game info dialog, then mark it to attempt to connect right away
CDialogGameInfo *gameDialog = OpenGameInfoDialog(gameList, serverIndex);
// set the dialog name to be the server name
gameDialog->Connect();
return gameDialog;
}
//-----------------------------------------------------------------------------
// Purpose: joins a game by a specified IP, not attached to any game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::JoinGame(int serverIP, int serverPort, const char *titleName)
{
// open the game info dialog, then mark it to attempt to connect right away
CDialogGameInfo *gameDialog = OpenGameInfoDialog(serverIP, serverPort, titleName);
// set the dialog name to be the server name
gameDialog->Connect();
return gameDialog;
}
//-----------------------------------------------------------------------------
// Purpose: opens a game info dialog from a game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::OpenGameInfoDialog(IGameList *gameList, unsigned int serverIndex)
{
CDialogGameInfo *gameDialog = new CDialogGameInfo(gameList, serverIndex);
serveritem_t &server = gameList->GetServer(serverIndex);
gameDialog->Run(server.name);
return gameDialog;
}
//-----------------------------------------------------------------------------
// Purpose: opens a game info dialog by a specified IP, not attached to any game list
//-----------------------------------------------------------------------------
CDialogGameInfo *VInternetDlg::OpenGameInfoDialog(int serverIP, int serverPort, const char *titleName)
{
CDialogGameInfo *gameDialog = new CDialogGameInfo(NULL, 0, serverIP, serverPort);
gameDialog->Run(titleName);
return gameDialog;
}
//-----------------------------------------------------------------------------
// Purpose: Save position and window size of a dialog from the .vdf file.
// Input : *dialog - panel we are setting position and size
// *dialogName - name of dialog in the .vdf file
//-----------------------------------------------------------------------------
void VInternetDlg::SaveDialogState(Panel *dialog, const char *dialogName)
{
// write the size and position to the document
int x, y, wide, tall;
dialog->GetBounds(x, y, wide, tall);
KeyValues *data;
data = m_pSavedData->FindKey(dialogName, true);
data->SetInt("x", x);
data->SetInt("y", y);
data->SetInt("w", wide);
data->SetInt("t", tall);
}
//-----------------------------------------------------------------------------
// Purpose: Load position and window size of a dialog from the .vdf file.
// Input : *dialog - panel we are setting position and size
// *dialogName - name of dialog in the .vdf file
//-----------------------------------------------------------------------------
void VInternetDlg::LoadDialogState(Panel *dialog, const char *dialogName)
{
// read the size and position from the document
KeyValues *data;
data = m_pSavedData->FindKey(dialogName, true);
// calculate defaults, center of the screen
int x, y, wide, tall, dwide, dtall;
int nx, ny, nwide, ntall;
vgui::surface()->GetScreenSize(wide, tall);
dialog->GetSize(dwide, dtall);
x = (int)((wide - dwide) * 0.5);
y = (int)((tall - dtall) * 0.5);
// set dialog
nx = data->GetInt("x", x);
ny = data->GetInt("y", y);
nwide = data->GetInt("w", dwide);
ntall = data->GetInt("t", dtall);
// make sure it's on the screen. If it isn't, move it over so it is.
if (nx + nwide > wide)
{
nx = wide - nwide;
}
if (ny + ntall > tall)
{
ny = tall - ntall;
}
if (nx < 0)
{
nx = 0;
}
if (ny < 0)
{
ny = 0;
}
dialog->SetBounds(nx, ny, nwide, ntall);
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *dest -
// *src -
// bufsize -
//-----------------------------------------------------------------------------
void v_strncpy(char *dest, const char *src, int bufsize)
{
if (src == dest)
return;
strncpy(dest, src, bufsize - 1);
dest[bufsize - 1] = 0;
}
void VInternetDlg::ConfigPanel()
{
CConfigPanel *config = new CConfigPanel(m_bAutoRefresh,m_bSaveRcon,m_iRefreshTime,m_bGraphs,m_iGraphsRefreshTime,m_bDoLogging);
config->Run();
}
void VInternetDlg::OnManageServer(int serverID)
{
int i;
serveritem_t &server = m_pFavoriteGames->GetServer(serverID);
netadr_t addr;
memcpy(addr.ip,server.ip,4);
addr.port=(server.port & 0xff) << 8 | (server.port & 0xff00) >> 8;
addr.type=NA_IP;
const char *netString = net->AdrToString(&addr);
char tabName[20];
for(i=0;i<m_pTabPanel->GetNumPages();i++)
{
m_pTabPanel->GetTabTitle(i,tabName,20);
if(!stricmp(netString,tabName))
{
break;
}
}
if(i==m_pTabPanel->GetNumPages())
{
if(m_bSaveRcon)
{ // rcons are being saved
if(strlen(server.rconPassword)>0)
{ // this rcon password is already saved :)
ManageServer(serverID,server.rconPassword);
return;
}
}
// otherwise ask for an rcon password
CDialogCvarChange *box = new CDialogCvarChange();
char id[5];
_snprintf(id,5,"%i",serverID);
box->AddActionSignalTarget(this);
box->SetTitle("Enter Rcon Password",true);
box->SetLabelText("CvarNameLabel","");
box->SetLabelText("PasswordLabel","Password:");
box->MakePassword();
box->Activate(id, "","rconpassword","Enter Rcon Password for this Server");
}
else
{
m_pTabPanel->SetActivePage(m_pTabPanel->GetPage(i));
}
}
void VInternetDlg::OnPlayerDialog(vgui::KeyValues *data)
{
const char *type=data->GetString("type");
const char *playerName=data->GetString("player");
if(!stricmp(type,"rconpassword"))
{
const char *value=data->GetString("value");
serveritem_t &server = m_pFavoriteGames->GetServer(atoi(playerName)); // we encode the serverid in the name field :)
strncpy(server.rconPassword,value,sizeof(server.rconPassword)); // save this password
ManageServer(atoi(playerName),value);
}
}
void VInternetDlg::ManageServer(int serverID,const char *pass)
{
serveritem_t &server = m_pFavoriteGames->GetServer(serverID);
netadr_t addr;
memcpy(addr.ip,server.ip,4);
addr.port=(server.port & 0xff) << 8 | (server.port & 0xff00) >> 8;
addr.type=NA_IP;
m_pGamePanelInfo = new CGamePanelInfo(this,"Current Server",server.gameDir,m_iRefreshTime,m_iGraphsRefreshTime,m_bDoLogging);
m_pTabPanel->AddPage(m_pGamePanelInfo,net->AdrToString(&addr) );
m_pGamePanelInfo->ChangeGame(server,pass);
m_pTabPanel->SetActivePage(m_pGamePanelInfo);
}
void VInternetDlg::UpdateServer(serveritem_t &server)
{
m_pFavoriteGames->UpdateServer(server);
}
void VInternetDlg::OnDeleteServer(int chosenPanel)
{
Panel *delPanel =m_pTabPanel->GetPage(chosenPanel);
m_pTabPanel->DeletePage(delPanel);
InvalidateLayout();
Repaint();
}
vgui::PropertySheet *VInternetDlg::GetTabPanel()
{
return m_pTabPanel;
}
void VInternetDlg::OnOpenContextMenu()
{
// CServerContextMenu *menu = VInternetDlg::GetInstance()->GetContextMenu();
// no selected rows, so don't display default stuff in menu
if( m_pTabPanel->GetActiveTab()->IsCursorOver() ||
m_pFavoriteGames->IsCursorOver() )
{
m_pContextMenu->ShowMenu(this, -1, false, false, false,false);
}
}
void VInternetDlg::OnTick()
{
//FIX ME!!!
return;
/*
// get the latest raw messages
IBinaryBuffer *buf;
CNetAddress address;
while ((buf = m_pNet->GetIncomingRawData(address)) != NULL)
{
//ReceivedRawData(buf, address);
buf->Release();
}
// get all the latest messages
IReceiveMessage *recv;
while ((recv = m_pNet->GetIncomingData()) != NULL)
{
// make sure the message is valid
if (!CheckMessageValidity(recv))
return;
// record the reception
// m_iLastReceivedTime = m_iTime;
// find the message id in the dispatch table
int dataName = recv->GetMsgID();
switch(dataName)
{
case TSVC_CHALLENGE:
{
int ChallengeKey;
int status = COnlineStatus::ONLINE;
int heartbeatRate =10000;//GetHeartBeatRate();
recv->ReadInt("challenge", ChallengeKey);
recv->ReadUInt("sessionID", m_iSessionID);
// respond to the challenge
ISendMessage *reply = CreateServerMessage(TCLS_RESPONSE);
reply->SetSessionID( m_iSessionID );
reply->WriteInt("challenge", ChallengeKey);
reply->WriteUInt("sessionID", m_iSessionID);
reply->WriteInt("status", status);
reply->WriteInt("build", 1994);
reply->WriteInt("hrate", heartbeatRate); // heartbeat rate to expect
//m_iPreviousHeartBeatRateSentToServer = heartbeatRate;
// reset the login timeout
//m_iLoginTimeout = system()->getTimeMillis() + COnlineStatus::SERVERCONNECT_TIMEOUT;
m_pNet->SendMessage(reply, NET_RELIABLE);
}
break;
case TSVC_LOGINOK:
{
int newStatus;
recv->ReadInt("status", newStatus);
m_bLoggedIn=true;
SearchForFriend(0, "ar@cfgn.net", "", "", "");
}
break;
case TSVC_FRIENDSFOUND:
{
//char name[60];
int serverID,sessionID;
recv->ReadInt("uid",m_iRemoteUID);
recv->ReadInt("serverid",serverID);
recv->ReadInt("sessionID",sessionID);
// create the message to the server
ISendMessage *msg = CreateServerMessage(TCLS_ROUTETOFRIEND);
// write in the redirection info
msg->WriteInt("rID", TCL_MESSAGE);
msg->WriteUInt("rUserID", m_iRemoteUID);
msg->WriteUInt("rSessionID", sessionID);
msg->WriteUInt("rServerID", serverID);
msg->WriteBlob("rData", "Hello", 5);
m_pNet->SendMessage(msg, NET_RELIABLE);
// lets log off
msg = CreateServerMessage(TCLS_HEARTBEAT);
msg->WriteInt("status", COnlineStatus::OFFLINE);
m_pNet->SendMessage(msg, NET_RELIABLE);
// m_pNet->Shutdown(true);
// m_pNet->deleteThis();
// SendStatusToServer(COnlineStatus::OFFLINE);
}
break;
default:
{
while(recv->AdvanceField())
{
char data[512];
const char *nm=recv->GetFieldName();
recv->ReadString(nm, data, 512);
}
}
break;
// { TSVC_CHALLENGE, CServerSession::ReceivedMsg_Challenge },
// { TSVC_LOGINOK, CServerSession::ReceivedMsg_LoginOK },
// { TSVC_LOGINFAIL, CServerSession::ReceivedMsg_LoginFail },
// { TSVC_DISCONNECT, CServerSession::ReceivedMsg_Disconnect },
// { TSVC_FRIENDS, CServerSession::ReceivedMsg_Friends },
// { TSVC_FRIENDUPDATE, CServerSession::ReceivedMsg_FriendUpdate },
// { TSVC_GAMEINFO, CServerSession::ReceivedMsg_GameInfo },
// { TSVC_HEARTBEAT, CServerSession::ReceivedMsg_Heartbeat },
// { TSVC_PINGACK, CServerSession::ReceivedMsg_PingAck },
//default:
// break;
}
//ReceivedData(recv);
m_pNet->ReleaseMessage(recv);
}
// get the latest fails
while ((recv = m_pNet->GetFailedMessage()) != NULL)
{
m_pNet->ReleaseMessage(recv);
}
// now let it update itself
m_pNet->RunFrame();
*/
}
void VInternetDlg::SearchForFriend(unsigned int uid, const char *email, const char *username, const char *firstname, const char *lastname)
{
ISendMessage *msg = CreateServerMessage(TCLS_FRIENDSEARCH);
msg->WriteUInt("uid", uid);
msg->WriteString("Email", email);
msg->WriteString("UserName", username);
msg->WriteString("FirstName", firstname);
msg->WriteString("LastName", lastname);
m_pNet->SendMessage(msg, NET_RELIABLE);
}
ISendMessage *VInternetDlg::CreateServerMessage(int msgID)
{
ISendMessage *msg = m_pNet->CreateMessage(msgID);
msg->SetNetAddress(GetServerAddress());
msg->SetSessionID(m_iSessionID);
msg->SetEncrypted(true);
return msg;
}
CNetAddress VInternetDlg::GetServerAddress()
{
return m_iServerAddr;// m_pNet->GetNetAddress("tracker.valvesoftware.com:1200");
}
//-----------------------------------------------------------------------------
// Purpose: Sends the first pack in the login sequence
//-----------------------------------------------------------------------------
void VInternetDlg::SendInitialLogin()
{
// assert(m_iLoginState == LOGINSTATE_WAITINGTORECONNECT || m_iLoginState == LOGINSTATE_DISCONNECTED);
m_iSessionID = 0;
// stop searching for alternate servers
// m_bServerSearch = false;
// int desiredStatus = COnlineStatus::ONLINE;
// setup the login message
/* ISendMessage *loginMsg = m_pNet->CreateMessage(TCLS_LOGIN);
loginMsg->SetNetAddress(GetServerAddress());
loginMsg->SetEncrypted(true);
loginMsg->SetSessionID(0);
// const char *adr= GetServerAddress().ToStaticString();
loginMsg->WriteUInt("uid", 36283);
loginMsg->WriteString("email", "alfred@mazuma.net.au");
loginMsg->WriteString("password", "mrorange");
loginMsg->WriteInt("status", desiredStatus);
m_pNet->SendMessage(loginMsg, NET_RELIABLE);
*/
// set the current status to be a connecting message
// m_iStatus = COnlineStatus::CONNECTING;
// m_iLoginState = LOGINSTATE_AWAITINGCHALLENGE;
// record the time (for timeouts)
// m_iLoginTimeout = system()->getTimeMillis() + COnlineStatus::SERVERCONNECT_TIMEOUT;
}
//-----------------------------------------------------------------------------
// Purpose: Checks to see if the current message is valid
// replies with a message telling the sender if it's not
//-----------------------------------------------------------------------------
bool VInternetDlg::CheckMessageValidity(IReceiveMessage *dataBlock)
{
int msgID = dataBlock->GetMsgID();
if (msgID == TSVC_FRIENDS || msgID == TSVC_GAMEINFO || msgID == TSVC_HEARTBEAT || msgID == TSVC_FRIENDUPDATE)
{
// see if the server really knows us
if (/*m_iStatus < COnlineStatus::ONLINE ||*/ m_iSessionID != dataBlock->SessionID())
{
// the server thinks we're still logged on to it
// tell the server we're actually logged off from it
ISendMessage *msg = m_pNet->CreateReply(TCLS_HEARTBEAT, dataBlock);
// tell it we're the sessionID it thinks we are
msg->SetSessionID(dataBlock->SessionID());
msg->WriteInt("status", 0);
m_pNet->SendMessage(msg, NET_RELIABLE);
return false;
}
}
return true;
}
//-----------------------------------------------------------------------------
// Purpose: Message map
//-----------------------------------------------------------------------------
MessageMapItem_t VInternetDlg::m_MessageMap[] =
{
// MAP_MESSAGE( VInternetDlg, "PageChanged", OnGameListChanged ),
MAP_MESSAGE_INT( VInternetDlg, "Manage", OnManageServer, "serverID" ),
MAP_MESSAGE_PARAMS( VInternetDlg, "CvarChangeValue", OnPlayerDialog ),
MAP_MESSAGE_INT( VInternetDlg, "DeleteServer", OnDeleteServer, "panelid" ),
MAP_MESSAGE( VInternetDlg, "OpenContextMenu", OnOpenContextMenu ),
};
IMPLEMENT_PANELMAP(VInternetDlg, vgui::Frame);