diff options
Diffstat (limited to 'network/config/bindview/BINDING.CPP')
| -rw-r--r-- | network/config/bindview/BINDING.CPP | 827 |
1 files changed, 827 insertions, 0 deletions
diff --git a/network/config/bindview/BINDING.CPP b/network/config/bindview/BINDING.CPP new file mode 100644 index 00000000..b3771004 --- /dev/null +++ b/network/config/bindview/BINDING.CPP @@ -0,0 +1,827 @@ +//+--------------------------------------------------------------------------- +// +// Microsoft Windows +// Copyright (C) Microsoft Corporation, 2001. +// +// File: B I N D I N G . C P P +// +// Contents: Functions to illustrate +// o How to enumerate binding paths. +// o How to enumerate binding interfaces. +// o How to enable/disable bindings. +// +// Notes: +// +// Author: Alok Sinha 15-May-01 +// +//---------------------------------------------------------------------------- + +#include "bindview.h" + +// +// Function: WriteBindings +// +// Purpose: Write bindings to specified file. +// +// Arguments: +// fp [in] File handle. +// +// Returns: None. +// +// Notes: +// + +VOID WriteBindings (FILE *fp) +{ + INetCfg *pnc; + IEnumNetCfgComponent *pencc; + INetCfgComponent *pncc; + LPWSTR lpszApp; + HRESULT hr; + UINT i; + + + hr = HrGetINetCfg( FALSE, + APP_NAME, + &pnc, + &lpszApp ); + + if ( hr == S_OK ) { + + for (i=CLIENTS_SELECTED; i <= PROTOCOLS_SELECTED; ++i) { + + fwprintf( fp, L"--- Bindings of %s ---\n", lpszNetClass[i] ); + + // + // Get Component Enumerator Interface. + // + + hr = HrGetComponentEnum( pnc, + pguidNetClass[i], + &pencc ); + if ( hr == S_OK ) { + + hr = HrGetFirstComponent( pencc, &pncc ); + + while( hr == S_OK ) { + + // + // Write bindings of the component. + // + + WriteBindingPath( fp, + pncc ); + ReleaseRef( pncc ); + + fwprintf( fp, L"\n" ); + + hr = HrGetNextComponent( pencc, &pncc ); + } + + fwprintf( fp, L"\n" ); + + // + // S_FALSE merely indicates that there are no more components. + // + + if ( hr == S_FALSE ) { + hr = S_OK; + } + + ReleaseRef( pencc ); + } + else { + ErrMsg( hr, + L"Couldn't get the component enumerator interface." ); + } + } + + HrReleaseINetCfg( pnc, FALSE ); + } + else { + if ( (hr == NETCFG_E_NO_WRITE_LOCK) && lpszApp ) { + ErrMsg( hr, + L"%s currently holds the lock, try later.", + lpszApp ); + + CoTaskMemFree( lpszApp ); + } + else { + ErrMsg( hr, + L"Couldn't get the notify object interface." ); + } + } + + return; +} + +// +// Function: WriteBindingPath +// +// Purpose: Write binding paths of a component. +// +// Arguments: +// fp [in] File handle. +// pncc [in] Network component. +// +// Returns: None. +// +// Notes: +// + +VOID WriteBindingPath (FILE *fp, + INetCfgComponent *pncc) +{ + IEnumNetCfgBindingPath *pencbp; + INetCfgBindingPath *pncbp; + LPWSTR lpszName; + HRESULT hr; + + // + // Write the first component's name. + // + + hr = pncc->GetDisplayName( &lpszName ); + + if ( hr == S_OK ) { + fwprintf( fp, L"\n%s", lpszName ); + } + else { + ErrMsg( hr, + L"Unable to get the display name of a component, " + L" some binding paths will not be written." ); + + return; + } + + // + // Get binding path enumerator. + // + + hr = HrGetBindingPathEnum( pncc, + EBP_BELOW, + &pencbp ); + if ( hr == S_OK ) { + + hr = HrGetFirstBindingPath( pencbp, + &pncbp ); + + while( hr == S_OK ) { + + // + // Write interfaces of the binding path. + // + + WriteInterfaces( fp, + pncbp ); + + ReleaseRef( pncbp ); + + hr = HrGetNextBindingPath( pencbp, + &pncbp ); + if ( hr == S_OK ) { + fwprintf( fp, L"\n%s", lpszName ); + } + } + + ReleaseRef( pencbp ); + } + else { + ErrMsg( hr, + L"Couldn't get the binding path enumerator of %s. " + L"Its binding paths will not be written.", + lpszName ); + } + + CoTaskMemFree( lpszName ); + return; +} + +// +// Function: WriteInterfaces +// +// Purpose: Write bindings to specified file. +// +// Arguments: +// fp [in] File handle. +// pncbp [in] Binding path. +// +// Returns: None. +// +// Notes: +// + +VOID WriteInterfaces (FILE *fp, + INetCfgBindingPath *pncbp) +{ + IEnumNetCfgBindingInterface *pencbi; + INetCfgBindingInterface *pncbi; + INetCfgComponent *pnccLower; + LPWSTR lpszName; + HRESULT hr; + + hr = HrGetBindingInterfaceEnum( pncbp, + &pencbi ); + + if ( hr == S_OK ) { + + hr = HrGetFirstBindingInterface( pencbi, + &pncbi ); + + // + // Write lower component of each interface. + // + + while( hr == S_OK ) { + + hr = pncbi->GetLowerComponent ( &pnccLower ); + + if ( hr == S_OK ) { + + hr = pnccLower->GetDisplayName( &lpszName ); + if ( hr == S_OK ) { + fwprintf( fp, L"-->%s", lpszName ); + CoTaskMemFree( lpszName ); + } + } + + ReleaseRef( pnccLower ); + ReleaseRef( pncbi ); + + hr = HrGetNextBindingInterface( pencbi, + &pncbi ); + } + + ReleaseRef( pencbi ); + } + else { + ErrMsg( hr, + L"Couldn't get the binding interface enumerator." + L"The binding interfaces will not be shown." ); + } + + return; +} + +// +// Function: EnumNetBindings +// +// Purpose: Enumerate components and their bindings. +// +// Arguments: +// hwndTree [in] Tree handle. +// uiTypeSelected [in] Type of network component selected. +// +// Returns: TRUE on success. +// +// Notes: +// + +BOOL EnumNetBindings (HWND hwndTree, + UINT uiTypeSelected) +{ + INetCfg *pnc; + IEnumNetCfgComponent *pencc; + INetCfgComponent *pncc; + LPWSTR lpszApp; + HTREEITEM hTreeItem; + HRESULT hr; + + + hr = HrGetINetCfg( FALSE, + APP_NAME, + &pnc, + &lpszApp ); + + if ( hr == S_OK ) { + + // + // Get Component Enumerator Interface. + // + + hr = HrGetComponentEnum( pnc, + pguidNetClass[uiTypeSelected], + &pencc ); + if ( hr == S_OK ) { + + hr = HrGetFirstComponent( pencc, &pncc ); + + while( hr == S_OK ) { + + // + // Add the component's name to the tree. + // + + hTreeItem = AddToTree( hwndTree, + TVI_ROOT, + pncc ); + if ( hTreeItem ) { + + // + // Enumerate bindings. + // + + ListBindings( pncc, + hwndTree, + hTreeItem ); + } + + ReleaseRef( pncc ); + + hr = HrGetNextComponent( pencc, &pncc ); + } + + // + // S_FALSE merely indicates that there are no more components. + // + + if ( hr == S_FALSE ) { + hr = S_OK; + } + + ReleaseRef( pencc ); + } + else { + ErrMsg( hr, + L"Couldn't get the component enumerator interface." ); + } + + HrReleaseINetCfg( pnc, FALSE ); + } + else { + if ( (hr == NETCFG_E_NO_WRITE_LOCK) && lpszApp ) { + ErrMsg( hr, + L"%s currently holds the lock, try later.", + lpszApp ); + + CoTaskMemFree( lpszApp ); + } + else { + ErrMsg( hr, + L"Couldn't get the notify object interface." ); + } + } + + return hr == S_OK; +} + +// +// Function: ListBindings +// +// Purpose: Enumerate bindings of network components. +// +// Arguments: +// pncc [in] Network component. +// hwndTree [in] Tree handle. +// hTreeItemRoot [in] Parent item. +// +// Returns: None. +// +// Notes: +// + +VOID ListBindings (INetCfgComponent *pncc, + HWND hwndTree, + HTREEITEM hTreeItemRoot) +{ + IEnumNetCfgBindingPath *pencbp; + INetCfgBindingPath *pncbp; + HTREEITEM hTreeItem; + ULONG ulIndex; + HRESULT hr; + + hr = HrGetBindingPathEnum( pncc, + EBP_BELOW, + &pencbp ); + if ( hr == S_OK ) { + + hr = HrGetFirstBindingPath( pencbp, + &pncbp ); + + ulIndex = 1; + + while( hr == S_OK ) { + + // + // Add an item for the binding path. + // + + hTreeItem = AddBindNameToTree( pncbp, + hwndTree, + hTreeItemRoot, + ulIndex ); + + if ( hTreeItem ) { + + // + // Enumerate interfaces. + // + + ListInterfaces( pncbp, + hwndTree, + hTreeItem ); + } + + ReleaseRef( pncbp ); + + hr = HrGetNextBindingPath( pencbp, + &pncbp ); + + ulIndex++; + } + + ReleaseRef( pencbp ); + } + else { + LPWSTR lpszName; + + if ( pncc->GetDisplayName(&lpszName) == S_OK ) { + + ErrMsg( hr, + L"Couldn't get the binding path enumerator of %s. " + L"Its binding paths will not be shown.", + lpszName ); + + CoTaskMemFree( lpszName ); + } + else { + ErrMsg( hr, + L"Couldn't get the binding path enumerator of a " + L"network component. The binding paths will not " + L"be shown." ); + } + } + + return; +} + +// +// Function: ListInterfaces +// +// Purpose: Enumerate interfaces of a binding path. +// +// Arguments: +// pncbp [in] Binding path. +// hwndTree [in] Tree handle. +// hTreeItemRoot [in] Parent item. +// +// Returns: None. +// +// Notes: +// + +VOID ListInterfaces (INetCfgBindingPath *pncbp, + HWND hwndTree, + HTREEITEM hTreeItemRoot) +{ + IEnumNetCfgBindingInterface *pencbi; + INetCfgBindingInterface *pncbi; + INetCfgComponent *pnccBound; + HTREEITEM hTreeItem; + HRESULT hr; + + hr = HrGetBindingInterfaceEnum( pncbp, + &pencbi ); + + if ( hr == S_OK ) { + + hr = HrGetFirstBindingInterface( pencbi, + &pncbi ); + hTreeItem = hTreeItemRoot; + + while( (hr == S_OK) && hTreeItem ) { + + // + // Add lower component of every interface to the tree. + // + + pncbi->GetLowerComponent( &pnccBound ); + + hTreeItem = AddToTree( hwndTree, + hTreeItem, + pnccBound ); + + ReleaseRef( pnccBound ); + ReleaseRef( pncbi ); + + hr = HrGetNextBindingInterface( pencbi, + &pncbi ); + } + + // + // If hr is S_OK then, the loop terminated due to error in adding + // the binding path to the tree and pncbi has a reference to an + // interface. + // + + if ( hr == S_OK ) { + + ReleaseRef( pncbi ); + } + + ReleaseRef( pencbi ); + } + else { + ErrMsg( hr, + L"Couldn't get the binding interface enumerator." + L"The binding interfaces will not be shown." ); + } + + return; +} + +// +// Function: HandleBindingPathOperation +// +// Purpose: +// +// Arguments: +// hwndOwner [in] Owner window. +// ulSelection [in] Option selected. +// hItem [in] Item selected. +// lParam [in] lParam of the item. +// +// Returns: None. +// +// Notes: +// + +VOID HandleBindingPathOperation (HWND hwndOwner, + ULONG ulSelection, + HTREEITEM hItem, + LPARAM lParam) +{ + switch( ulSelection ) { + + case IDI_ENABLE: + case IDI_DISABLE: + + // + // Enable/disable binding path. + // + + EnableBindingPath( hwndOwner, + hItem, + (LPWSTR)lParam, + ulSelection == IDI_ENABLE ); + } + + return; +} + +// +// Function: EnableBindingPath +// +// Purpose: Enable/disable binding path. +// +// Arguments: +// hwndOwner [in] Owner window. +// hItem [in] Item handle of the binding path. +// lpszPathToken [in] Path token of the binding path. +// fEnable [in] if TRUE, enable, otherwise disable. +// +// Returns: None. +// +// Notes: +// + +VOID +EnableBindingPath ( + HWND hwndOwner, + HTREEITEM hItem, + _In_ LPWSTR lpszPathToken, + BOOL fEnable) +{ + INetCfg *pnc; + INetCfgBindingPath *pncbp; + LPWSTR lpszInfId; + LPWSTR lpszApp; + HRESULT hr; + + // + // Get PnpID of the owner component. + // + + lpszInfId = GetComponentId( hwndOwner, + hItem ); + + if ( lpszInfId ) { + + hr = HrGetINetCfg( TRUE, + APP_NAME, + &pnc, + &lpszApp ); + + if ( hr == S_OK ) { + + // + // Find the binding path reference. + // + + pncbp = FindBindingPath( pnc, + lpszInfId, + lpszPathToken ); + + if ( pncbp ) { + + // + // Enable/disable. + // + + hr = pncbp->Enable( fEnable ); + + if ( hr == S_OK ) { + hr = pnc->Apply(); + + if ( hr == S_OK ) { + + // + // Refreshe the state of the item representing the + // binding path. + // + + RefreshItemState( hwndOwner, + hItem, + fEnable ); + } + else { + ErrMsg( hr, + L"Failed to apply changes to the binding path." ); + } + } + else { + if ( fEnable ) { + ErrMsg( hr, + L"Failed to enable the binding path." ); + } + else { + ErrMsg( hr, + L"Failed to disable the binding path." ); + } + } + + ReleaseRef( pncbp ); + } + + HrReleaseINetCfg( pnc, + TRUE ); + } + else { + if ( (hr == NETCFG_E_NO_WRITE_LOCK) && lpszApp ) { + ErrMsg( hr, + L"%s currently holds the lock, try later.", + lpszApp ); + + CoTaskMemFree( lpszApp ); + } + else { + ErrMsg( hr, + L"Couldn't get the notify object interface." ); + } + } + } + else { + ErrMsg( HRESULT_FROM_WIN32(GetLastError()), + L"Couldn't determine the owner of the binding path." ); + } + + return; +} + +// +// Function: GetComponentId +// +// Purpose: Find the PnpID of a network component. +// +// Arguments: +// hwndTree [in] Tree handle. +// hItem [in] Item handle of the binding path. +// +// Returns: PnpID of the network component. +// +// Notes: +// + +LPWSTR GetComponentId (HWND hwndTree, + HTREEITEM hItem) +{ + LPWSTR lpszInfId; + HTREEITEM hTreeItemParent; + TVITEMW tvItem; + + lpszInfId = NULL; + + // + // Get the item handle of the owner component. + // + + hTreeItemParent = TreeView_GetParent( hwndTree, + hItem ); + if ( hTreeItemParent ) { + + // + // Get lParam of the owner component. lParam is the PnpID. + // + + ZeroMemory( &tvItem, + sizeof(TVITEMW) ); + + tvItem.hItem = hTreeItemParent; + tvItem.mask = TVIF_PARAM; + + if ( TreeView_GetItem(hwndTree, + &tvItem) ) { + + lpszInfId = (LPWSTR)tvItem.lParam; + } + } + + return lpszInfId; +} + +// +// Function: WriteBindings +// +// Purpose: Find the binding path with a give path token. +// +// Arguments: +// pnc [in] INetCfg reference. +// lpszInfId [in] PnpID of the network component. +// lpszPathTokenSelected [in] Path token of the binding path to search. +// +// Returns: Reference to the binding path on success, otherwise NULL. +// +// Notes: +// + +INetCfgBindingPath * +FindBindingPath ( + INetCfg *pnc, + _In_ LPWSTR lpszInfId, + _In_ LPWSTR lpszPathTokenSelected) +{ + INetCfgComponent *pncc = NULL; + IEnumNetCfgBindingPath *pencbp = NULL; + INetCfgBindingPath *pncbp = NULL; + LPWSTR lpszPathToken; + HRESULT hr; + BOOL fFound; + + + fFound = FALSE; + + // + // Get the component reference. + // + + hr = pnc->FindComponent( lpszInfId, + &pncc ); + + if ( hr == S_OK ) { + + hr = HrGetBindingPathEnum( pncc, + EBP_BELOW, + &pencbp ); + if ( hr == S_OK ) { + + hr = HrGetFirstBindingPath( pencbp, + &pncbp ); + + // Enumerate each binding path and find the one + // whose path token matches the specified one. + // + + while ( !fFound && (hr == S_OK) ) { + + hr = pncbp->GetPathToken( &lpszPathToken ); + + if ( hr == S_OK ) { + fFound = !wcscmp( lpszPathToken, + lpszPathTokenSelected ); + + CoTaskMemFree( lpszPathToken ); + } + + if ( !fFound ) { + ReleaseRef( pncbp ); + + hr = HrGetNextBindingPath( pencbp, + &pncbp ); + } + } + + ReleaseRef( pencbp ); + } + else { + ErrMsg( hr, + L"Couldn't get the binding path enumerator interface." ); + } + } + else { + ErrMsg( hr, + L"Couldn't get an interface pointer to %s.", + lpszInfId ); + } + + return (fFound) ? pncbp : NULL; +} |
