#include "stdafx.h"
#include "AllSrvUI.h"
#include "AllSrvUISheet.h"
#include "PageConnect.h"
#include "..\FedSrv\AdminSessionSecure.h"
#include "..\FedSrv\AdminSessionSecureHost.h"
#include ".\pageconnect.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define _WIN32_DCOM
IMPLEMENT_DYNAMIC(CPageConnect, CPropertyPage)
BEGIN_AUTO_SIZER_MAP(_AutoSizerMap)
AUTO_SIZER_ENTRY(IDC_PROGRESS_CONNECTING_GROUP , Right, 0, Right, BkRefresh)
AUTO_SIZER_ENTRY(IDC_PROGRESS_CONNECTING_CAPTION, Left, 0, Left, NoRefresh)
AUTO_SIZER_ENTRY(IDC_PROGRESS_CONNECTING , Right, 0, Right, NoRefresh)
AUTO_SIZER_ENTRY(IDCANCEL , HCenter, 0, HCenter, NoRefresh)
AUTO_SIZER_ENTRY(IDC_LEGAL , Right, 0, Right, BkRefresh)
AUTO_SIZER_ENTRY(IDC_LEGAL , TopBottom, 0, Bottom, BkRefresh)
END_AUTO_SIZER_MAP()
BEGIN_MESSAGE_MAP(CPageConnect, CPropertyPage)
ON_WM_TIMER()
ON_MESSAGE(wm_SessionFailed, OnSessionFailed)
ON_MESSAGE(wm_SessionSucceeded, OnSessionSucceeded)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_PROGRESS_CONNECTING, OnNMCustomdrawProgressConnecting)
END_MESSAGE_MAP()
CPageConnect::CPageConnect() :
CPropertyPage(CPageConnect::IDD)
{
}
void CPageConnect::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PROGRESS_CONNECTING, m_progress);
}
LRESULT CPageConnect::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);
}
UINT CPageConnect::CreateSessionThreadThunk(void* pvParam)
{
CoInitialize(NULL);
CPageConnect* pThis = reinterpret_cast<CPageConnect*>(pvParam);
pThis->CreateSessionThreadProc();
CoUninitialize();
return 0;
}
void CPageConnect::CreateSessionThreadProc()
{
IAdminSessionClassPtr spClass;
HRESULT hr = CoGetClassObject(__uuidof(AdminSession), CLSCTX_LOCAL_SERVER,
NULL, __uuidof(spClass), (void**)&spClass);
if (FAILED(hr))
{
PostMessage(wm_SessionFailed, hr);
return;
}
AdminSessionSecureHost xHost;
IAdminSessionPtr spSession;
hr = spClass->CreateSession(&xHost, &spSession);
::CoDisconnectObject(&xHost, 0);
if (FAILED(hr))
{
PostMessage(wm_SessionFailed, hr);
return;
}
IGlobalInterfaceTablePtr spGIT;
hr = spGIT.CreateInstance(CLSID_StdGlobalInterfaceTable);
if (FAILED(hr))
{
PostMessage(wm_SessionFailed, hr);
return;
}
DWORD dwCookie = 0;
hr = spGIT->RegisterInterfaceInGlobal(spSession,
__uuidof(IAdminSession), &dwCookie);
if (FAILED(hr))
{
PostMessage(wm_SessionFailed, hr);
return;
}
TCHandle shEvent = CreateEvent(NULL, false, false, NULL);
PostMessage(wm_SessionSucceeded, dwCookie, (LPARAM)shEvent.GetHandle());
WaitForSingleObject(shEvent, INFINITE);
}
BOOL CPageConnect::OnInitDialog()
{
CPropertyPage::OnInitDialog();
m_AutoSizer.SetWindowAndRules(*this, _AutoSizerMap);
m_pthCreateSession = AfxBeginThread(CreateSessionThreadThunk, this,
THREAD_PRIORITY_NORMAL, 4096);
_ASSERTE(m_pthCreateSession);
m_progress.SetRange(0, 60);
SetTimer(1, 500, NULL);
return false;
}
void CPageConnect::OnTimer(UINT nIDEvent)
{
int nPos = m_progress.GetPos();
m_progress.SetPos(nPos += 5);
if (nPos >= 60)
KillTimer(nIDEvent);
CPropertyPage::OnTimer(nIDEvent);
}
LRESULT CPageConnect::OnSessionSucceeded(WPARAM wParam, LPARAM lParam)
{
KillTimer(1);
GetSheet()->PostConnect((DWORD)wParam);
SetEvent((HANDLE)lParam);
return 0;
}
LRESULT CPageConnect::OnSessionFailed(WPARAM wParam, LPARAM)
{
KillTimer(1);
GetSheet()->HandleError(HRESULT(wParam), "connecting to Game Server", true);
return 0;
}
void CPageConnect::OnNMCustomdrawProgressConnecting(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
*pResult = 0;
}