summaryrefslogtreecommitdiff
path: root/dedicated/vgui/MainPanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dedicated/vgui/MainPanel.cpp')
-rw-r--r--dedicated/vgui/MainPanel.cpp274
1 files changed, 274 insertions, 0 deletions
diff --git a/dedicated/vgui/MainPanel.cpp b/dedicated/vgui/MainPanel.cpp
new file mode 100644
index 0000000..f7fc51b
--- /dev/null
+++ b/dedicated/vgui/MainPanel.cpp
@@ -0,0 +1,274 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Workfile: $
+// $Date: $
+//
+//-----------------------------------------------------------------------------
+// $Log: $
+//
+// $NoKeywords: $
+//=============================================================================//
+#ifdef _WIN32
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include <windows.h>
+// base vgui interfaces
+#include <vgui/vgui.h>
+#include <vgui_controls/Panel.h>
+#include <vgui/IVGui.h>
+#include <vgui/ISurface.h>
+#include <vgui/Cursor.h>
+#include <vgui_controls/ProgressBox.h>
+
+#include "filesystem.h"
+#include "IAdminServer.h"
+
+#include "MainPanel.h"
+#include <imanageserver.h>
+#include "ivguimodule.h"
+#include <vgui/IVGui.h>
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+using namespace vgui;
+
+static CMainPanel *s_InternetDlg = NULL;
+CSysModule *g_hAdminServerModule = NULL;
+extern IAdminServer *g_pAdminServer;
+char *gpszCvars = NULL;
+
+
+void Sys_Sleep_Old( int msec );
+
+extern BOOL gbAppHasBeenTerminated; // used to signal the server thread
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CMainPanel::CMainPanel( ) : Panel(NULL, "CMainPanel")
+{
+ SetPaintBackgroundEnabled( false );
+ SetFgColor( Color( 0,0,0,0 ) );
+ m_bStarting = false;
+ m_flPreviousSteamProgress = 0.0f;
+ m_pGameServer= NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CMainPanel::~CMainPanel()
+{
+ if (gpszCvars)
+ {
+ free(gpszCvars);
+ }
+
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Called once to set up
+//-----------------------------------------------------------------------------
+void CMainPanel::Initialize( )
+{
+ s_InternetDlg = this;
+ m_pGameServer = NULL;
+
+ m_bStarted = false;
+ m_bIsInConfig = true;
+ m_bClosing = false;
+ m_pProgressBox = NULL;
+ m_hShutdown = NULL;
+
+ MoveToFront();
+
+ m_pConfigPage = new CCreateMultiplayerGameServerPage(this, "Config");
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMainPanel::Open( void )
+{
+ m_pConfigPage->SetVisible(true);
+ m_pConfigPage->MoveToFront();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CMainPanel::OnClose()
+{
+ DoStop();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: returns a pointer to a static instance of this dialog
+//-----------------------------------------------------------------------------
+CMainPanel *CMainPanel::GetInstance()
+{
+ return s_InternetDlg;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Changes to the console page and starts up the actual server
+//-----------------------------------------------------------------------------
+void CMainPanel::StartServer(const char *cvars)
+{
+ surface()->SetCursor(dc_hourglass);
+ m_pConfigPage->GetServer(s1);
+
+ // hide the config page and close it
+ m_pConfigPage->SetVisible(false);
+ m_pConfigPage->Close();
+
+ gpszCvars = strdup(cvars);
+
+ // show the basic progress box immediately
+ m_pProgressBox = new ProgressBox("#Start_Server_Loading_Title", "#Server_UpdatingSteamResources", "Starting dedicated server...");
+ m_pProgressBox->SetCancelButtonVisible(true);
+ m_pProgressBox->ShowWindow();
+
+ // make sure we have all the steam content for this mod
+ char reslist[_MAX_PATH];
+ _snprintf(reslist, sizeof(reslist), "reslists/%s/preload.lst", m_pConfigPage->GetGameName());
+ m_hResourceWaitHandle = g_pFullFileSystem->WaitForResources(reslist);
+ if (!m_hResourceWaitHandle)
+ {
+ Assert( 0 );
+ }
+
+ m_pProgressBox->SetCancelButtonEnabled(false);
+
+ m_hShutdown = CreateEvent( NULL, TRUE, FALSE, NULL );
+ ivgui()->AddTickSignal(GetVPanel());
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: lets us delay the loading of the management screen until the server has started
+//-----------------------------------------------------------------------------
+void CMainPanel::OnTick()
+{
+ if (m_hResourceWaitHandle)
+ {
+ // see if we've been cancelled
+ if (!m_pProgressBox.Get() || !m_pProgressBox->IsVisible())
+ {
+ // cancel out
+ g_pFullFileSystem->CancelWaitForResources(m_hResourceWaitHandle);
+ m_hResourceWaitHandle = NULL;
+ DoStop();
+ return;
+ }
+
+ // update resource waiting
+ bool complete;
+ float progress;
+ if (g_pFullFileSystem->GetWaitForResourcesProgress(m_hResourceWaitHandle, &progress, &complete))
+ {
+ vgui::ivgui()->DPrintf2( "progress %.2f %s\n", progress, complete ? "not complete" : "complete" );
+
+ // don't set the progress if we've jumped straight from 0 to 100% complete
+ if (!(progress == 1.0f && m_flPreviousSteamProgress == 0.0f))
+ {
+ m_pProgressBox->SetProgress(progress);
+ m_flPreviousSteamProgress = progress;
+ }
+ }
+
+ // This is here because without it, the dedicated server will consume a lot of CPU and it will slow Steam down
+ // so much that it'll download at 64k instead of 6M.
+ Sleep( 200 );
+
+ // see if we're done
+ if (complete)
+ {
+ m_hResourceWaitHandle = NULL;
+ m_bStarting = true;
+ m_bIsInConfig = false;
+ // at this stage in the process the user can no longer cancel
+ m_pProgressBox->SetCancelButtonEnabled(false);
+ }
+ }
+
+ if (m_bStarting) // if we are actively launching the app
+ {
+ static int count = 0;
+ if (WAIT_OBJECT_0 == WaitForSingleObject(m_hShutdown, 10) || count > 5000)
+ {
+ if (!m_bStarted)
+ {
+ serveritem_t server;
+ m_pConfigPage->GetServer(server);
+ ManageServerUIHandle_t managePage = g_pAdminServer->OpenManageServerDialog(server.name, server.gameDir);
+ m_pGameServer = g_pAdminServer->GetManageServerInterface(managePage);
+ m_bStarted = true;
+
+ if (m_pProgressBox)
+ {
+ m_pProgressBox->Close();
+ m_pProgressBox = NULL;
+ }
+ }
+ else // must be stopping the server
+ {
+ DoStop();
+ }
+
+ surface()->SetCursor(dc_user);
+ m_bStarting = false;
+ ResetEvent(m_hShutdown);
+ }
+ else
+ {
+ count++;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: stops VGUI and kills any progress dialog we may have been displaying
+//-----------------------------------------------------------------------------
+void CMainPanel::DoStop()
+{
+ surface()->SetCursor(dc_user);
+
+ m_bStarted = false;
+ m_bClosing = true;
+
+ if (m_pProgressBox)
+ {
+ m_pProgressBox->Close();
+ m_pProgressBox = NULL;
+ }
+
+ ivgui()->Stop();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Pushes text into the console
+//-----------------------------------------------------------------------------
+void CMainPanel::AddConsoleText(const char *msg)
+{
+ if (m_pGameServer)
+ {
+ m_pGameServer->AddToConsole(msg);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Message map
+//-----------------------------------------------------------------------------
+MessageMapItem_t CMainPanel::m_MessageMap[] =
+{
+ MAP_MESSAGE( CMainPanel, "Quit", OnClose ),
+};
+
+IMPLEMENT_PANELMAP(CMainPanel, BaseClass);
+
+#endif // _WIN32