|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2001 Microsoft Corporation
//
// Module Name:
// WizardUtils.cpp
//
// Maintained By:
// David Potter (DavidP) 30-JAN-2001
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "WizardUtils.h"
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrValidateDnsHostname
//
// Description:
// Validate a hostname with DNS. If the name contains a period (.)
// it will be validated as a full DNS hostname. Otherwise it will be
// validated as a hostname label.
//
// Arguments:
// hwndParentIn
// pcwszHostnameIn
// emvdhoOptionsIn -- mvdhoALLOW_FULL_NAME
//
// Return Values:
// S_OK - Operation completed successfully
// Other HRESULT values from DnsValidateName().
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrValidateDnsHostname( HWND hwndParentIn , LPCWSTR pcwszHostnameIn , EValidateDnsHostnameOptions emvdhoOptionsIn ) { TraceFunc1( "pcwszHostnameIn = '%1!ws!", pcwszHostnameIn );
HRESULT hr = S_OK; DNS_STATUS dnsStatus; int iRet; UINT idsStatus = 0; UINT idsSubStatus = 0; UINT nMsgBoxType; bool fAllowFullName = ( ( emvdhoOptionsIn & mvdhoALLOW_FULL_NAME ) == mvdhoALLOW_FULL_NAME );
Assert( pcwszHostnameIn != NULL );
if ( fAllowFullName ) { dnsStatus = TW32( DnsValidateName( pcwszHostnameIn, DnsNameHostnameFull ) ); } else { dnsStatus = TW32( DnsValidateName( pcwszHostnameIn, DnsNameHostnameLabel ) ); }
if ( dnsStatus != ERROR_SUCCESS ) { // Format the error message string for the message box.
switch ( dnsStatus ) { case ERROR_INVALID_NAME: idsStatus = IDS_ERR_INVALID_DNS_NAME_TEXT; if ( fAllowFullName ) { idsSubStatus = IDS_ERR_FULL_DNS_NAME_INFO_TEXT; } else { idsSubStatus = IDS_ERR_DNS_HOSTNAME_LABEL_INFO_TEXT; } nMsgBoxType = MB_OK | MB_ICONSTOP; break;
case DNS_ERROR_NON_RFC_NAME: idsStatus = 0; idsSubStatus = IDS_ERR_NON_RFC_NAME_QUERY; nMsgBoxType = MB_YESNO | MB_ICONQUESTION; break;
case DNS_ERROR_NUMERIC_NAME: idsStatus = IDS_ERR_INVALID_DNS_NAME_TEXT; if ( fAllowFullName ) { idsSubStatus = IDS_ERR_FULL_DNS_NAME_NUMERIC; } else { idsSubStatus = IDS_ERR_DNS_HOSTNAME_LABEL_NUMERIC; } nMsgBoxType = MB_OK | MB_ICONSTOP; break;
case DNS_ERROR_INVALID_NAME_CHAR: default: idsStatus = 0; idsSubStatus = IDS_ERR_DNS_NAME_INVALID_CHAR; nMsgBoxType = MB_OK | MB_ICONSTOP; break; }
// Display the error message box.
if ( idsStatus == 0 ) { hr = THR( HrMessageBoxWithStatus( hwndParentIn , IDS_ERR_VALIDATING_NAME_TITLE , IDS_ERR_VALIDATING_NAME_TEXT , dnsStatus , idsSubStatus , nMsgBoxType , &iRet , pcwszHostnameIn ) ); } else { hr = THR( HrMessageBoxWithStatusString( hwndParentIn , IDS_ERR_VALIDATING_NAME_TITLE , IDS_ERR_VALIDATING_NAME_TEXT , idsStatus , idsSubStatus , nMsgBoxType , &iRet , pcwszHostnameIn ) ); } if ( FAILED( hr ) ) { goto Cleanup; } if ( iRet == IDYES ) { dnsStatus = ERROR_SUCCESS; }
} // if: error in validation
Cleanup: if ( dnsStatus != ERROR_SUCCESS ) { hr = HRESULT_FROM_WIN32( dnsStatus ); }
HRETURN( hr );
} //*** HrValidateDnsHostname()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrMessageBoxWithStatus
//
// Description:
// Display an error message box.
//
// Arguments:
// hwndParentIn
// idsTitleIn
// idsOperationIn
// hrStatusIn
// idsSubStatusIn
// uTypeIn
// pidReturnOut -- IDABORT on error or any return value from MessageBox()
// ...
//
// Return Values:
// Any return values from the MessageBox() Win32 API.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrMessageBoxWithStatus( HWND hwndParentIn , UINT idsTitleIn , UINT idsOperationIn , HRESULT hrStatusIn , UINT idsSubStatusIn , UINT uTypeIn , int * pidReturnOut , ... ) { TraceFunc( "" );
HRESULT hr = S_OK; int idReturn = IDABORT; // Default in case of error.
BSTR bstrTitle = NULL; BSTR bstrOperation = NULL; BSTR bstrStatus = NULL; BSTR bstrSubStatus = NULL; BSTR bstrFullText = NULL; va_list valist;
va_start( valist, pidReturnOut );
// Load the title string if one is specified.
if ( idsTitleIn != 0 ) { hr = THR( HrLoadStringIntoBSTR( g_hInstance, idsTitleIn, &bstrTitle ) ); if ( FAILED( hr ) ) { goto Cleanup; } }
// Load the text string.
hr = THR( HrFormatStringWithVAListIntoBSTR( g_hInstance, idsOperationIn, &bstrOperation, valist ) ); if ( FAILED( hr ) ) { goto Cleanup; }
// Format the status.
hr = THR( HrFormatErrorIntoBSTR( hrStatusIn, &bstrStatus ) ); if ( FAILED( hr ) ) { goto Cleanup; }
// Load the substatus string if specified.
if ( idsSubStatusIn != 0 ) { hr = THR( HrLoadStringIntoBSTR( g_hInstance, idsSubStatusIn, &bstrSubStatus ) ); if ( FAILED( hr ) ) { goto Cleanup; } }
// Format all the strings into a single string.
if ( bstrSubStatus == NULL ) { hr = THR( HrFormatStringIntoBSTR( L"%1!ws!\n\n%2!ws!" , &bstrFullText , bstrOperation , bstrStatus ) ); } else { hr = THR( HrFormatStringIntoBSTR( L"%1!ws!\n\n%2!ws!\n\n%3!ws!" , &bstrFullText , bstrOperation , bstrStatus , bstrSubStatus ) ); } if ( FAILED( hr ) ) { goto Cleanup; }
// Display the status.
idReturn = MessageBox( hwndParentIn, bstrFullText, bstrTitle, uTypeIn );
Cleanup: TraceSysFreeString( bstrTitle ); TraceSysFreeString( bstrOperation ); TraceSysFreeString( bstrStatus ); TraceSysFreeString( bstrSubStatus ); TraceSysFreeString( bstrFullText ); va_end( valist );
if ( pidReturnOut != NULL ) { *pidReturnOut = idReturn; }
HRETURN( hr );
} //*** HrMessageBoxWithStatus( hrStatusIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrMessageBoxWithStatusString
//
// Description:
// Display an error message box.
//
// Arguments:
// hwndParentIn
// idsTitleIn
// idsOperationIn
// idsStatusIn
// idsSubStatusIn
// uTypeIn
// pidReturnOut -- IDABORT on error or any return value from MessageBox()
// ...
//
// Return Values:
// Any return values from the MessageBox() Win32 API.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrMessageBoxWithStatusString( HWND hwndParentIn , UINT idsTitleIn , UINT idsOperationIn , UINT idsStatusIn , UINT idsSubStatusIn , UINT uTypeIn , int * pidReturnOut , ... ) { TraceFunc( "" );
HRESULT hr = S_OK; int idReturn = IDABORT; // Default in case of error.
BSTR bstrTitle = NULL; BSTR bstrOperation = NULL; BSTR bstrStatus = NULL; BSTR bstrSubStatus = NULL; BSTR bstrFullText = NULL; va_list valist;
va_start( valist, pidReturnOut );
// Load the title string if one is specified.
if ( idsTitleIn != 0 ) { hr = THR( HrLoadStringIntoBSTR( g_hInstance, idsTitleIn, &bstrTitle ) ); if ( FAILED( hr ) ) { goto Cleanup; } }
// Load the text string.
hr = THR( HrFormatStringWithVAListIntoBSTR( g_hInstance, idsOperationIn, &bstrOperation, valist ) ); if ( FAILED( hr ) ) { goto Cleanup; }
// Format the status.
hr = THR( HrLoadStringIntoBSTR( g_hInstance, idsStatusIn, &bstrStatus ) ); if ( FAILED( hr ) ) { goto Cleanup; }
// Load the substatus string if specified.
if ( idsSubStatusIn != 0 ) { hr = THR( HrLoadStringIntoBSTR( g_hInstance, idsSubStatusIn, &bstrSubStatus ) ); if ( FAILED( hr ) ) { goto Cleanup; } }
// Format all the strings into a single string.
if ( bstrSubStatus == NULL ) { hr = THR( HrFormatStringIntoBSTR( L"%1!ws!\n\n%2!ws!" , &bstrFullText , bstrOperation , bstrStatus ) ); } else { hr = THR( HrFormatStringIntoBSTR( L"%1!ws!\n\n%2!ws!\n\n%3!ws!" , &bstrFullText , bstrOperation , bstrStatus , bstrSubStatus ) ); } if ( FAILED( hr ) ) { goto Cleanup; }
// Display the status.
idReturn = MessageBox( hwndParentIn, bstrFullText, bstrTitle, uTypeIn );
Cleanup: TraceSysFreeString( bstrTitle ); TraceSysFreeString( bstrOperation ); TraceSysFreeString( bstrStatus ); TraceSysFreeString( bstrSubStatus ); TraceSysFreeString( bstrFullText ); va_end( valist );
if ( pidReturnOut != NULL ) { *pidReturnOut = idReturn; }
HRETURN( hr );
} //*** HrMessageBoxWithStatusString( idsStatusTextIn )
//////////////////////////////////////////////////////////////////////////////
//++
//
// HrViewLogFile
//
// Description:
// View the log file.
//
// Arguments:
// hwndParentIn
//
// Return Values:
// S_OK - Operation completed successfully
// Other HRESULT values from ShellExecute().
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT HrViewLogFile( HWND hwndParentIn ) { TraceFunc( "" );
static const WCHAR s_szVerb[] = L"open"; static const WCHAR s_szLogFileName[] = L"%windir%\\system32\\LogFiles\\Cluster\\ClCfgSrv.log";
HRESULT hr = S_OK; DWORD sc; DWORD cch; DWORD cchRet; LPWSTR pszFile = NULL;
//
// Expand environment variables in the file to open.
//
// Get the size of the output buffer.
cch = 0; cchRet = ExpandEnvironmentStrings( s_szLogFileName, NULL, cch ); if ( cchRet == 0 ) { sc = TW32( GetLastError() ); goto Win32Error; } // if: error getting length of the expansion string
// Allocate the output buffer.
cch = cchRet; pszFile = new WCHAR[ cch ]; if ( pszFile == NULL ) { sc = TW32( ERROR_OUTOFMEMORY ); goto Win32Error; }
// Expand the string into the output buffer.
cchRet = ExpandEnvironmentStrings( s_szLogFileName, pszFile, cch ); if ( cchRet == 0 ) { sc = TW32( GetLastError() ); goto Win32Error; } Assert( cchRet == cch );
//
// Execute the file.
//
sc = HandleToULong( ShellExecute( hwndParentIn // hwnd
, s_szVerb // lpVerb
, pszFile // lpFile
, NULL // lpParameters
, NULL // lpDirectory
, SW_SHOWNORMAL // nShowCommand
) ); if ( sc < 32 ) { // Values less than 32 indicate an error occurred.
TW32( sc ); goto Win32Error; } // if: error executing the file
goto Cleanup;
Win32Error: THR( HrMessageBoxWithStatus( hwndParentIn , IDS_ERR_VIEW_LOG_TITLE , IDS_ERR_VIEW_LOG_TEXT , sc , 0 // idsSubStatusIn
, ( MB_OK | MB_ICONEXCLAMATION ) , NULL // pidReturnOut
, s_szLogFileName ) ); hr = HRESULT_FROM_WIN32( sc ); goto Cleanup;
Cleanup: HRETURN( hr );
} //*** HrViewLogFile()
|