|
|
//////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2001 Microsoft Corporation
//
// Module Name:
// IPAddressPage.cpp
//
// Maintained By:
// David Potter (DavidP) 31-JAN-2001
// Geoffrey Pease (GPease) 12-MAY-2000
//
//////////////////////////////////////////////////////////////////////////////
#include "Pch.h"
#include "IPAddressPage.h"
DEFINE_THISCLASS("CIPAddressPage");
#define CONVERT_ADDRESS( _addrOut, _addrIn ) \
_addrOut = ( FIRST_IPADDRESS( _addrIn ) ) | ( SECOND_IPADDRESS( _addrIn ) << 8 ) | ( THIRD_IPADDRESS( _addrIn ) << 16 ) | ( FOURTH_IPADDRESS( _addrIn ) << 24 )
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::CIPAddressPage
//
// Descriptor:
// Constructor.
//
// Arguments:
// pspIn -- IServiceProvider
// ecamCreateAddModeIn -- Creating cluster or adding nodes to cluster.
// pulIPAddressInout -- Pointer to IP address fill in.
// pulIPSubnetInout -- Pointer to subnet mask to fill in.
// pbstrNetworkNameInout -- Pointer to network name string to fill in.
// pbstrClusterNameIn -- Name of the cluster
//
// Return Values:
// None.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
CIPAddressPage::CIPAddressPage( IServiceProvider * pspIn, ECreateAddMode ecamCreateAddModeIn, ULONG * pulIPAddressInout, ULONG * pulIPSubnetInout, BSTR * pbstrNetworkNameInout, BSTR * pbstrClusterNameIn ) { TraceFunc( "" );
Assert( pspIn != NULL ); Assert( pulIPAddressInout != NULL ); Assert( pulIPSubnetInout != NULL ); Assert( pbstrNetworkNameInout != NULL ); Assert( pbstrClusterNameIn != NULL );
// m_hwnd
THR( pspIn->TypeSafeQI( IServiceProvider, &m_psp ) ); m_pulIPAddress = pulIPAddressInout; m_pulIPSubnet = pulIPSubnetInout; m_pbstrNetworkName = pbstrNetworkNameInout; m_pbstrClusterName = pbstrClusterNameIn;
m_cookieCompletion = NULL; m_event = NULL;
m_cRef = 0;
TraceFuncExit();
} //*** CIPAddressPage::CIPAddressPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::~CIPAddressPage
//
// Description:
// Destructor.
//
// Arguments:
// None.
//
// Return Values:
// None.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
CIPAddressPage::~CIPAddressPage( void ) { TraceFunc( "" );
if ( m_psp != NULL ) { m_psp->Release(); }
if ( m_event != NULL ) { CloseHandle( m_event ); }
Assert( m_cRef == 0 );
TraceFuncExit();
} //*** CIPAddressPage::~CIPAddressPage()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::OnInitDialog
//
// Description:
//
// Arguments:
// None.
//
// Return Values:
// FALSE
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CIPAddressPage::OnInitDialog( void ) { TraceFunc( "" );
LRESULT lr = FALSE;
if ( *m_pulIPAddress != 0 ) { ULONG ulIPAddress; CONVERT_ADDRESS( ulIPAddress, *m_pulIPAddress ); SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, IPM_SETADDRESS, 0, ulIPAddress ); }
m_event = CreateEvent( NULL, TRUE, FALSE, NULL ); Assert( m_event != NULL );
RETURN( lr );
} //*** CIPAddressPage::OnInitDialog()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::OnCommand
//
// Description:
//
// Arguments:
// idNotificationIn
// idControlIn
// hwndSenderIn
//
// Return Values:
// TRUE
// FALSE
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CIPAddressPage::OnCommand( UINT idNotificationIn, UINT idControlIn, HWND hwndSenderIn ) { TraceFunc( "" );
LRESULT lr = FALSE;
switch ( idControlIn ) { case IDC_IPADDRESS_IP_ADDRESS: if ( idNotificationIn == IPN_FIELDCHANGED || idNotificationIn == EN_CHANGE ) { THR( HrUpdateWizardButtons() ); lr = TRUE; } break;
} // switch: idControlIn
RETURN( lr );
} //*** CIPAddressPage::OnCommand()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::HrUpdateWizardButtons
//
// Description:
//
// Arguments:
// None.
//
// Return Values:
// S_OK
// Other HRESULT values.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CIPAddressPage::HrUpdateWizardButtons( void ) { TraceFunc( "" );
HRESULT hr = S_OK;
DWORD dwFlags = PSWIZB_BACK | PSWIZB_NEXT; LRESULT lr; ULONG ulIPAddress;
lr = SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, IPM_ISBLANK, 0, 0 ); if ( lr != 0 ) { dwFlags &= ~PSWIZB_NEXT; }
SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, IPM_GETADDRESS, 0, (LPARAM) &ulIPAddress ); if ( ( ulIPAddress == 0) // Bad IP
|| ( ulIPAddress == MAKEIPADDRESS( 255, 255, 255, 255 ) ) // Bad IP
) { dwFlags &= ~PSWIZB_NEXT; }
PropSheet_SetWizButtons( GetParent( m_hwnd ), dwFlags );
HRETURN( hr );
} //*** CIPAddressPage::HrUpdateWizardButtons()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::OnNotifyQueryCancel
//
// Description:
//
// Arguments:
// None.
//
// Return Values:
// TRUE
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CIPAddressPage::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 );
} //*** CIPAddressPage::OnNotifyQueryCancel()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::OnNotifySetActive
//
// Description:
//
// Arguments:
// None.
//
// Return Values:
// TRUE
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CIPAddressPage::OnNotifySetActive( void ) { TraceFunc( "" );
LRESULT lr = TRUE;
// Enable controls on the page.
SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, WM_ENABLE, TRUE, 0 );
THR( HrUpdateWizardButtons() );
RETURN( lr );
} //*** CIPAddressPage::OnNotifySetActive()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::OnNotifyWizNext
//
// Description:
//
// Arguments:
// None.
//
// Return Values:
// TRUE
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CIPAddressPage::OnNotifyWizNext( void ) { TraceFunc( "" );
HRESULT hr; HRESULT hrStatus; BOOL fRet; DWORD ulAddress;
OBJECTCOOKIE cookieDummy;
LRESULT lr = TRUE; DWORD dwCookieNotify = 0;
IUnknown * punk = NULL; IObjectManager * pom = NULL; ITaskManager * ptm = NULL; IClusCfgClusterInfo * pccci = NULL; IClusCfgNetworkInfo * pccni = NULL; ITaskVerifyIPAddress * ptvipa = NULL; IStandardInfo * psi = NULL; IConnectionPointContainer * pcpc = NULL; IConnectionPoint * pcp = NULL;
CWaitCursor WaitCursor;
// Disable controls on the page.
SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, WM_ENABLE, FALSE, 0 );
//
// Get the IP address from the UI.
//
SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, IPM_GETADDRESS, 0, (LPARAM) &ulAddress ); CONVERT_ADDRESS( *m_pulIPAddress, ulAddress );
//
// See if this IP address can be matched to a network.
hr = THR( HrFindNetworkForIPAddress( &pccni ) ); if ( FAILED( hr ) ) { goto Error; } if ( hr == S_FALSE ) { MessageBoxFromStrings( m_hwnd , IDS_CANNOT_FIND_MATCHING_NETWORK_TITLE , IDS_CANNOT_FIND_MATCHING_NETWORK_TEXT , MB_OK ); goto Error; }
//
// Grab some managers we will need.
//
hr = THR( m_psp->TypeSafeQS( CLSID_ObjectManager, IObjectManager, &pom ) ); if ( FAILED( hr ) ) { goto Error; }
hr = THR( m_psp->TypeSafeQS( CLSID_TaskManager, ITaskManager, &ptm ) ); if ( FAILED( hr ) ) { goto Error; }
hr = THR( m_psp->TypeSafeQS( CLSID_NotificationManager, IConnectionPointContainer, &pcpc ) ); if ( FAILED( hr ) ) { goto Error; }
hr = THR( pcpc->FindConnectionPoint( IID_INotifyUI, &pcp ) ); if ( FAILED( hr ) ) { goto Error; }
//
// Get the cluster configuration info.
//
hr = THR( pom->FindObject( CLSID_ClusterConfigurationType, NULL, *m_pbstrClusterName, DFGUID_ClusterConfigurationInfo, &cookieDummy, &punk ) ); if ( FAILED( hr ) ) { goto Error; }
hr = THR( punk->TypeSafeQI( IClusCfgClusterInfo, &pccci ) ); if ( FAILED( hr ) ) { goto Error; }
punk->Release(); punk = NULL;
//
// Set the IP adddress.
//
hr = THR( pccci->SetIPAddress( *m_pulIPAddress ) ); if ( FAILED( hr ) ) { goto Error; }
//
// Set the IP subnet mask.
//
hr = THR( pccci->SetSubnetMask( *m_pulIPSubnet ) ); if ( FAILED( hr ) ) { goto Error; }
//
// Set the network.
//
hr = THR( pccci->SetNetworkInfo( pccni ) ); if ( FAILED( hr ) ) { goto Error; }
//
// Register to get UI notification (if needed)
//
hr = THR( pcp->Advise( static_cast< INotifyUI * >( this ), &dwCookieNotify ) ); if ( FAILED( hr ) ) { goto Error; }
//
// See the IP address is already present on the network.
//
hr = THR( ptm->CreateTask( TASK_VerifyIPAddress, &punk ) ); if ( FAILED( hr ) ) { goto Error; }
hr = THR( punk->TypeSafeQI( ITaskVerifyIPAddress, &ptvipa ) ); if ( FAILED( hr ) ) { goto Error; }
punk->Release(); punk = NULL;
hr = THR( ptvipa->SetIPAddress( *m_pulIPAddress ) ); if ( FAILED( hr ) ) { goto Error; }
// Don't wrap - this can fail with E_PENDING
hr = pom->FindObject( CLSID_TaskVerifyIPAddressCompletionCookieType, NULL, *m_pbstrClusterName, IID_NULL, &m_cookieCompletion, &punk // dummy
); Assert( punk == NULL ); if ( hr == E_PENDING ) { // no-op.
} else if ( FAILED( hr ) ) { THR( hr ); goto Error; }
hr = THR( ptvipa->SetCookie( m_cookieCompletion ) ); if ( FAILED( hr ) ) { goto Error; }
// reset the event before submitting.
if ( m_event != NULL ) { fRet = ResetEvent( m_event ); Assert( fRet ); }
hr = THR( ptm->SubmitTask( ptvipa ) ); if ( FAILED( hr ) ) { goto Error; }
//
// Now wait for the work to be done.
//
if ( m_event != NULL ) { MSG msg; DWORD dwErr;
for( dwErr = -1; dwErr != WAIT_OBJECT_0; ) { while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } // while: PeekMessage
CWaitCursor Wait2;
dwErr = MsgWaitForMultipleObjects( 1, &m_event, FALSE, 10000, // wait at most 10 seconds
QS_ALLEVENTS | QS_ALLINPUT | QS_ALLPOSTMESSAGE ); AssertMsg( dwErr != WAIT_TIMEOUT, "Need to bump up the timeout period." ); if ( dwErr == WAIT_TIMEOUT ) { break; // give up and continue
}
} // for: dwErr
}
hr = THR( pom->GetObject( DFGUID_StandardInfo, m_cookieCompletion, &punk ) ); if ( SUCCEEDED( hr ) ) { hr = THR( punk->TypeSafeQI( IStandardInfo, &psi ) ); if ( FAILED( hr ) ) { goto Error; }
punk->Release(); punk = NULL;
hr = THR( psi->GetStatus( &hrStatus ) ); if ( hrStatus == S_FALSE ) { int iAnswer;
//
// We detected a duplicate IP address on the network. Ask the user if
// they want to go back and change the IP or continue on.
//
iAnswer = MessageBoxFromStrings( m_hwnd, IDS_ERR_IPADDRESS_ALREADY_PRESENT_TITLE, IDS_ERR_IPADDRESS_ALREADY_PRESENT_TEXT, MB_YESNO ); if ( iAnswer == IDYES ) { goto Error; } } }
goto Cleanup;
Error: // Enable controls on the page again.
SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, WM_ENABLE, TRUE, 0 ); SendDlgItemMessage( m_hwnd, IDC_IPADDRESS_IP_ADDRESS, WM_SETFOCUS, 0, 0 );
SetWindowLongPtr( m_hwnd, DWLP_MSGRESULT, -1 );
goto Cleanup;
Cleanup: if ( punk != NULL ) { punk->Release(); } if ( psi != NULL ) { psi->Release(); } if ( ptm != NULL ) { ptm->Release(); } if ( ptvipa != NULL ) { ptvipa->Release(); } if ( pccci != NULL ) { pccci->Release(); } if ( pccni != NULL ) { pccni->Release(); } if ( pcpc != NULL ) { pcpc->Release(); } if ( pcp != NULL ) { if ( dwCookieNotify != 0 ) { THR( pcp->Unadvise( dwCookieNotify ) ); }
Assert( m_cRef == 0 );
pcp->Release(); } if ( pom != NULL ) { pom->Release(); }
RETURN( lr );
} //*** CIPAddressPage::OnNotifyWizNext()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::OnNotify
//
// Description:
// Handle the WM_NOTIFY windows message.
//
// Arguments:
// idCtrlIn
// pnmhdrIn
//
// Return Values:
// TRUE
// Other LRESULT values.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
LRESULT CIPAddressPage::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_WIZNEXT: lr = OnNotifyWizNext(); break;
case PSN_QUERYCANCEL: lr = OnNotifyQueryCancel(); break; }
RETURN( lr );
} //*** CIPAddressPage::OnNotify()
//////////////////////////////////////////////////////////////////////////////
//++
//
// static
// CALLBACK
// CIPAddressPage::S_DlgProc
//
// Description:
// Dialog proc for this page.
//
// Arguments:
// hDlgIn
// MsgIn
// wParam
// lParam
//
// Return Values:
// FALSE
// Other LRESULT values.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK CIPAddressPage::S_DlgProc( HWND hDlgIn, UINT MsgIn, WPARAM wParam, LPARAM lParam ) { // Don't do TraceFunc because every mouse movement
// will cause this function to be called.
WndMsg( hDlgIn, MsgIn, wParam, lParam );
LRESULT lr = FALSE;
CIPAddressPage * pPage = reinterpret_cast< CIPAddressPage *> ( GetWindowLongPtr( hDlgIn, GWLP_USERDATA ) );
if ( MsgIn == WM_INITDIALOG ) { PROPSHEETPAGE * ppage = reinterpret_cast< PROPSHEETPAGE * >( lParam ); SetWindowLongPtr( hDlgIn, GWLP_USERDATA, (LPARAM) ppage->lParam ); pPage = reinterpret_cast< CIPAddressPage * >( ppage->lParam ); pPage->m_hwnd = hDlgIn; }
if ( pPage != NULL ) { Assert( hDlgIn == pPage->m_hwnd );
switch( MsgIn ) { 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 ), (HWND) lParam ); break;
// no default clause needed
} // switch: message
} // if: there is a page associated with the window
return lr;
} //*** CIPAddressPage::S_DlgProc()
// ************************************************************************
//
// IUnknown
//
// ************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// [IUnknown]
// CIPAddressPage::QueryInterface
//
// Description:
//
// Arguments:
// riidIn
// ppvOut
//
// Return Values:
// S_OK
// E_NOINTERFACE
// Other HRESULT values.
//
// Remarks:
// Supports IUnknown and INotifyUI.
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CIPAddressPage::QueryInterface( REFIID riidIn, LPVOID * ppvOut ) { TraceQIFunc( riidIn, ppvOut );
HRESULT hr = E_NOINTERFACE;
if ( IsEqualIID( riidIn, IID_IUnknown ) ) { *ppvOut = static_cast< INotifyUI * >( this ); hr = S_OK; } // if: IUnknown
else if ( IsEqualIID( riidIn, IID_INotifyUI ) ) { *ppvOut = TraceInterface( __THISCLASS__, INotifyUI, this, 0 ); hr = S_OK; } // else if: INotifyUI
if ( SUCCEEDED( hr ) ) { ((IUnknown*) *ppvOut)->AddRef(); } // if: success
QIRETURN_IGNORESTDMARSHALLING( hr, riidIn );
} //*** CIPAddressPage::QueryInterface()
//////////////////////////////////////////////////////////////////////////////
//++
//
// [IUnknown]
// CIPAddressPage::AddRef
//
// Description:
//
// Arguments:
// None.
//
// Return Values:
// New reference count.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CIPAddressPage::AddRef( void ) { TraceFunc( "[IUnknown]" );
InterlockedIncrement( &m_cRef );
RETURN( m_cRef );
} //*** CIPAddressPage::AddRef()
//////////////////////////////////////////////////////////////////////////////
//++
//
// [IUnknown]
// CIPAddressPage::Release
//
// Description:
//
// Arguments:
// None.
//
// Return Values:
// New reference count.
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_( ULONG ) CIPAddressPage::Release( void ) { TraceFunc( "[IUnknown]" );
LONG cRef;
InterlockedDecrement( &m_cRef ); cRef = m_cRef;
if ( cRef == 0 ) { // TraceDo( delete this );
}
RETURN( cRef );
} //*** CIPAddressPage::Release()
//****************************************************************************
//
// INotifyUI
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// [INotifyUI]
// CIPAddressPage::ObjectChanged
//
// Description:
//
// Arguments:
// cookieIn
//
// Return Values:
// S_OK
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CIPAddressPage::ObjectChanged( OBJECTCOOKIE cookieIn ) { TraceFunc( "[INotifyUI]" );
BOOL fRet; HRESULT hr = S_OK;
if ( cookieIn == m_cookieCompletion && m_event != NULL ) { fRet = SetEvent( m_event ); Assert( fRet ); }
HRETURN( hr );
} //*** CIPAddressPage::ObjectChanged()
//****************************************************************************
//
// Private Functions
//
//****************************************************************************
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::HrFindNetworkForIPAddress
//
// Description:
// Find the network for the saved IP address.
//
// Arguments:
// ppccniOut -- Network info to return.
//
// Return Values:
// S_OK
// S_FALSE
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CIPAddressPage::HrFindNetworkForIPAddress( IClusCfgNetworkInfo ** ppccniOut ) { TraceFunc( "" );
HRESULT hr = S_OK; IUnknown * punk = NULL; IObjectManager * pom = NULL; IEnumCookies * pec = NULL; IEnumClusCfgNetworks * peccn = NULL; IClusCfgNetworkInfo * pccni = NULL; BSTR bstrNetName = NULL; OBJECTCOOKIE cookieCluster; OBJECTCOOKIE cookieNode; OBJECTCOOKIE cookieDummy; ULONG celtDummy; bool fFoundNetwork = false;
Assert( ppccniOut != NULL );
//
// Grab the object manager.
//
hr = THR( m_psp->TypeSafeQS( CLSID_ObjectManager, IObjectManager, &pom ) ); if ( FAILED( hr ) ) { goto Cleanup; }
//
// Get the cluster configuration info cookie.
//
hr = THR( pom->FindObject( CLSID_ClusterConfigurationType, NULL, *m_pbstrClusterName, IID_NULL, &cookieCluster, &punk ) ); Assert( punk == NULL ); if ( FAILED( hr ) ) { goto Cleanup; }
//
// Get the enumeration of nodes whose parent is this cluster.
// We want the enumeration of cookies (indicated by using
// DFGUID_EnumCookies) because we want to use the cookie of the
// node to search for all networks on that node.
//
hr = THR( pom->FindObject( CLSID_NodeType, cookieCluster, NULL, DFGUID_EnumCookies, &cookieDummy, &punk ) ); if ( FAILED( hr ) ) { goto Cleanup; }
hr = THR( punk->TypeSafeQI( IEnumCookies, &pec ) ); if ( FAILED( hr ) ) { goto Cleanup; }
pec = TraceInterface( L"CIPAddressPage!IEnumCookies", IEnumCookies, pec, 1 );
punk->Release( ); punk = NULL;
//
// Get the cookie for the first node in the node enumeration.
//
hr = THR( pec->Next( 1, &cookieNode, &celtDummy ) ); if ( FAILED( hr ) ) { goto Cleanup; }
//
// Get the network enumerator.
//
hr = THR( pom->FindObject( CLSID_NetworkType, cookieNode, 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;
//
// Add each network to the combobox.
//
for ( ;; ) { // Get the next network.
hr = STHR( peccn->Next( 1, &pccni, &celtDummy ) ); if ( hr == S_FALSE ) { break; } if ( FAILED( hr ) ) { goto Cleanup; }
// Skip this network if it isn't public.
hr = STHR( pccni->IsPublic() ); if ( hr == S_OK ) { // Get the name of the network.
hr = THR( pccni->GetName( &bstrNetName ) ); if ( SUCCEEDED( hr ) ) { TraceMemoryAddBSTR( bstrNetName );
// Determine if this network matches the user's IP address.
// If it is, select it in the combobox.
if ( ! fFoundNetwork ) { hr = STHR( HrMatchNetwork( pccni, bstrNetName ) ); if ( hr == S_OK ) { fFoundNetwork = true; *ppccniOut = pccni; (*ppccniOut)->AddRef(); break; } }
// Cleanup.
TraceSysFreeString( bstrNetName ); bstrNetName = NULL;
} // if: name retrieved successfully
} // if: network is public
pccni->Release(); pccni = NULL; } // forever
if ( fFoundNetwork ) { hr = S_OK; } else { hr = S_FALSE; }
Cleanup: if ( punk != NULL ) { punk->Release( ); } TraceSysFreeString( bstrNetName ); if ( pccni != NULL ) { pccni->Release(); } if ( peccn != NULL ) { peccn->Release(); } if ( pec != NULL ) { pec->Release(); } if ( pom != NULL ) { pom->Release(); }
HRETURN( hr );
} //*** CIPAddressPage::HrFindNetworkForIPAddress()
//////////////////////////////////////////////////////////////////////////////
//++
//
// CIPAddressPage::HrMatchNetwork
//
// Description:
// Match a network to the saved IP address.
//
// Arguments:
// pccniIn
// bstrNetworkNameIn
//
// Return Values:
// S_OK
// S_FALSE
//
// Remarks:
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT CIPAddressPage::HrMatchNetwork( IClusCfgNetworkInfo * pccniIn, BSTR bstrNetworkNameIn ) { TraceFunc( "" );
HRESULT hr = S_OK; IClusCfgIPAddressInfo * pccipai = NULL; ULONG ulIPAddress; ULONG ulIPSubnet;
Assert( pccniIn != NULL ); Assert( bstrNetworkNameIn != NULL );
//
// Get the IP Address Info for the network.
//
hr = THR( pccniIn->GetPrimaryNetworkAddress( &pccipai ) ); if ( FAILED( hr ) ) { goto Cleanup; }
//
// Get the address and subnet of the network.
//
hr = THR( pccipai->GetIPAddress( &ulIPAddress ) ); if ( FAILED( hr ) ) { goto Cleanup; }
hr = THR( pccipai->GetSubnetMask( &ulIPSubnet ) ); if ( FAILED( hr ) ) { goto Cleanup; }
//
// Determine if these match.
//
if ( ClRtlAreTcpipAddressesOnSameSubnet( *m_pulIPAddress, ulIPAddress, ulIPSubnet) ) { // Save the subnet mask.
*m_pulIPSubnet = ulIPSubnet;
// Save the name of the network.
if ( *m_pbstrNetworkName == NULL ) { *m_pbstrNetworkName = TraceSysAllocString( bstrNetworkNameIn ); if ( *m_pbstrNetworkName == NULL ) { goto OutOfMemory; } } else { INT iRet = TraceSysReAllocString( m_pbstrNetworkName, bstrNetworkNameIn ); if ( ! iRet ) { goto OutOfMemory; } } } // if: match found
else { hr = S_FALSE; }
goto Cleanup;
OutOfMemory: hr = E_OUTOFMEMORY; goto Cleanup;
Cleanup: if ( pccipai != NULL ) { pccipai->Release(); }
HRETURN( hr );
} //*** CIPAddressPage::HrMatchNetwork()
|