/*==========================================================================
 *
 *  Copyright (C) 1995-1999 Microsoft Corporation.  All Rights Reserved.
 *
 *  File:        maindlg.cpp
 *  Content:	 Main Dialog Support Routines
 *  History:
 *
 *   Date		By		Reason
 *   ====		==		======
 *  10/15/99	rodtoll	created it
 *  10/15/99	rodtoll	Placed guards to prevent operating on window once it's gone
 *  10/20/99	rodtoll	Fix: Bug #114185 Adjusting volume while not connected causes crash
 *  11/12/99	rodtoll	Added code to handle the new "Enable Echo suppression" check box.
 *  12/07/99	rodtoll	Bug #122628 Make error messages silent when running in silent mode
 *  7/21/2000	rodtoll	64-bit build bug -- just appeared
 *
 ***************************************************************************/
 
#include "dxvhelppch.h"


PDXVHELP_RTINFO g_prtInfo = NULL;

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_EnumPlayers"

BOOL FAR PASCAL MainDialog_EnumPlayers(
  DPID dpId,
  DWORD dwPlayerType,
  LPCDPNAME lpName,
  DWORD dwFlags,
  LPVOID lpContext
)
{
    PDXVHELP_RTINFO prtInfo = (PDXVHELP_RTINFO) lpContext;

    MainDialog_AddTransportPlayer( prtInfo->hMainDialog, dpId );

    return TRUE;
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_UpdatePlayerList"

void MainDialog_UpdatePlayerList( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
    prtInfo->lpdpDirectPlay->EnumPlayers( NULL, MainDialog_EnumPlayers, prtInfo, DPENUMPLAYERS_ALL );
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_AddTransportPlayer"

void MainDialog_AddTransportPlayer( HWND hDlg, DWORD dwID )
{
    TCHAR tszBuffer[100];

    _stprintf( tszBuffer, _T("0x%x"), dwID );

    SendMessage( GetDlgItem( hDlg, IDC_LIST_DPLAY ), LB_ADDSTRING, 0, (WPARAM) tszBuffer );        
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_RemoveTransportPlayer"

void MainDialog_RemoveTransportPlayer( HWND hDlg, DWORD dwID )
{
    TCHAR tszBuffer[100];

    _stprintf( tszBuffer, _T("0x%x"), dwID );

    LONG_PTR lResult;

    lResult = SendMessage( GetDlgItem( hDlg, IDC_LIST_DPLAY ), LB_FINDSTRINGEXACT, -1, (WPARAM)tszBuffer );

    if( lResult != LB_ERR )
    {
        SendMessage( GetDlgItem( hDlg, IDC_LIST_DPLAY ), LB_DELETESTRING, lResult, 0 );            
    }
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_AddVoicePlayer"

void MainDialog_AddVoicePlayer( HWND hDlg, DWORD dwID )
{
    TCHAR tszBuffer[100];

    _stprintf( tszBuffer, _T("0x%x"), dwID );

    SendMessage( GetDlgItem( hDlg, IDC_LIST_DVOICE ), LB_ADDSTRING, 0, (WPARAM)tszBuffer );     
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_RemoveVoicePlayer"

void MainDialog_RemoveVoicePlayer( HWND hDlg, DWORD dwID )
{
    TCHAR tszBuffer[100];

    _stprintf( tszBuffer, _T("0x%x"), dwID );

    LONG_PTR lResult;

    lResult = SendMessage( GetDlgItem( hDlg, IDC_LIST_DVOICE ), LB_FINDSTRINGEXACT, -1, (WPARAM)tszBuffer );

    if( lResult != LB_ERR )
    {
        SendMessage( GetDlgItem( hDlg, IDC_LIST_DVOICE ), LB_DELETESTRING, lResult, 0 );            
    }
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_AddToLog"

void MainDialog_AddToLog( HWND hDlg, LPTSTR lpstrMessage )
{
	LONG_PTR lResult;
    lResult = SendMessage( GetDlgItem( hDlg, IDC_LIST_OUTPUT ), LB_ADDSTRING, 0, (WPARAM)lpstrMessage );    
	SendMessage( GetDlgItem( hDlg, IDC_LIST_OUTPUT ), LB_SETTOPINDEX,lResult,  0 );
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_DisplayStatus"

void MainDialog_DisplayStatus( HWND hDlg, LPTSTR lpstrStatus )
{
	if( hDlg == NULL )
		return;

	HWND hwndItem = GetDlgItem( hDlg, IDC_STATIC_STATUS );

	if( hwndItem != NULL )
	{
		SetWindowText( hwndItem, lpstrStatus );
	}
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_DisplayVolumeSettings"

void MainDialog_DisplayVolumeSettings( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
	if( hDlg == NULL )
		return;

	if( prtInfo->dxvParameters.fAGC )
	{
		CheckDlgButton( hDlg, IDC_CHECK_AGC, BST_CHECKED );
		EnableWindow( GetDlgItem( hDlg, IDC_SLIDER_RECVOLUME ), FALSE );	
	}
	else
	{
		CheckDlgButton( hDlg, IDC_CHECK_AGC, BST_UNCHECKED );	
		EnableWindow( GetDlgItem( hDlg, IDC_SLIDER_RECVOLUME ), TRUE );	
	}
	
	if( prtInfo->dxvParameters.fEchoSuppression )
	{
		CheckDlgButton( hDlg, IDC_CHECK_ES, BST_CHECKED );
	}
	else
	{
		CheckDlgButton( hDlg, IDC_CHECK_ES, BST_UNCHECKED );	
	}
	
	SendMessage( GetDlgItem( hDlg, IDC_SLIDER_RECVOLUME ), TBM_SETPOS, (WPARAM) TRUE, (LPARAM) (((LONG) prtInfo->dxvParameters.lRecordVolume)*((LONG) -1)) );	
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_HandleESCheck"

void MainDialog_HandleESCheck( HWND hDlg, HWND hwndControl, PDXVHELP_RTINFO prtInfo )
{
	DVCLIENTCONFIG dvClientConfig;

	dvClientConfig.dwSize = sizeof( DVCLIENTCONFIG );
	
	if( prtInfo->lpdvClient != NULL )
		prtInfo->lpdvClient->GetClientConfig( &dvClientConfig );	
	
	if( SendMessage( (HWND) hwndControl, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
	{
		dvClientConfig.dwFlags |= DVCLIENTCONFIG_ECHOSUPPRESSION;
		prtInfo->dxvParameters.fEchoSuppression = TRUE;
	}
	else
	{
		dvClientConfig.dwFlags &= ~DVCLIENTCONFIG_ECHOSUPPRESSION;				
		prtInfo->dxvParameters.fEchoSuppression = FALSE;					
	}

	if( prtInfo->lpdvClient != NULL )
		prtInfo->lpdvClient->SetClientConfig( &dvClientConfig );			

	MainDialog_DisplayVolumeSettings( hDlg, prtInfo );
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_HandleAGCCheck"

void MainDialog_HandleAGCCheck( HWND hDlg, HWND hwndControl, PDXVHELP_RTINFO prtInfo )
{
	DVCLIENTCONFIG dvClientConfig;

	dvClientConfig.dwSize = sizeof( DVCLIENTCONFIG );
	
	if( prtInfo->lpdvClient != NULL )
		prtInfo->lpdvClient->GetClientConfig( &dvClientConfig );	
	
	if( SendMessage( (HWND) hwndControl, BM_GETCHECK, 0, 0 ) == BST_CHECKED )
	{
		dvClientConfig.dwFlags |= DVCLIENTCONFIG_AUTORECORDVOLUME;
		prtInfo->dxvParameters.lRecordVolume = 0;
		prtInfo->dxvParameters.fAGC = TRUE;
	}
	else
	{
		dvClientConfig.dwFlags &= ~DVCLIENTCONFIG_AUTORECORDVOLUME;				
		prtInfo->dxvParameters.lRecordVolume = -9000;					
		prtInfo->dxvParameters.fAGC = FALSE;					
	}

	dvClientConfig.lRecordVolume = prtInfo->dxvParameters.lRecordVolume;	

	if( prtInfo->lpdvClient != NULL )
		prtInfo->lpdvClient->SetClientConfig( &dvClientConfig );			

	MainDialog_DisplayVolumeSettings( hDlg, prtInfo );
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_HandleConnect"

void MainDialog_HandleConnect( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
	if( GetConnectSettings( prtInfo->hInst, hDlg, prtInfo->dxvParameters.lpszConnectAddress ) )
	{
		prtInfo->dxvParameters.fHost = FALSE;
		SetEvent( prtInfo->hGo );
		EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_CONNECT ), FALSE );
		EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_HOST ), FALSE );			
	}
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_HandleHost"

void MainDialog_HandleHost( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
	if( GetHostSettings( prtInfo->hInst, hDlg, &prtInfo->dxvParameters.guidCT, &prtInfo->dxvParameters.dwSessionType ) )
	{
		prtInfo->dxvParameters.fHost = TRUE;
		SetEvent( prtInfo->hGo );	
		EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_CONNECT ), FALSE );
		EnableWindow( GetDlgItem( hDlg, IDC_BUTTON_HOST ), FALSE );									
	}
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_HandleScroll"

void MainDialog_HandleScroll( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
	DWORD dwPosition;
	DVCLIENTCONFIG dvClientConfig;

	dvClientConfig.dwSize = sizeof( DVCLIENTCONFIG );

	dwPosition = (DWORD) SendMessage( GetDlgItem( hDlg, IDC_SLIDER_RECVOLUME ), TBM_GETPOS, 0, 0 );

	prtInfo->dxvParameters.lRecordVolume = ((LONG) dwPosition) * ((LONG) -1);

	if( prtInfo->lpdvClient != NULL )
	{
		prtInfo->lpdvClient->GetClientConfig( &dvClientConfig );
	}

	dvClientConfig.lRecordVolume = prtInfo->dxvParameters.lRecordVolume;

	if( prtInfo->lpdvClient != NULL )
	{
		prtInfo->lpdvClient->SetClientConfig( &dvClientConfig );
	}
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_HandleClose"

void MainDialog_HandleClose( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
	SetEvent( prtInfo->hShutdown );

	DestroyWindow( hDlg ); 

	prtInfo->hMainDialog = NULL;
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_SetIdleState"

void MainDialog_SetIdleState( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
	if( hDlg == NULL )
		return;
	
	SetWindowText( GetDlgItem( hDlg, IDC_STATIC_STATUS ), _T("Idle") );
	SetWindowText( GetDlgItem( hDlg, IDC_STATIC_CT), _T("N/A")  );
	SetWindowText( GetDlgItem( hDlg, IDC_STATIC_PLAYERS ), _T("0") );
	SetWindowText( GetDlgItem( hDlg, IDC_STATIC_HOST), _T("N/A") );
	SetWindowText( GetDlgItem( hDlg, IDC_STATIC_TYPE), _T("N/A") );	

	SendMessage( GetDlgItem( hDlg, IDC_SLIDER_RECVOLUME ), TBM_SETRANGE, (WPARAM) TRUE, (LPARAM) MAKELONG( 0, 10000 ) );
	SendMessage( GetDlgItem( hDlg, IDC_SLIDER_RECVOLUME ), TBM_SETTICFREQ, (WPARAM) 2000, (LPARAM) 0 );

	SendMessage( GetDlgItem( hDlg, IDC_PROGRESS_TX ), PBM_SETRANGE, (WPARAM) 0, MAKELPARAM( 0, 100 ) );
	SendMessage( GetDlgItem( hDlg, IDC_PROGRESS_RX ), PBM_SETRANGE, (WPARAM) 0, MAKELPARAM( 0, 100 ) );

	MainDialog_DisplayVolumeSettings( hDlg, prtInfo );
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_HandleInitDialog"

void MainDialog_HandleInitDialog( HWND hDlg, PDXVHELP_RTINFO prtInfo )
{
	MainDialog_SetIdleState( hDlg, prtInfo );	
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_Proc"

INT_PTR  CALLBACK MainDialog_Proc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	PDXVHELP_RTINFO prtInfo = g_prtInfo;
	
	switch (message)
	{
		case WM_INITDIALOG:
		
			MainDialog_HandleInitDialog( hDlg, prtInfo  );		

			return TRUE;

		case WM_COMMAND:

			if( HIWORD( wParam ) == BN_CLICKED &&
			    LOWORD( wParam ) == IDC_CHECK_AGC )
			{
				MainDialog_HandleAGCCheck( hDlg, (HWND) lParam, prtInfo );
			}
			else if( LOWORD( wParam ) == IDC_BUTTON_CONNECT &&
			         HIWORD( wParam ) == BN_CLICKED )
			{
				MainDialog_HandleConnect( hDlg, prtInfo );
			}
			else if( LOWORD( wParam ) == IDC_BUTTON_HOST &&
			         HIWORD( wParam ) == BN_CLICKED )
			{
				MainDialog_HandleHost( hDlg, prtInfo );
			}
			else if( HIWORD( wParam ) == BN_CLICKED && 
				     LOWORD( wParam ) == IDC_CHECK_ES )
			{
				MainDialog_HandleESCheck( hDlg, (HWND) lParam, prtInfo );
			}

			break;

		case WM_VSCROLL:

			MainDialog_HandleScroll( hDlg, prtInfo );
			
			break;
		case WM_CLOSE:

			MainDialog_HandleClose( hDlg, prtInfo );

			break;
	}
	
    return FALSE;
}

#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_ShowSessionSettings"

void MainDialog_ShowSessionSettings( HWND hDlg, PDXVHELP_RTINFO prtInfo ) 
{
	DWORD dwSize;
	DVSESSIONDESC dvSessionDesc;
	HRESULT hr;
	GUID guidCT;

	dwSize = 0;

	dvSessionDesc.dwSize = sizeof( DVSESSIONDESC );
	hr = prtInfo->lpdvClient->GetSessionDesc( &dvSessionDesc );

	if( hr == DV_OK ) 
	{
		guidCT = dvSessionDesc.guidCT;

		switch( dvSessionDesc.dwSessionType )
		{
		case DVSESSIONTYPE_PEER:
			SetWindowText( GetDlgItem( hDlg, IDC_STATIC_TYPE ), _T("Peer") );				
			break;
		case DVSESSIONTYPE_MIXING:
			SetWindowText( GetDlgItem( hDlg, IDC_STATIC_TYPE ), _T("Mixing") );				
			break;		
		case DVSESSIONTYPE_FORWARDING:
			SetWindowText( GetDlgItem( hDlg, IDC_STATIC_TYPE ), _T("Forwarding") );				
			break;		
		case DVSESSIONTYPE_ECHO:
			SetWindowText( GetDlgItem( hDlg, IDC_STATIC_TYPE ), _T("Echo"));				
			break;		
		default:
			SetWindowText( GetDlgItem( hDlg, IDC_STATIC_TYPE ), _T("Unknown") );				
			break;				
		}

		LPTSTR lpstrCTName = NULL;
		DWORD dwLength = 0;

		hr = DPVDX_GetCompressionName( guidCT, lpstrCTName, &dwLength );

		if( hr != DVERR_BUFFERTOOSMALL )
		{
			DPVDX_DVERRDisplay( hr, _T("GetCompressionName"), FALSE );
			SetWindowText( GetDlgItem( hDlg, IDC_STATIC_CT ), _T("Unknown") );
		}
		else
		{
			lpstrCTName = new TCHAR[dwLength];

			hr = DPVDX_GetCompressionName( guidCT, lpstrCTName, &dwLength );

			if( FAILED( hr ) )
			{
				DPVDX_DVERRDisplay( hr, _T("GetCompressionName"), FALSE );
				SetWindowText( GetDlgItem( hDlg, IDC_STATIC_CT ), _T("Unknown") );
			}
			else
			{
				SetWindowText( GetDlgItem( hDlg, IDC_STATIC_CT ), lpstrCTName );						
			}

			delete [] lpstrCTName;
		}
	}
	else 
	{
		DPFX(DPFPREP,  DVF_ERRORLEVEL, "Error getting full session settings" );
		SetWindowText( GetDlgItem( hDlg, IDC_STATIC_TYPE ), _T("Unknown" ));				
		SetWindowText( GetDlgItem( hDlg, IDC_STATIC_CT ), _T("Unknown") );				
	}

	if( prtInfo->dxvParameters.fHost )
	{
		SetWindowText( GetDlgItem( hDlg, IDC_STATIC_HOST ), _T("Local Host") );
	}
	else
	{
		SetWindowText( GetDlgItem( hDlg, IDC_STATIC_HOST ), _T("Remote Host") );
	}

	TCHAR szTmpString[100];
	_stprintf( szTmpString, _T("0x%x"), prtInfo->dpidLocalPlayer );

	HWND hwndTmp = GetDlgItem( hDlg, IDC_STATIC_ID );

	SetWindowText( hwndTmp, szTmpString );

	MainDialog_UpdatePlayerList( hDlg, prtInfo );
		
	return;
}

// Show the main dialog box
#undef DPF_MODNAME
#define DPF_MODNAME "MainDialog_Create"

BOOL MainDialog_Create( PDXVHELP_RTINFO prtInfo )
{
	HRESULT hr;

	g_prtInfo = prtInfo;

	prtInfo->hMainDialog = CreateDialog( prtInfo->hInst, (prtInfo->dxvParameters.fLobbyLaunched) ? MAKEINTRESOURCE( IDD_DIALOG_MAIN ) : MAKEINTRESOURCE( IDD_DIALOG_MAIN_STANDALONE ), prtInfo->hMainWnd, MainDialog_Proc );

	if( prtInfo->hMainDialog == NULL )
	{
		hr = GetLastError();

		return FALSE;
	}

	if( prtInfo->dxvParameters.fAdvancedUI )
	{
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_PLAYERS_TITLE ), TRUE );
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_HOST_TITLE ), TRUE );
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_TYPE_TITLE ), TRUE );
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_CT_TITLE ), TRUE );
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_PLAYERS ), TRUE );
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_HOST ), TRUE );
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_TYPE ), TRUE );
		ShowWindow( GetDlgItem( prtInfo->hMainDialog, IDC_STATIC_CT ), TRUE );
		
	}

	ShowWindow( prtInfo->hMainDialog, SW_SHOW );

	return TRUE;
}