#include <windows.h>
#include <windowsx.h>
#include <dplobby.h>
#include "dplaychk.h"
DEFINE_GUID(FEDSRV_GUID,
0x81662310, 0xfcb4, 0x11d0, 0xa8, 0x8a, 0x0, 0x60, 0x97, 0xb5, 0x8f, 0xbf);
CDplayServerChecker::CDplayServerChecker()
: m_pszServer(NULL), m_fDPInit(FALSE), m_pDirectPlay3A(NULL), m_szMsg(NULL),
m_pDirectPlayLobbyA(NULL)
{
}
CDplayServerChecker::~CDplayServerChecker()
{
if (!m_fDPInit)
{
if (m_pDirectPlay3A)
{
m_pDirectPlay3A->Release();
m_pDirectPlay3A = NULL;
}
}
}
void CDplayServerChecker::ClearServer()
{
if (m_pszServer)
{
delete m_pszServer;
m_pszServer = NULL;
}
if (!m_fDPInit)
{
if (m_pDirectPlay3A)
{
m_pDirectPlay3A->Release();
m_pDirectPlay3A = NULL;
}
}
}
void CDplayServerChecker::SetServer(LPSTR szServer)
{
ClearServer();
m_pszServer = new char[strlen(szServer)+1];
lstrcpy(m_pszServer, szServer);
}
BOOL FAR PASCAL EnumSessionsCallback2(LPCDPSESSIONDESC2 lpThisSD,
LPDWORD lpdwTimeOut,
DWORD dwFlags,
LPVOID lpContext)
{
if (dwFlags & DPESC_TIMEDOUT)
return FALSE;
if (lpThisSD) *(BOOL *)lpContext = TRUE;
return FALSE;
}
BOOL CDplayServerChecker::ServerConnectionAlive()
{
HRESULT hr = E_FAIL;
BOOL rc = FALSE;
if (!m_fDPInit)
{
hr = CoCreateInstance(CLSID_DirectPlay, NULL, CLSCTX_INPROC_SERVER,
IID_IDirectPlay3A, (void**)&m_pDirectPlay3A);
if (FAILED(hr))
{
m_szMsg = "DPlay5 is not properly installed. (IID_IDirectPlay3A)";
goto CLEANUP;
}
hr = DirectPlayLobbyCreate(NULL, &m_pDirectPlayLobbyA, NULL, NULL, 0);
if (FAILED(hr))
{
m_szMsg = "DPlay5 is not properly installed. (DirectPlayLobbyCreate)";
goto CLEANUP;
}
void * pvAddress = NULL;
DWORD dwAddressSize;
hr = m_pDirectPlayLobbyA->CreateAddress(DPSPGUID_TCPIP, DPAID_INet, m_pszServer,
lstrlen(m_pszServer) + 1, pvAddress, &dwAddressSize);
if (DPERR_BUFFERTOOSMALL != hr)
{
m_szMsg = "DPlay5 is not properly installed. (CreateAddress)";
goto CLEANUP;
}
pvAddress = GlobalAllocPtr(GMEM_MOVEABLE, dwAddressSize);
hr = m_pDirectPlayLobbyA->CreateAddress(DPSPGUID_TCPIP, DPAID_INet, m_pszServer,
lstrlen(m_pszServer) + 1, pvAddress, &dwAddressSize);
m_pDirectPlayLobbyA->Release();
m_pDirectPlayLobbyA = NULL;
if (FAILED(hr))
{
m_szMsg = "DPlay5 is not properly installed. (CreateAddress)";
goto CLEANUP;
}
hr = m_pDirectPlay3A->InitializeConnection(pvAddress, 0);
GlobalFreePtr(pvAddress);
if (FAILED(hr))
{
m_szMsg = "Can't initialize connection to specified machine";
goto CLEANUP;
}
m_fDPInit = true;
}
{
bool fFoundOne = false;
DPSESSIONDESC2 sessionDesc;
ZeroMemory(&sessionDesc, sizeof(DPSESSIONDESC2));
sessionDesc.dwSize = sizeof(DPSESSIONDESC2);
sessionDesc.guidApplication = FEDSRV_GUID;
hr = m_pDirectPlay3A->EnumSessions(&sessionDesc, 2000, EnumSessionsCallback2, &fFoundOne, 0); if (FAILED(hr) || !fFoundOne)
{
m_szMsg = "Down for the count";
goto CLEANUP;
}
}
rc = TRUE;
CLEANUP:
if (!m_fDPInit)
{
if (m_pDirectPlay3A)
{
m_pDirectPlay3A->Release();
m_pDirectPlay3A = NULL;
}
}
return rc;
}