mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
907 lines
24 KiB
C++
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);
|