CONNSET.CPP

/*========================================================================== 
*
* Copyright (C) 1997 Microsoft Corporation. All Rights Reserved.
*
* File: ConnSet.cpp
* Content:A dialog to set and get Group connection settings for a lobby
*
***************************************************************************/

#include "Bellhop.h"

HRESULTGetConnectionSPGuid(HWND hWnd, int idCombo, GUID *lpGuidSP);
HRESULTGetComboBoxGuid(HWND hWnd, LONG iDialogItem, LPGUID lpguidReturn);
HRESULT SetGroupConnection(HWND hWnd, LPLOBBYGROUPCONTEXT lpContext);
BOOL CALLBACK LobbyGroupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL InitConnectionSettingsDialog( HWND hWnd, LPLOBBYGROUPCONTEXT lpContext);
BOOL FAR PASCALEnumApp(LPCDPLAPPINFO lpAppInfo, LPVOID lpContext, DWORD dwFlags);
BOOL FAR PASCAL DirectPlayEnumConnectionsCallback(
LPCGUIDlpguidSP,
LPVOIDlpConnection,
DWORDdwSize,
LPCDPNAMElpName,
DWORDdwFlags,
LPVOIDlpContext);


///////////////////////////////////////////////////////////////////////////////////////
BOOL InitConnectionSettingsDialog( HWND hWnd, LPLOBBYGROUPCONTEXT lpContext)
{
BOOLbRet= FALSE,
bFound;
intiNum= 0,
i,
lParam;
LPCONNECTIONINFOlpci= NULL;
LPGUIDlpGuid= NULL;
LPDPLCONNECTIONlpdpconn = NULL;
HRESULThr;
ENUMCONNSTRUCTenStruct;
DWORDdwSize;

HWNDhSPComboBox = GetDlgItem( hWnd, IDC_GROUPCONNECTIONSPCOMBO );
HWNDhAppComboBox = GetDlgItem( hWnd, IDC_APPCOMBO );

// put all the DirectPlay applications in a combo box
lpContext->lpDPInfo->lpDirectPlayLobby2A->EnumLocalApplications(EnumApp, hWnd, 0);

// put all the available connections in a combo box
enStruct.hWnd = hWnd;
enStruct.idCombo = IDC_GROUPCONNECTIONSPCOMBO;

hr = IDirectPlay3_EnumConnections(lpContext->lpDPInfo->lpDirectPlay3A,
&BELLHOP_GUID,
DirectPlayEnumConnectionsCallback,
&enStruct, DPCONNECTION_DIRECTPLAY );
if (FAILED(hr))
goto FAILURE;

dwSize = 0;
hr = IDirectPlay3_GetGroupConnectionSettings( lpContext->lpDPInfo->lpDirectPlay3A,
0, lpContext->dpidRoom, lpdpconn, &dwSize );

if (DPERR_BUFFERTOOSMALL != hr)
goto FAILURE;

lpdpconn = (LPDPLCONNECTION) GlobalAllocPtr( GHND, dwSize );
if (NULL == lpdpconn)
goto FAILURE;

hr = IDirectPlay3_GetGroupConnectionSettings( lpContext->lpDPInfo->lpDirectPlay3A,
0, lpContext->dpidRoom, lpdpconn, &dwSize );

if (FAILED(hr))
goto FAILURE;


iNum = ComboBox_GetCount( hSPComboBox );

bFound = FALSE;
for (i=0; i<iNum; i++)
{
lParam = ComboBox_GetItemData( hSPComboBox, i );

if ((lParam) && (CB_ERR != lParam))
{
lpci = (LPCONNECTIONINFO) lParam;
if (IsEqualGUID( lpci->guidSP, lpdpconn->guidSP ))
{
bFound = TRUE;
ComboBox_SetCurSel( hSPComboBox, i );
break;
}
lpci = NULL;
}

lParam = NULL;
}

if (FALSE == bFound)
{
//No match.
ComboBox_AddString( hSPComboBox, "<Unknown Service Provider>");
ComboBox_SetItemData( hSPComboBox, 0, 0);
ComboBox_SetCurSel( hSPComboBox, 0 );
}

iNum = ComboBox_GetCount( hAppComboBox );

bFound = FALSE;
for (i=0; i<iNum; i++)
{
lParam = ComboBox_GetItemData( hAppComboBox, i );

if ((lParam) && (CB_ERR != lParam))
{
lpGuid = (LPGUID) lParam;
if (IsEqualGUID( *lpGuid, lpdpconn->lpSessionDesc->guidApplication ))
{
bFound = TRUE;
ComboBox_SetCurSel( hAppComboBox, i );
break;
}
lpGuid = NULL;
}

lParam = NULL;

}

if (FALSE == bFound)
{
//No match.
ComboBox_AddString( hAppComboBox, "<Unknown Application>");
ComboBox_SetItemData( hAppComboBox, 0, 0);
ComboBox_SetCurSel( hAppComboBox, 0 );
}

bRet = TRUE;

// initialize max players
SetDlgItemInt(hWnd, IDC_MAXPLAYERSEDIT, 0, FALSE);
SetDlgItemText( hWnd, IDC_PASSWORDEDIT,lpdpconn->lpSessionDesc->lpszPasswordA );

FAILURE:
return bRet;
}


