/*========================================================================== * * Copyright (C) 1995-1999 Microsoft Corporation. All Rights Reserved. * * File: hostdlg.cpp * Content: Host Dialog Support Routines * History: * * Date By Reason * ==== == ====== * 10/15/99 rodtoll created it * rodtoll Plugged memory leak in enumcompressiontypes * 12/07/99 rodtoll Bug #122628 Make error messages silent when running in silent mode * 03/03/2000 rodtoll Updated to handle alternative gamevoice build. * 06/28/2000 rodtoll Prefix Bug #38033, * 08/31/2000 rodtoll Prefix Bug #171843 - Out of Memory Handling Error * ***************************************************************************/ #include "dxvhelppch.h" GUID g_guidCT; DWORD g_dwSessionType; #undef DPF_MODNAME #define DPF_MODNAME "HostDialog_FillCompressionPulldown" void HostDialog_FillCompressionPulldown( HWND hDlg ) { HWND hPulldown = GetDlgItem( hDlg, IDC_COMBO_CT ); LPDVCOMPRESSIONINFO lpdvCompressionInfo; LPBYTE lpBuffer = NULL; DWORD dwSize = 0; DWORD dwNumElements = 0; HRESULT hr; LPDIRECTPLAYVOICECLIENT lpdpvClient = NULL; LRESULT lResultIndex, lFirst; LPGUID lpGuid = NULL; hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); if( FAILED( hr ) ) { DPVDX_DVERRDisplay( hr, "Failure initializing COM", FALSE ); return; } hr = CoCreateInstance( DPVOICE_CLSID_DPVOICE, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlayVoiceClient, (void **) &lpdpvClient ); if( FAILED( hr ) ) { DPVDX_DVERRDisplay( hr, "Unable to create client to get ct info", FALSE ); return; } hr = lpdpvClient->GetCompressionTypes( lpBuffer, &dwSize, &dwNumElements, 0 ); if( hr != DVERR_BUFFERTOOSMALL ) { DPVDX_DVERRDisplay( hr, "Unable to to get ct info", FALSE ); lpdpvClient->Release(); return; } lpBuffer = new BYTE[dwSize]; if( !lpBuffer ) { DPVDX_DVERRDisplay( DVERR_OUTOFMEMORY, "Failed allocating memory", FALSE ); lpdpvClient->Release(); return; } hr = lpdpvClient->GetCompressionTypes( lpBuffer, &dwSize, &dwNumElements, 0 ); if( FAILED( hr ) ) { DPVDX_DVERRDisplay( hr, "Unable to to get ct info", FALSE ); lpdpvClient->Release(); return; } lpdvCompressionInfo = (LPDVCOMPRESSIONINFO) lpBuffer; LPSTR lpszName; for( DWORD dwIndex = 0; dwIndex < dwNumElements; dwIndex++ ) { if( FAILED( DPVDX_AllocAndConvertToANSI( &lpszName, lpdvCompressionInfo[dwIndex].lpszName ) ) ) { lResultIndex = SendMessage( hPulldown, CB_ADDSTRING, 0, (LPARAM) "Unable to convert" ); } else { lResultIndex = SendMessage( hPulldown, CB_ADDSTRING, 0, (LPARAM) lpszName ); delete [] lpszName; } if( dwIndex == 0 ) lFirst = lResultIndex; lpGuid = new GUID; if( lpGuid == NULL ) { DNASSERT( FALSE ); DPVDX_DVERRDisplay( DVERR_OUTOFMEMORY, "Error allocating memory", FALSE ); continue; } (*lpGuid) = lpdvCompressionInfo[dwIndex].guidType; SendMessage( hPulldown, CB_SETITEMDATA, lResultIndex, (LPARAM) lpGuid ); } delete [] lpBuffer; // lFirst isn't initialized if we didn't enter the 'for' loop above if (dwIndex > 0) { SendMessage( hPulldown, CB_SETCURSEL, 0, lFirst ); } lpdpvClient->Release(); CoUninitialize(); return; } #undef DPF_MODNAME #define DPF_MODNAME "HostDialog_FillSessionTypePulldown" void HostDialog_FillSessionTypePulldown( HWND hDlg ) { HWND hPulldown = GetDlgItem( hDlg, IDC_COMBO_TYPE ); LRESULT lIndex, lFirst; lFirst = SendMessage( hPulldown, CB_ADDSTRING, 0, (DWORD_PTR) "Peer To Peer" ); SendMessage( hPulldown, CB_SETITEMDATA, lFirst, DVSESSIONTYPE_PEER ); lIndex = SendMessage( hPulldown, CB_ADDSTRING, 0, (DWORD_PTR) "Mixing" ); SendMessage( hPulldown, CB_SETITEMDATA, lIndex, DVSESSIONTYPE_MIXING ); lIndex = SendMessage( hPulldown, CB_ADDSTRING, 0, (DWORD_PTR) "Multicast" ); SendMessage( hPulldown, CB_SETITEMDATA, lIndex, DVSESSIONTYPE_FORWARDING ); lIndex = SendMessage( hPulldown, CB_ADDSTRING, 0, (DWORD_PTR) "Echo" ); SendMessage( hPulldown, CB_SETITEMDATA, lIndex, DVSESSIONTYPE_ECHO ); SendMessage( hPulldown, CB_SETCURSEL, 0, lFirst ); } #undef DPF_MODNAME #define DPF_MODNAME "CleanupCompressionGUIDs" void CleanupCompressionGUIDs( HWND hDlg ) { LRESULT lCurSelection; LPGUID lpguidCT; lCurSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_CT ), CB_GETCOUNT, 0, 0 ); if( lCurSelection != CB_ERR ) { for( LRESULT lIndex = 0; lIndex < lCurSelection; lIndex++ ) { lpguidCT = (LPGUID) SendMessage( GetDlgItem( hDlg, IDC_COMBO_CT ), CB_GETITEMDATA, lIndex, 0 ); if( lpguidCT ) delete lpguidCT; } } } #undef DPF_MODNAME #define DPF_MODNAME "HostDialog_HandleCommandCancel" BOOL HostDialog_HandleCommandCancel( HWND hDlg ) { CleanupCompressionGUIDs( hDlg ); return TRUE; } #undef DPF_MODNAME #define DPF_MODNAME "HostDialog_HandleCommandOK" BOOL HostDialog_HandleCommandOK( HWND hDlg ) { LRESULT lCurSelection; LPGUID lpguidCT; PDXVHELP_RTINFO prtInfo = (PDXVHELP_RTINFO) GetWindowLongPtr( hDlg, DWLP_USER ); lCurSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_CT ), CB_GETCURSEL, 0, 0 ); if( lCurSelection == CB_ERR ) { MessageBox( NULL, "Select a compression type!", "Error", MB_OK ); return FALSE; } lpguidCT = (LPGUID) SendMessage( GetDlgItem( hDlg, IDC_COMBO_CT ), CB_GETITEMDATA, lCurSelection, 0 ); if( lpguidCT != NULL ) { g_guidCT = (*lpguidCT); } CleanupCompressionGUIDs( hDlg ); lCurSelection = SendMessage( GetDlgItem( hDlg, IDC_COMBO_TYPE ), CB_GETCURSEL, 0, 0 ); if( lCurSelection == CB_ERR ) { MessageBox( NULL, "Select a session type!", "Error", MB_OK ); return FALSE; } g_dwSessionType = (DWORD) SendMessage( GetDlgItem( hDlg, IDC_COMBO_TYPE ), CB_GETITEMDATA, lCurSelection, 0 ); return TRUE; } #undef DPF_MODNAME #define DPF_MODNAME "HostDialog_WinProc" INT_PTR CALLBACK HostDialog_WinProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: HostDialog_FillCompressionPulldown( hDlg ); HostDialog_FillSessionTypePulldown( hDlg ); return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK ) { if( !HostDialog_HandleCommandOK( hDlg ) ) { return FALSE; } } else if( LOWORD(wParam) == IDCANCEL ) { HostDialog_HandleCommandCancel( hDlg ); } if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } #undef DPF_MODNAME #define DPF_MODNAME "GetHostSettings" BOOL GetHostSettings( HINSTANCE hInst, HWND hOwner, LPGUID pguidCT, PDWORD pdwSessionType ) { g_dwSessionType = *pdwSessionType; g_guidCT = *pguidCT; if( DialogBox( hInst, MAKEINTRESOURCE( IDD_DIALOG_HOST ), hOwner, HostDialog_WinProc ) == IDOK ) { *pdwSessionType = g_dwSessionType; *pguidCT = g_guidCT; return TRUE; } else { return FALSE; } }