summaryrefslogtreecommitdiff
path: root/gameui/ContentControlDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gameui/ContentControlDialog.cpp')
-rw-r--r--gameui/ContentControlDialog.cpp406
1 files changed, 406 insertions, 0 deletions
diff --git a/gameui/ContentControlDialog.cpp b/gameui/ContentControlDialog.cpp
new file mode 100644
index 0000000..7613914
--- /dev/null
+++ b/gameui/ContentControlDialog.cpp
@@ -0,0 +1,406 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+
+#include <stdio.h>
+#include <memory.h>
+#if defined( WIN32 ) && !defined( _X360 )
+#include <windows.h>
+#endif
+
+#include "ContentControlDialog.h"
+#include "checksum_md5.h"
+#include "EngineInterface.h"
+
+#include <vgui/IInput.h>
+#include <vgui/ISystem.h>
+#include <vgui/ISurface.h>
+#include "tier1/KeyValues.h"
+#include "tier1/convar.h"
+
+#include <vgui_controls/Button.h>
+#include <vgui_controls/CheckButton.h>
+#include <vgui_controls/Label.h>
+#include <vgui_controls/RadioButton.h>
+#include <vgui_controls/TextEntry.h>
+#include <tier0/vcrmode.h>
+
+#if defined( _X360 )
+#include "xbox/xbox_win32stubs.h"
+#endif
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+using namespace vgui;
+
+//-----------------------------------------------------------------------------
+// Purpose: Basic help dialog
+//-----------------------------------------------------------------------------
+CContentControlDialog::CContentControlDialog(vgui::Panel *parent) : vgui::Frame(parent, "ContentControlDialog")
+{
+ SetBounds(0, 0, 372, 160);
+ SetSizeable( false );
+
+ SetTitle( "#GameUI_ContentLock", true );
+
+ m_pStatus = new vgui::Label( this, "ContentStatus", "" );
+
+ m_pPasswordLabel = new vgui::Label( this, "PasswordPrompt", "#GameUI_PasswordPrompt" );
+ m_pPassword2Label = new vgui::Label( this, "PasswordReentryPrompt", "#GameUI_PasswordReentryPrompt" );
+
+ m_pExplain = new vgui::Label( this, "ContentControlExplain", "" );
+
+ m_pPassword = new vgui::TextEntry( this, "Password" );
+ m_pPassword2 = new vgui::TextEntry( this, "Password2" );
+
+ m_pOK = new vgui::Button( this, "Ok", "#GameUI_OK" );
+ m_pOK->SetCommand( "Ok" );
+
+ vgui::Button *cancel = new vgui::Button( this, "Cancel", "#GameUI_Cancel" );
+ cancel->SetCommand( "Cancel" );
+
+ m_szGorePW[ 0 ] = 0;
+ ResetPassword();
+
+ LoadControlSettings("Resource\\ContentControlDialog.res");
+
+// Explain("");
+// UpdateContentControlStatus();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CContentControlDialog::~CContentControlDialog()
+{
+}
+
+void CContentControlDialog::Activate()
+{
+ BaseClass::Activate();
+
+ m_pPassword->SetText("");
+ m_pPassword->RequestFocus();
+ m_pPassword2->SetText("");
+ Explain("");
+ UpdateContentControlStatus();
+
+ input()->SetAppModalSurface(GetVPanel());
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CContentControlDialog::ResetPassword()
+{
+ // Set initial value
+#ifdef WIN32
+#ifndef _XBOX
+ HKEY key;
+ if ( ERROR_SUCCESS == VCRHook_RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Valve\\Half-Life\\Settings", 0, KEY_READ, &key))
+ {
+ DWORD type;
+ DWORD bufSize = sizeof(m_szGorePW);
+
+ VCRHook_RegQueryValueEx(key, "User Token 2", NULL, &type, (unsigned char *)m_szGorePW, &bufSize );
+ VCRHook_RegCloseKey( key );
+ }
+ else
+#endif
+ {
+ m_szGorePW[ 0 ] = 0;
+ }
+#else
+ vgui::system()->SetRegistryString( "Software\\Valve\\Half-Life\\Settings\\User Token 2", m_szGorePW );
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CContentControlDialog::ApplyPassword()
+{
+ WriteToken( m_szGorePW );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CContentControlDialog::Explain( char const *fmt, ... )
+{
+ if ( !m_pExplain )
+ return;
+
+ va_list argptr;
+ char text[1024];
+
+ va_start (argptr,fmt);
+ Q_vsnprintf (text, sizeof(text), fmt, argptr);
+ va_end (argptr);
+
+ m_pExplain->SetText( text );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *command -
+//-----------------------------------------------------------------------------
+void CContentControlDialog::OnCommand( const char *command )
+{
+ if ( !stricmp( command, "Ok" ) )
+ {
+ bool canclose = false;
+
+ char pw1[ 256 ];
+ char pw2[ 256 ];
+
+ m_pPassword->GetText( pw1, 256 );
+ m_pPassword2->GetText( pw2, 256 );
+
+ // Get text and check
+// bool enabled = PasswordEnabled(); //( m_szGorePW[0]!=0 ) ? true : false;
+// bool pwMatch = stricmp( pw1, pw2 ) == 0 ? true : false;
+
+ if (IsPasswordEnabledInDialog())
+ {
+ canclose = DisablePassword(pw1);
+// canclose = CheckPassword( m_szGorePW, pw1, false );
+ }
+ else if (!strcmp(pw1, pw2))
+ {
+ canclose = EnablePassword(pw1);
+// canclose = CheckPassword( NULL, pw1, true );
+ }
+ else
+ {
+ Explain( "#GameUI_PasswordsDontMatch" );
+ }
+
+ if ( canclose )
+ {
+ OnClose();
+ }
+ }
+ else if ( !stricmp( command, "Cancel" ) )
+ {
+ OnClose();
+ }
+ else
+ {
+ BaseClass::OnCommand( command );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CContentControlDialog::OnClose()
+{
+ BaseClass::OnClose();
+ PostActionSignal(new KeyValues("ContentControlClose"));
+// MarkForDeletion();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CContentControlDialog::WriteToken( const char *str )
+{
+ // Set initial value
+#ifdef WIN32
+#ifndef _XBOX
+ HKEY key;
+ if ( ERROR_SUCCESS == VCRHook_RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Valve\\Half-Life\\Settings", 0, KEY_WRITE, &key))
+ {
+ DWORD type = REG_SZ;
+ DWORD bufSize = strlen( str ) + 1;
+
+ VCRHook_RegSetValueEx(key, "User Token 2", 0, type, (const unsigned char *)str, bufSize );
+
+ VCRHook_RegCloseKey( key );
+ }
+#endif
+#else
+ vgui::system()->SetRegistryString( "Software\\Valve\\Half-Life\\Settings\\User Token 2", m_szGorePW );
+#endif
+ Q_strncpy( m_szGorePW, str, sizeof( m_szGorePW ) );
+
+ UpdateContentControlStatus();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CContentControlDialog::HashPassword(const char *newPW, char *hashBuffer, int maxlen )
+{
+ // Compute the md5 hash and save it.
+ unsigned char md5_hash[16];
+ MD5Context_t ctx;
+
+ MD5Init( &ctx );
+ MD5Update( &ctx, (unsigned char const *)newPW, strlen( newPW ) );
+ MD5Final( md5_hash, &ctx );
+
+ char hex[ 128 ];
+ Q_binarytohex( md5_hash, sizeof( md5_hash ), hex, sizeof( hex ) );
+
+// char digestedPW[ 128 ];
+ Q_strncpy( hashBuffer, hex, maxlen );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+/*
+bool CContentControlDialog::CheckPassword( char const *oldPW, char const *newPW, bool enableContentControl )
+{
+ char digestedPW[ 128 ];
+ HashPassword(newPW, digestedPW, sizeof( digestedPW ) );
+
+ // Compute the md5 hash and save it.
+ unsigned char md5_hash[16];
+ MD5Context_t ctx;
+
+ MD5Init( &ctx );
+ MD5Update( &ctx, (unsigned char const *)(LPCSTR)newPW, strlen( newPW ) );
+ MD5Final( md5_hash, &ctx );
+
+ char hex[ 128 ];
+ Q_binarytohex( md5_hash, sizeof( md5_hash ), hex, sizeof( hex ) );
+
+ Q_strncpy( digestedPW, hex, sizeof( digestedPW ) );
+*/
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CContentControlDialog::EnablePassword(const char *newPW)
+{
+ if ( !newPW[ 0 ] )
+ {
+ Explain( "#GameUI_MustEnterPassword" );
+ return false;
+ }
+
+ char digestedPW[ 128 ];
+ HashPassword(newPW, digestedPW, sizeof( digestedPW ) );
+
+ // disable violence
+/* engine->Cvar_SetValue("violence_hblood", 0.0 );
+ engine->Cvar_SetValue("violence_hgibs" , 0.0 );
+ engine->Cvar_SetValue("violence_ablood", 0.0 );
+ engine->Cvar_SetValue("violence_agibs" , 0.0 );
+ */
+
+ ConVarRef violence_hblood( "violence_hblood" );
+ violence_hblood.SetValue(false);
+
+ ConVarRef violence_hgibs( "violence_hgibs" );
+ violence_hgibs.SetValue(false);
+
+ ConVarRef violence_ablood( "violence_ablood" );
+ violence_ablood.SetValue(false);
+
+ ConVarRef violence_agibs( "violence_agibs" );
+ violence_agibs.SetValue(false);
+
+ // Store digest to registry
+// WriteToken( digestedPW );
+ Q_strncpy(m_szGorePW, digestedPW, sizeof( m_szGorePW ) );
+ /*
+ }
+ else
+ {
+ if ( stricmp( oldPW, digestedPW ) )
+ {
+ // Warn that password is invalid
+ Explain( "#GameUI_IncorrectPassword" );
+ return false;
+ }
+ }
+ }*/
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CContentControlDialog::DisablePassword(const char *oldPW)
+{
+ if ( !oldPW[ 0 ] )
+ {
+ Explain( "#GameUI_MustEnterPassword" );
+ return false;
+ }
+
+ char digestedPW[ 128 ];
+ HashPassword(oldPW, digestedPW, sizeof( digestedPW ) );
+
+ if( stricmp( m_szGorePW, digestedPW ) )
+ {
+ Explain( "#GameUI_IncorrectPassword" );
+ return false;
+ }
+
+ m_szGorePW[0] = 0;
+
+ // set the violence cvars
+/* engine->Cvar_SetValue("violence_hblood", 1.0 );
+ engine->Cvar_SetValue("violence_hgibs" , 1.0 );
+ engine->Cvar_SetValue("violence_ablood", 1.0 );
+ engine->Cvar_SetValue("violence_agibs" , 1.0 );
+ */
+ ConVarRef violence_hblood( "violence_hblood" );
+ violence_hblood.SetValue(true);
+
+ ConVarRef violence_hgibs( "violence_hgibs" );
+ violence_hgibs.SetValue(true);
+
+ ConVarRef violence_ablood( "violence_ablood" );
+ violence_ablood.SetValue(true);
+
+ ConVarRef violence_agibs( "violence_agibs" );
+ violence_agibs.SetValue(true);
+
+
+// // Remove digest value
+// WriteToken( "" );
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CContentControlDialog::IsPasswordEnabledInDialog()
+{
+ return m_szGorePW[0] != 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CContentControlDialog::UpdateContentControlStatus( void )
+{
+ bool enabled = IsPasswordEnabledInDialog(); //( m_szGorePW[0]!=0 ) ? true : false;
+ m_pStatus->SetText( enabled ? "#GameUI_ContentStatusEnabled" : "#GameUI_ContentStatusDisabled" );
+
+ if (enabled)
+ {
+ m_pPasswordLabel->SetText("#GameUI_PasswordDisablePrompt");
+ }
+ else
+ {
+ m_pPasswordLabel->SetText("#GameUI_PasswordPrompt");
+ }
+
+ // hide the re-entry
+ m_pPassword2Label->SetVisible(!enabled);
+ m_pPassword2->SetVisible(!enabled);
+// m_pOK->SetText( enabled ? "#GameUI_Disable" : "#GameUI_Enable" );
+}