windows-nt/Source/XPSP1/NT/base/cluster/mgmt/cluscfg/wizard/summarypage.cpp

1063 lines
27 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2001 Microsoft Corporation
//
// Module Name:
// SummaryPage.cpp
//
// Maintained By:
// David Potter (DavidP) 22-MAR-2001
// Geoffrey Pease (GPease) 06-JUL-2000
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "SummaryPage.h"
#include "QuorumDlg.h"
#include "WizardUtils.h"
DEFINE_THISCLASS("CSummaryPage");
//////////////////////////////////////////////////////////////////////////////
//++
//
// CSummaryPage::CSummaryPage
//
// Description:
// Constructor.
//
// Arguments:
// pspIn -- IServiceProvider
// ecamCreateAddModeIn -- Creating cluster or adding nodes to cluster
// pbstrClusterNameIn -- Name of the cluster
// idsNextIn -- Resource ID for the Click Next string.
//
//--
//////////////////////////////////////////////////////////////////////////////
CSummaryPage::CSummaryPage(
IServiceProvider * pspIn,
ECreateAddMode ecamCreateAddModeIn,
BSTR * pbstrClusterNameIn,
UINT idsNextIn
)
{
TraceFunc( "" );
Assert( pspIn != NULL );
Assert( pbstrClusterNameIn != NULL );
Assert( idsNextIn != 0 );
m_psp = pspIn;
m_ecamCreateAddMode = ecamCreateAddModeIn;
m_pbstrClusterName = pbstrClusterNameIn;
m_idsNext = idsNextIn;
TraceFuncExit();
} //*** CSummaryPage::CSummaryPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CSummaryPage::~CSummaryPage( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
CSummaryPage::~CSummaryPage( void )
{
TraceFunc( "" );
TraceFuncExit();
} //*** CSummaryPage::~CSummaryPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CSummaryPage::OnInitDialog( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CSummaryPage::OnInitDialog( void )
{
TraceFunc( "" );
LRESULT lr = FALSE; // don't have Windows set default focus
HRESULT hr;
BSTR bstrNext = NULL;
BOOL fShowQuorumButton;
//
// Set the background color.
//
SendDlgItemMessage(
m_hwnd
, IDC_SUMMARY_RE_SUMMARY
, EM_SETBKGNDCOLOR
, 0
, GetSysColor( COLOR_3DFACE )
);
//
// Set the text of the Click Next control.
//
hr = HrLoadStringIntoBSTR( g_hInstance, m_idsNext, &bstrNext );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SetDlgItemText( m_hwnd, IDC_SUMMARY_S_NEXT, bstrNext );
//
// Hide the Quorum button if not creating a cluster.
//
fShowQuorumButton = ( m_ecamCreateAddMode == camCREATING );
ShowWindow( GetDlgItem( m_hwnd, IDC_SUMMARY_PB_QUORUM ), fShowQuorumButton ? SW_SHOW : SW_HIDE );
Cleanup:
TraceSysFreeString( bstrNext );
RETURN( lr );
} //*** CSummaryPage::OnInitDialog()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CSummaryPage::OnNotifySetActive( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CSummaryPage::OnNotifySetActive( void )
{
TraceFunc( "" );
HWND hwnd;
HRESULT hr;
DWORD dwClusterIPAddress;
DWORD dwClusterSubnetMask;
ULONG celtDummy;
OBJECTCOOKIE cookieDummy;
OBJECTCOOKIE cookieCluster;
SETTEXTEX stex;
CHARRANGE charrange;
LRESULT lr = TRUE;
BSTR bstr = NULL;
BSTR bstrUsername = NULL;
BSTR bstrPassword = NULL;
BSTR bstrDomain = NULL;
BSTR bstrNodeName = NULL;
BSTR bstrResourceName = NULL;
BSTR bstrNetworkName = NULL;
IUnknown * punk = NULL;
IObjectManager * pom = NULL;
IClusCfgClusterInfo * pcci = NULL;
IClusCfgNetworkInfo * pccni = NULL;
IClusCfgCredentials * pccc = NULL;
IEnumNodes * pen = NULL;
IClusCfgNodeInfo * pccNode = NULL;
IEnumClusCfgManagedResources * peccmr = NULL;
IClusCfgManagedResourceInfo * pccmri = NULL;
IEnumClusCfgNetworks * peccn = NULL;
//
// We're going to be using the control a lot. Grab the HWND to use.
//
hwnd = GetDlgItem( m_hwnd, IDC_SUMMARY_RE_SUMMARY );
//
// Empty the window
//
SetWindowText( hwnd, L"" );
//
// Initilize some stuff.
//
stex.flags = ST_SELECTION;
stex.codepage = 1200; // no translation/unicode
//
// Find the cluster configuration information.
//
hr = THR( m_psp->TypeSafeQS( CLSID_ObjectManager,
IObjectManager,
&pom
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( pom->FindObject( CLSID_ClusterConfigurationType,
NULL,
*m_pbstrClusterName,
DFGUID_ClusterConfigurationInfo,
&cookieCluster,
&punk
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Assert( ( *m_pbstrClusterName != NULL ) && ( **m_pbstrClusterName != L'\0' ) );
hr = THR( punk->TypeSafeQI( IClusCfgClusterInfo, &pcci ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
punk->Release();
punk = NULL;
//
// Name
//
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_CLUSTER_NAME,
&bstr,
*m_pbstrClusterName
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr);
//
// IPAddress
//
hr = THR( pcci->GetIPAddress( &dwClusterIPAddress ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( pcci->GetSubnetMask( &dwClusterSubnetMask ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Assert( dwClusterIPAddress != 0 );
Assert( dwClusterSubnetMask != 0 );
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_IPADDRESS,
&bstr,
FOURTH_IPADDRESS( dwClusterIPAddress ),
THIRD_IPADDRESS( dwClusterIPAddress ),
SECOND_IPADDRESS( dwClusterIPAddress ),
FIRST_IPADDRESS( dwClusterIPAddress ),
FOURTH_IPADDRESS( dwClusterSubnetMask ),
THIRD_IPADDRESS( dwClusterSubnetMask ),
SECOND_IPADDRESS( dwClusterSubnetMask ),
FIRST_IPADDRESS( dwClusterSubnetMask )
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
//
// Network
//
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_CLUSTER_NETWORK,
&bstr
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
hr = THR( pcci->GetNetworkInfo( &pccni ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( HrFormatNetworkInfo( pccni, &bstr ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
//
// Credentials
//
hr = THR( pcci->GetClusterServiceAccountCredentials( &pccc ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( pccc->GetCredentials( &bstrUsername, &bstrDomain, &bstrPassword ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Assert( ( bstrUsername != NULL ) && ( *bstrUsername != L'\0' ) );
Assert( ( bstrDomain != NULL ) && ( *bstrDomain != L'\0' ) );
Assert( ( bstrPassword != NULL ) && ( *bstrPassword != L'\0' ) );
//
// We don't want this!
//
ZeroMemory( bstrPassword, SysStringLen( bstrPassword ) * sizeof( bstrPassword[0] ) );
TraceSysFreeString( bstrPassword );
bstrPassword = NULL;
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_CREDENTIALS,
&bstr,
bstrUsername,
bstrDomain
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
//
// Members of cluster
//
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_MEMBERSHIP_BEGIN,
&bstr
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
hr = THR( pom->FindObject( CLSID_NodeType,
cookieCluster,
NULL,
DFGUID_EnumNodes,
&cookieDummy,
&punk
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( punk->TypeSafeQI( IEnumNodes, &pen ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
punk->Release();
punk = NULL;
for ( ;; )
{
TraceSysFreeString( bstrNodeName );
bstrNodeName = NULL;
if ( pccNode != NULL )
{
pccNode->Release();
pccNode = NULL;
}
hr = STHR( pen->Next( 1, &pccNode, &celtDummy ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
if ( hr == S_FALSE )
{
break; // exit condition
}
hr = THR( pccNode->GetName( &bstrNodeName ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Assert( ( bstrNodeName != NULL ) && ( *bstrNodeName != L'\0' ) );
TraceMemoryAddBSTR( bstrNodeName );
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_MEMBERSHIP_SEPARATOR,
&bstr,
bstrNodeName
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
} // forever (loop exits when Next() returns S_FALSE)
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_MEMBERSHIP_END,
&bstr
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
//
// Resources
//
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_RESOURCES_BEGIN,
&bstr
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
hr = THR( pom->FindObject( CLSID_ManagedResourceType,
cookieCluster,
NULL,
DFGUID_EnumManageableResources,
&cookieDummy,
&punk
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( punk->TypeSafeQI( IEnumClusCfgManagedResources, &peccmr ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
punk->Release();
punk = NULL;
while( hr == S_OK )
{
if ( pccmri != NULL )
{
pccmri->Release();
pccmri = NULL;
}
TraceSysFreeString( bstrResourceName );
bstrResourceName = NULL;
hr = STHR( peccmr->Next( 1, &pccmri, &celtDummy ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
if ( hr == S_FALSE )
{
break; // exit condition
}
hr = THR( pccmri->GetName( &bstrResourceName ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Assert( ( bstrResourceName != NULL ) && ( *bstrResourceName != L'\0' ) );
TraceMemoryAddBSTR( bstrResourceName );
hr = STHR( pccmri->IsManaged() );
if ( FAILED( hr ) )
goto Cleanup;
if ( hr == S_OK )
{
hr = STHR( pccmri->IsQuorumDevice() );
if ( FAILED( hr ) )
{
goto Cleanup;
}
if ( hr == S_OK )
{
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_RESOURCE_QUORUM_DEVICE,
&bstr,
bstrResourceName
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
} // if: quorum resource
else
{
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_RESOURCE_MANAGED,
&bstr,
bstrResourceName
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
} // else: not quorum resource
} // if: resource is managed
else
{
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_RESOURCE_NOT_MANAGED,
&bstr,
bstrResourceName
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
}
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_RESOURCES_END,
&bstr
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
//
// Networks
//
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_NETWORKS_BEGIN,
&bstr
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
hr = THR( pom->FindObject( CLSID_NetworkType,
cookieCluster,
NULL,
DFGUID_EnumManageableNetworks,
&cookieDummy,
&punk
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( punk->TypeSafeQI( IEnumClusCfgNetworks, &peccn ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
punk->Release();
punk = NULL;
while( hr == S_OK )
{
if ( pccni != NULL )
{
pccni->Release();
pccni = NULL;
}
hr = STHR( peccn->Next( 1, &pccni, &celtDummy ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
if ( hr == S_FALSE )
{
break; // exit condition
}
hr = THR( HrFormatNetworkInfo( pccni, &bstr ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
}
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_NETWORKS_END,
&bstr
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
SendMessage( hwnd, EM_SETTEXTEX, (WPARAM) &stex, (LPARAM) bstr );
//
// Done.
//
charrange.cpMax = 0;
charrange.cpMin = 0;
SendMessage( hwnd, EM_EXSETSEL, 0, (LPARAM) &charrange );
PropSheet_SetWizButtons( GetParent( m_hwnd ), PSWIZB_BACK | PSWIZB_NEXT );
hr = S_OK;
Cleanup:
TraceSysFreeString( bstrResourceName );
TraceSysFreeString( bstrNodeName );
TraceSysFreeString( bstrUsername );
TraceSysFreeString( bstrDomain );
TraceSysFreeString( bstr );
if ( punk != NULL )
{
punk->Release();
}
if ( peccn != NULL )
{
peccn->Release();
}
if ( pccmri != NULL )
{
pccmri->Release();
}
if ( peccmr != NULL )
{
peccmr->Release();
}
if ( pccNode != NULL )
{
pccNode->Release();
}
if ( pen != NULL )
{
pen->Release();
}
if ( pccni != NULL )
{
pccni->Release();
}
if ( pcci != NULL )
{
pcci->Release();
}
if ( pom != NULL )
{
pom->Release();
}
RETURN( lr );
} //*** CSummaryPage::OnNotifySetActive()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CSummaryPage::OnNotifyQueryCancel( void )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CSummaryPage::OnNotifyQueryCancel( void )
{
TraceFunc( "" );
LRESULT lr = TRUE;
int iRet;
iRet = MessageBoxFromStrings( m_hwnd,
IDS_QUERY_CANCEL_TITLE,
IDS_QUERY_CANCEL_TEXT,
MB_YESNO
);
if ( iRet == IDNO )
{
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
}
RETURN( lr );
} //*** CSummaryPage::OnNotifyQueryCancel()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CSummaryPage::OnNotify(
// WPARAM idCtrlIn,
// LPNMHDR pnmhdrIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CSummaryPage::OnNotify(
WPARAM idCtrlIn,
LPNMHDR pnmhdrIn
)
{
TraceFunc( "" );
LRESULT lr = TRUE;
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, 0 );
switch ( pnmhdrIn->code )
{
case PSN_SETACTIVE:
lr = OnNotifySetActive();
break;
case PSN_QUERYCANCEL:
lr = OnNotifyQueryCancel();
break;
} // switch: notification code
RETURN( lr );
} //*** CSummaryPage::OnNotify()
//////////////////////////////////////////////////////////////////////////////
//++
//
// LRESULT
// CSummaryPage::OnCommand(
// UINT idNotificationIn,
// UINT idControlIn,
// HWND hwndSenderIn
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT
CSummaryPage::OnCommand(
UINT idNotificationIn,
UINT idControlIn,
HWND hwndSenderIn
)
{
TraceFunc( "" );
LRESULT lr = FALSE;
HRESULT hr = S_OK;
switch ( idControlIn )
{
case IDC_SUMMARY_PB_VIEW_LOG:
if ( idNotificationIn == BN_CLICKED )
{
THR( HrViewLogFile( m_hwnd ) );
lr = TRUE;
} // if: button click
break;
case IDC_SUMMARY_PB_QUORUM:
if ( idNotificationIn == BN_CLICKED )
{
hr = STHR( CQuorumDlg::S_HrDisplayModalDialog( m_hwnd, m_psp, *m_pbstrClusterName ) );
if ( hr == S_OK )
{
OnNotifySetActive();
}
lr = TRUE;
}
break;
} // switch: idControlIn
RETURN( lr );
} //*** CSummaryPage::OnCommand()
//////////////////////////////////////////////////////////////////////////////
//++
//
// INT_PTR
// CALLBACK
// CSummaryPage::S_DlgProc(
// HWND hwndDlgIn,
// UINT nMsgIn,
// WPARAM wParam,
// LPARAM lParam
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
INT_PTR
CALLBACK
CSummaryPage::S_DlgProc(
HWND hwndDlgIn,
UINT nMsgIn,
WPARAM wParam,
LPARAM lParam
)
{
// Don't do TraceFunc because every mouse movement
// will cause this function to be called.
WndMsg( hwndDlgIn, nMsgIn, wParam, lParam );
LRESULT lr = FALSE;
CSummaryPage * pPage;
if ( nMsgIn == WM_INITDIALOG )
{
PROPSHEETPAGE * ppage = reinterpret_cast< PROPSHEETPAGE * >( lParam );
SetWindowLongPtr( hwndDlgIn, GWLP_USERDATA, (LPARAM) ppage->lParam );
pPage = reinterpret_cast< CSummaryPage * >( ppage->lParam );
pPage->m_hwnd = hwndDlgIn;
}
else
{
pPage = reinterpret_cast< CSummaryPage *> ( GetWindowLongPtr( hwndDlgIn, GWLP_USERDATA ) );
}
if ( pPage != NULL )
{
Assert( hwndDlgIn == pPage->m_hwnd );
switch ( nMsgIn )
{
case WM_INITDIALOG:
lr = pPage->OnInitDialog();
break;
case WM_NOTIFY:
lr = pPage->OnNotify( wParam, reinterpret_cast< LPNMHDR >( lParam ) );
break;
case WM_COMMAND:
lr = pPage->OnCommand( HIWORD( wParam ), LOWORD( wParam ), reinterpret_cast< HWND >( lParam ) );
break;
// no default clause needed
} // switch: nMsgIn
} // if: page is available
return lr;
} //*** CSummaryPage::S_DlgProc()
//////////////////////////////////////////////////////////////////////////////
//++
//
// HRESULT
// CSummaryPage::HrFormatNetworkInfo(
// IClusCfgNetworkInfo * pccniIn,
// BSTR * pbstrOut
// )
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CSummaryPage::HrFormatNetworkInfo(
IClusCfgNetworkInfo * pccniIn,
BSTR * pbstrOut
)
{
TraceFunc( "" );
HRESULT hr;
DWORD dwNetworkIPAddress;
DWORD dwNetworkSubnetMask;
BSTR bstrNetworkName = NULL;
BSTR bstrNetworkDescription = NULL;
BSTR bstrNetworkUsage = NULL;
IClusCfgIPAddressInfo * pccipai = NULL;
hr = THR( pccniIn->GetName( &bstrNetworkName ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Assert( ( bstrNetworkName != NULL ) && ( *bstrNetworkName != L'\0' ) );
TraceMemoryAddBSTR( bstrNetworkName );
hr = THR( pccniIn->GetDescription( &bstrNetworkDescription ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
TraceMemoryAddBSTR( bstrNetworkDescription );
hr = STHR( pccniIn->IsPublic() );
if ( FAILED( hr ) )
{
goto Cleanup;
}
if ( hr == S_OK )
{
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_NETWORK_PUBLIC,
&bstrNetworkUsage
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
} // if: public network
hr = STHR( pccniIn->IsPrivate() );
if ( FAILED( hr ) )
{
goto Cleanup;
}
if ( hr == S_OK )
{
if ( bstrNetworkUsage == NULL )
{
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_NETWORK_PRIVATE,
&bstrNetworkUsage
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
} // if: not public network
else
{
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_NETWORK_BOTH,
&bstrNetworkUsage
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
} // else: public network
} // if: private network
else if ( bstrNetworkUsage == NULL )
{
hr = THR( HrLoadStringIntoBSTR( g_hInstance,
IDS_SUMMARY_NETWORK_NOTUSED,
&bstrNetworkUsage
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
} // else: not private or public network
hr = THR( pccniIn->GetPrimaryNetworkAddress( &pccipai ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( pccipai->GetIPAddress( &dwNetworkIPAddress ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
hr = THR( pccipai->GetSubnetMask( &dwNetworkSubnetMask ) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Assert( dwNetworkIPAddress != 0 );
Assert( dwNetworkSubnetMask != 0 );
hr = THR( HrFormatMessageIntoBSTR( g_hInstance,
IDS_SUMMARY_NETWORK_INFO,
pbstrOut,
bstrNetworkName,
bstrNetworkDescription,
bstrNetworkUsage,
FOURTH_IPADDRESS( dwNetworkIPAddress ),
THIRD_IPADDRESS( dwNetworkIPAddress ),
SECOND_IPADDRESS( dwNetworkIPAddress ),
FIRST_IPADDRESS( dwNetworkIPAddress ),
FOURTH_IPADDRESS( dwNetworkSubnetMask ),
THIRD_IPADDRESS( dwNetworkSubnetMask ),
SECOND_IPADDRESS( dwNetworkSubnetMask ),
FIRST_IPADDRESS( dwNetworkSubnetMask )
) );
if ( FAILED( hr ) )
{
goto Cleanup;
}
Cleanup:
if ( pccipai != NULL )
{
pccipai->Release();
}
TraceSysFreeString( bstrNetworkUsage );
TraceSysFreeString( bstrNetworkName );
TraceSysFreeString( bstrNetworkDescription );
HRETURN( hr );
} //*** CSummaryPage::HrEditStreamCallback()