///////////////////////////////////////////////////////////////////////////////////////
HRESULT SetGroupConnection(HWND hWnd, LPLOBBYGROUPCONTEXT lpContext)
{
CHARszPassword[MAXSTRLEN];
DWORDdwMaxPlayers;
LPDPLCONNECTIONlp = NULL;
HRESULThr;
GUIDguidApplication,
guidSP;
DWORDdwSize = 0;

//Pull the info from the dialog
GetDlgItemText(hWnd, IDC_PASSWORDEDIT, szPassword, MAXSTRLEN);
dwMaxPlayers = GetDlgItemInt(hWnd, IDC_MAXPLAYERSEDIT, NULL, FALSE);
hr = GetComboBoxGuid(hWnd, IDC_APPCOMBO, &guidApplication);

if (FAILED( hr))
{
ErrorBox( "Please select a different application.", hr );
return hr;
}

GetConnectionSPGuid(hWnd, IDC_GROUPCONNECTIONSPCOMBO, &guidSP);

if (FAILED( hr))
{
ErrorBox( "Please select a different service provider.", hr );
return hr;
}


//Get the old connection settings.
hr = IDirectPlay3_GetGroupConnectionSettings(lpContext->lpDPInfo->lpDirectPlay3A,
0, lpContext->dpidRoom, NULL, &dwSize );

lp = (LPDPLCONNECTION) GlobalAllocPtr( GHND, dwSize );

if (lp)
{
hr = IDirectPlay3_GetGroupConnectionSettings(lpContext->lpDPInfo->lpDirectPlay3A,
0, lpContext->dpidRoom, (LPVOID) lp, &dwSize );

lp->lpSessionDesc->dwMaxPlayers = dwMaxPlayers;
lp->lpSessionDesc->lpszPasswordA = szPassword;
lp->lpSessionDesc->guidApplication = guidApplication;
lp->guidSP = guidSP;

hr = IDirectPlay3_SetGroupConnectionSettings(lpContext->lpDPInfo->lpDirectPlay3A,
0, lpContext->dpidRoom, lp );
}
else
{
hr = DPERR_OUTOFMEMORY;
}

return (hr);
}


///////////////////////////////////////////////////////////////////////////////////////
BOOL CALLBACK ConnectionSettingsDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LPLOBBYGROUPCONTEXTlpContext = (LPLOBBYGROUPCONTEXT) GetWindowLong(hWnd, DWL_USER);
HRESULThr;

switch(uMsg)
{
case WM_INITDIALOG:

// context passed in lParam
lpContext = (LPLOBBYGROUPCONTEXT) lParam;

// save the globals with the window
SetWindowLong(hWnd, DWL_USER, (LONG) lpContext);
InitConnectionSettingsDialog( hWnd, lpContext );
break;

case WM_DESTROY:
{
WPARAMindex;
LRESULTlpData;

// destroy the GUID's stored with each app name
index = 0;
while (TRUE)
{
lpData = SendDlgItemMessage(hWnd, IDC_APPCOMBO, CB_GETITEMDATA, (WPARAM) index, 0);
if ((lpData == CB_ERR) || (lpData == 0))
break;

GlobalFreePtr((LPVOID) lpData);
index += 1;
}

// destroy the connection info in the combo box.
index = 0;
while (TRUE)
{
lpData = SendDlgItemMessage(hWnd, IDC_GROUPCONNECTIONSPCOMBO, CB_GETITEMDATA, (WPARAM) index, 0);
if ((lpData == CB_ERR) || (lpData == 0))
break;

GlobalFreePtr((LPVOID) lpData);
index += 1;
}
}
break;

case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
// save changes they made
hr = SetGroupConnection( hWnd, lpContext);

if (SUCCEEDED(hr))
{
// Return success
EndDialog(hWnd, TRUE);
}
break;

case IDCANCEL:
// Return failure
EndDialog(hWnd, FALSE);

break;

case IDC_STAGINGAREA:
{
int i = SendDlgItemMessage( hWnd, IDC_STAGINGAREA, BM_GETCHECK, 0, 0 );
EnableWindow( GetDlgItem( hWnd, IDC_PASSWORDEDIT ), (BST_CHECKED==i));
EnableWindow( GetDlgItem( hWnd, IDC_APPCOMBO ), (BST_CHECKED==i));
EnableWindow( GetDlgItem( hWnd, IDC_MAXPLAYERSEDIT ), (BST_CHECKED==i));
EnableWindow( GetDlgItem( hWnd, IDC_GROUPCONNECTIONSPCOMBO ), (BST_CHECKED==i));
}
break;

}

break;
}

// Allow for default processing
return FALSE;
}