#include "stdafx.h"
#include "AllSrvUI.h"
#include "PageGameCreate.h"
#include "AllSrvUISheet.h"
#include "GameParamsSheet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNAMIC(CPageGameCreate, CPropertyPage)
BEGIN_AUTO_SIZER_MAP(_AutoSizerMap)
AUTO_SIZER_ENTRY(IDC_GAME_VISIBILITY , Right, 0, Right, BkRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_SETTINGS_CAPTION, Right, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_SETTINGS_CAPTION, Bottom, 0, Bottom, BkRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_NAME , Right, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_CORE , Right, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_PASSWORD , Right, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_MAX_PLAYERS_CAPTION , LeftRight, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_MAX_PLAYERS_CAPTION , TopBottom, 0, Bottom, NoRefresh)
AUTO_SIZER_ENTRY(IDC_MAX_PLAYERS , LeftRight, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_MAX_PLAYERS , TopBottom, 0, Bottom, NoRefresh)
AUTO_SIZER_ENTRY(IDC_LOCK_GAME_OPEN , LeftRight, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_LOCK_GAME_OPEN , TopBottom, 0, Bottom, NoRefresh)
AUTO_SIZER_ENTRY(IDC_AET , LeftRight, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_AET , TopBottom, 0, Bottom, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_SELECT , LeftRight, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_SELECT , TopBottom, 0, Bottom, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_SETTINGS , TopBottom, 0, Bottom, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_CREATE , LeftRight, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_CREATE , TopBottom, 0, Bottom, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_DESTROY , LeftRight, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDC_GAME_DESTROY , TopBottom, 0, Bottom, NoRefresh)
END_AUTO_SIZER_MAP()
BEGIN_MESSAGE_MAP(CPageGameCreate, CPropertyPage)
ON_BN_CLICKED(IDC_PRIVATE_GAME, OnPrivateGame)
ON_BN_CLICKED(IDC_PUBLIC_GAME, OnPublicGame)
ON_EN_CHANGE(IDC_GAME_NAME, OnChangeGameName)
ON_EN_CHANGE(IDC_GAME_CORE, OnChangeGameCore)
ON_BN_CLICKED(IDC_GAME_SELECT, OnGameSelect)
ON_BN_CLICKED(IDC_GAME_SETTINGS, OnGameSettings)
ON_BN_CLICKED(IDC_GAME_CREATE, OnGameCreate)
ON_BN_CLICKED(IDC_GAME_DESTROY, OnGameDestroy)
ON_WM_TIMER()
END_MESSAGE_MAP()
CPageGameCreate::CPageGameCreate() :
CPropertyPage(CPageGameCreate::IDD)
{
m_iGameVisibility = -1;
m_strGameName = _T("");
m_strGamePassword = _T("");
m_strGameCore = _T(""); m_nMaxPlayers = -1;
m_bLockGameOpen = FALSE;
m_bAET = FALSE; }
void CPageGameCreate::OnEvent(IAGCEvent* pEvent)
{
AGCEventID eEvent;
if (FAILED(pEvent->get_ID(&eEvent)))
return;
switch (eEvent)
{
case EventID_GameDestroyed:
{
UpdateUI();
break;
}
case EventID_GameStateChange:
{
HRESULT hr = GetSheet()->GetGame()->get_GameParameters(&m_spGameParameters);
if (FAILED(hr))
GetSheet()->HandleError(hr, "retrieving Game Parameters object", true);
UpdateFromGameParameters();
UpdateData(false);
UpdateUI();
break;
}
}
}
void CPageGameCreate::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LOCK_GAME_OPEN, m_btnLockGameOpen);
DDX_Control(pDX, IDC_AET, m_btnAET); DDX_Control(pDX, IDC_MAX_PLAYERS_CAPTION, m_staticMaxPlayers);
DDX_Control(pDX, IDC_MAX_PLAYERS, m_comboMaxPlayers);
DDX_Control(pDX, IDC_GAME_PASSWORD_CAPTION, m_staticGamePassword);
DDX_Control(pDX, IDC_GAME_NAME_CAPTION, m_staticGameName);
DDX_Control(pDX, IDC_GAME_CORE_CAPTION, m_staticGameCore); DDX_Control(pDX, IDC_GAME_DESTROY, m_btnGameDestroy);
DDX_Control(pDX, IDC_GAME_CREATE, m_btnGameCreate);
DDX_Control(pDX, IDC_GAME_SELECT, m_btnGameSelect);
DDX_Control(pDX, IDC_GAME_SETTINGS, m_btnGameSettings);
DDX_Control(pDX, IDC_GAME_PASSWORD, m_editGamePassword);
DDX_Control(pDX, IDC_GAME_NAME, m_editGameName);
DDX_Control(pDX, IDC_GAME_CORE, m_editGameCore); DDX_Radio(pDX, IDC_PRIVATE_GAME, m_iGameVisibility);
DDX_Text(pDX, IDC_GAME_NAME, m_strGameName);
DDX_Text(pDX, IDC_GAME_PASSWORD, m_strGamePassword);
DDX_Text(pDX, IDC_GAME_CORE, m_strGameCore); DDX_Control(pDX, IDC_PUBLIC_GAME, m_btnPublicGame);
DDX_Control(pDX, IDC_PRIVATE_GAME, m_btnPrivateGame);
DDX_CBIndex(pDX, IDC_MAX_PLAYERS, m_nMaxPlayers);
DDX_Check(pDX, IDC_LOCK_GAME_OPEN, m_bLockGameOpen);
DDX_Check(pDX, IDC_AET, m_bAET); }
LRESULT CPageGameCreate::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
LRESULT lr;
if (m_AutoSizer.ProcessMessage(message, wParam, lParam, &lr))
return lr;
return CPropertyPage::WindowProc(message, wParam, lParam);
}
void CPageGameCreate::UpdateUI(bool bUpdateData)
{
if (bUpdateData)
UpdateData();
bool bGameInProgress = NULL != GetSheet()->GetGame();
m_btnPrivateGame.EnableWindow(!bGameInProgress);
m_btnPublicGame.EnableWindow(!bGameInProgress);
m_staticGameName.EnableWindow(!bGameInProgress);
m_staticGameCore.EnableWindow(!bGameInProgress); m_editGameName.EnableWindow(!bGameInProgress);
m_editGameCore.EnableWindow(!bGameInProgress); m_staticGamePassword.EnableWindow(!bGameInProgress);
m_editGamePassword.EnableWindow(!bGameInProgress);
m_staticMaxPlayers.EnableWindow(!bGameInProgress);
m_comboMaxPlayers.EnableWindow(!bGameInProgress);
m_btnGameCreate.EnableWindow(!bGameInProgress && !m_strGameName.IsEmpty());
m_btnGameDestroy.EnableWindow(bGameInProgress);
m_btnLockGameOpen.EnableWindow(!bGameInProgress);
m_btnAET.EnableWindow(!bGameInProgress); }
void CPageGameCreate::UpdateFromGameParameters()
{
CComBSTR bstr;
LPCSTR pszContext = "reading Game Parameters object";
HRESULT hr;
if (FAILED(hr = m_spGameParameters->get_GameName(&bstr)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
m_strGameName = bstr;
if (FAILED(hr = m_spGameParameters->get_GamePassword(&bstr)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
m_strGamePassword = bstr;
if (FAILED(hr = m_spGameParameters->get_IGCStaticFile(&bstr)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
m_strGameCore = bstr;
short cMaxPlayers;
if (FAILED(hr = m_spGameParameters->get_TotalMaxPlayers(&cMaxPlayers)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
CString strMaxPlayers;
strMaxPlayers.Format(TEXT("%d"), cMaxPlayers);
m_nMaxPlayers = m_comboMaxPlayers.FindStringExact(-1, strMaxPlayers);
if (m_nMaxPlayers < 0)
m_nMaxPlayers = m_comboMaxPlayers.FindStringExact(-1, TEXT("8"));
VARIANT_BOOL bLockGameOpen;
if (FAILED(hr = m_spGameParameters->get_LockGameOpen(&bLockGameOpen)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
m_bLockGameOpen = !!bLockGameOpen;
VARIANT_BOOL bAET;
if (FAILED(hr = m_spGameParameters->get_AllowEmptyTeams(&bAET)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
m_bAET = !!bAET;
}
BOOL CPageGameCreate::OnInitDialog()
{
HRESULT hr;
GetSheet()->GetSession()->ActivateEvents(EventID_GameStateChange, -1);
GetSheet()->GetSession()->ActivateEvents(EventID_GameDestroyed, -1);
if (GetSheet()->GetGame())
{
hr = GetSheet()->GetGame()->get_GameParameters(&m_spGameParameters);
if (FAILED(hr))
return S_OK == GetSheet()->HandleError(hr, "retrieving Game Parameters object", true);
}
else
{
hr = m_spGameParameters.CreateInstance(CLSID_AGCGameParameters);
if (FAILED(hr))
return S_OK == GetSheet()->HandleError(hr, "creating Game Parameters object", true);
TCHAR szUserName[UNLEN + 1];
DWORD cchUserName = sizeofArray(szUserName);
GetUserName(szUserName, &cchUserName);
WCHAR szDefaultGameName[_MAX_PATH];
#if _MSC_VER >= 1400
swprintf_s(szDefaultGameName, _MAX_PATH, L"%hs's Game", szUserName);
#else
swprintf(szDefaultGameName, L"%hs's Game", szUserName);
#endif
hr = m_spGameParameters->put_GameName(CComBSTR(szDefaultGameName));
if (FAILED(hr))
return S_OK == GetSheet()->HandleError(hr, "setting Game Parameters property", true);
}
CPropertyPage::OnInitDialog();
m_AutoSizer.SetWindowAndRules(*this, _AutoSizerMap);
bool bMultiMode = GetSheet()->IsServerInMultiMode();
m_btnGameSelect.ShowWindow (bMultiMode ? SW_SHOW : SW_HIDE);
m_btnGameCreate.ShowWindow (bMultiMode ? SW_HIDE : SW_SHOW);
m_btnGameDestroy.ShowWindow(bMultiMode ? SW_HIDE : SW_SHOW);
m_btnGameSelect.EnableWindow ( bMultiMode);
m_btnGameCreate.EnableWindow (!bMultiMode);
m_btnGameDestroy.EnableWindow(!bMultiMode);
CRegKey key;
key.Create(HKEY_LOCAL_MACHINE, HKLM_AllSrvUI);
if (GetSheet()->GetGame())
{
CComBSTR bstrLobbyServer;
hr = GetSheet()->GetServer()->get_LobbyServer(&bstrLobbyServer);
if (FAILED(hr))
return S_OK == GetSheet()->HandleError(hr, "retriving LobbyServer property", true);
if (!bstrLobbyServer.Length())
{
m_iGameVisibility = 0;
}
else
{
m_iGameVisibility = 1;
}
}
else
{
m_iGameVisibility = 0;
IStreamPtr spStm;
hr = LoadRegStream(key, TEXT("GameParameters"), &spStm);
if (SUCCEEDED(hr))
{
IPersistStreamInitPtr spPersist(m_spGameParameters);
if (NULL != spPersist && FAILED(hr = spPersist->Load(spStm)))
spPersist->InitNew();
if (FAILED(m_spGameParameters->Validate()))
spPersist->InitNew();
}
}
UpdateFromGameParameters();
UpdateData(false);
UpdateUI();
return true;
}
void CPageGameCreate::OnPrivateGame()
{
UpdateUI(true);
}
void CPageGameCreate::OnPublicGame()
{
UpdateUI(true);
}
void CPageGameCreate::OnChangeGameName()
{
UpdateUI(true);
}
void CPageGameCreate::OnChangeGameCore()
{
UpdateUI(true);
}
void CPageGameCreate::OnGameSettings()
{
CGameParamsSheet dlg;
dlg.DoModal();
}
void CPageGameCreate::OnGameSelect()
{
GetSheet()->SelectGame();
}
void CPageGameCreate::OnGameCreate()
{
CWaitCursor wait;
UpdateData();
_ASSERTE(!m_strGameName.IsEmpty());
LPCSTR pszContext = "setting Game parameters";
HRESULT hr = m_spGameParameters->put_GameName(CComBSTR(m_strGameName));
if (SUCCEEDED(hr))
hr = m_spGameParameters->put_GamePassword(CComBSTR(m_strGamePassword));
if (FAILED(hr))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
if (!m_strGameCore.IsEmpty())
{
hr = m_spGameParameters->put_IGCStaticFile(CComBSTR(m_strGameCore));
if (FAILED(hr))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
}
CString strMaxPlayers;
m_comboMaxPlayers.GetLBText(m_nMaxPlayers, strMaxPlayers);
short cMaxPlayers = static_cast<short>(_ttoi(strMaxPlayers));
if (SUCCEEDED(hr = m_spGameParameters->put_TotalMaxPlayers(cMaxPlayers)))
{
if (SUCCEEDED(hr = m_spGameParameters->put_MinPlayers(1)))
hr = m_spGameParameters->put_MaxPlayers(cMaxPlayers);
}
if (FAILED(hr))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
VARIANT_BOOL bLockGameOpen = m_bLockGameOpen ? VARIANT_TRUE : VARIANT_FALSE;
if (FAILED(hr = m_spGameParameters->put_LockGameOpen(bLockGameOpen)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
VARIANT_BOOL bAET = m_bAET ? VARIANT_TRUE : VARIANT_FALSE;
if (FAILED(hr = m_spGameParameters->put_AllowEmptyTeams(bAET)))
{
GetSheet()->HandleError(hr, pszContext, true);
return;
}
bool bLobbyServer = (1 == m_iGameVisibility);
hr = GetSheet()->CreateGame(bLobbyServer, m_spGameParameters);
if (SUCCEEDED(hr))
{
SetDefID(m_btnGameSettings.GetDlgCtrlID());
m_btnGameSettings.SetFocus();
hr = GetSheet()->GetGame()->get_GameParameters(&m_spGameParameters);
if (FAILED(hr))
GetSheet()->HandleError(hr, "retrieving Game Parameters object", true);
UpdateFromGameParameters();
UpdateData(false);
}
else
{
return;
}
UpdateUI();
pszContext = "saving preferences to the registry";
CRegKey key;
LONG lr = key.Create(HKEY_LOCAL_MACHINE, HKLM_AllSrvUI);
if (ERROR_SUCCESS != lr)
{
GetSheet()->HandleError(HRESULT_FROM_WIN32(lr), pszContext, false);
return;
}
IStreamPtr spStm;
hr = CreateStreamOnHGlobal(NULL, true, &spStm);
if (SUCCEEDED(hr))
{
IPersistStreamInitPtr spPersist(m_spGameParameters);
if (NULL != spPersist)
{
hr = spPersist->Save(spStm, true);
if (SUCCEEDED(hr))
hr = SaveRegStream(key, "GameParameters", spStm);
}
else
{
hr = E_NOINTERFACE;
}
}
if (FAILED(hr))
GetSheet()->HandleError(hr, pszContext, false);
}
void CPageGameCreate::OnGameDestroy()
{
CWaitCursor wait;
HRESULT hr = GetSheet()->DestroyGame();
UpdateUI();
}