windows-nt/Source/XPSP1/NT/net/config/netcfg/atmcfg/arpsobj.cpp
2020-09-26 16:20:57 +08:00

440 lines
11 KiB
C++

//-----------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: A R P S O B J . C P P
//
// Contents: CArpsCfg interface method function implementation
//
// Notes:
//
// Author: tongl 12 Mar 1997
//
//-----------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "arpsobj.h"
#include "arpsdlg.h"
#include "atmutil.h"
#include "atmcommon.h"
#include "ncstl.h"
#include "netconp.h"
#include "ncpnp.h"
static const WCHAR c_szAtmarps[] = L"Atmarps";
CArpsCfg::CArpsCfg()
{
m_pnccArps = NULL;
m_fSaveRegistry = FALSE;
m_fReconfig = FALSE;
m_fSecondMemoryModified = FALSE;
m_fRemoving = FALSE;
m_pSecondMemoryAdapterInfo = NULL;
m_strGuidConn = c_szEmpty;
m_pUnkContext = NULL;
m_arps = NULL;
}
CArpsCfg::~CArpsCfg()
{
ReleaseObj(m_pnccArps);
FreeCollectionAndItem(m_listAdapters);
// Just a safty check to make sure the context is released.
AssertSz((m_pUnkContext == NULL), "Why is context not released ? Not a bug in ARPS config.");
if (m_pUnkContext)
ReleaseObj(m_pUnkContext) ;
delete m_arps;
}
// INetCfgComponentControl
STDMETHODIMP CArpsCfg::Initialize (INetCfgComponent* pnccItem,
INetCfg* pNetCfg, BOOL fInstalling )
{
Validate_INetCfgNotify_Initialize(pnccItem, pNetCfg, fInstalling);
HRESULT hr = S_OK;
// Save in the data members the pointer to the
// INetCfgComponent
AssertSz(!m_pnccArps, "CArpsCfg::m_pnccArps not initialized!");
m_pnccArps = pnccItem;
AssertSz(m_pnccArps, "Component pointer is NULL!");
AddRefObj(m_pnccArps);
// Initialize in memory state
if (!fInstalling)
{
hr = HrLoadSettings();
}
Validate_INetCfgNotify_Initialize_Return(hr);
TraceError("CArpsCfg::Initialize", hr);
return hr;
}
STDMETHODIMP CArpsCfg::Validate ( )
{
return S_OK;
}
STDMETHODIMP CArpsCfg::CancelChanges ()
{
return S_OK;
}
STDMETHODIMP CArpsCfg::ApplyRegistryChanges ()
{
HRESULT hr = S_OK;
if (m_fSaveRegistry && !m_fRemoving)
{
hr = HrSaveSettings();
if (SUCCEEDED(hr) && m_fReconfig)
{
HRESULT hrReconfig;
// send reconfig notification if parameter has changed
for (ARPS_ADAPTER_LIST::iterator iterAdapter = m_listAdapters.begin();
iterAdapter != m_listAdapters.end();
iterAdapter ++)
{
if ((*iterAdapter)->m_fDeleted)
continue;
if ( ((*iterAdapter)->m_dwSapSelector !=
(*iterAdapter)->m_dwOldSapSelector) ||
!fIsSameVstr((*iterAdapter)->m_vstrRegisteredAtmAddrs,
(*iterAdapter)->m_vstrOldRegisteredAtmAddrs) ||
!fIsSameVstr((*iterAdapter)->m_vstrMulticastIpAddrs,
(*iterAdapter)->m_vstrOldMulticastIpAddrs))
{
hrReconfig = HrSendNdisPnpReconfig(NDIS, c_szAtmarps,
(*iterAdapter)->m_strBindName.c_str(),
NULL, 0);
if (FAILED(hrReconfig))
{
TraceTag(ttidAtmArps,"Notifying Atm ARP server of parameter change returns failure, prompt for reboot ...");
hr = NETCFG_S_REBOOT;
}
}
}
}
}
else
{
hr = S_FALSE;
}
Validate_INetCfgNotify_Apply_Return(hr);
TraceError("CArpsCfg::ApplyRegistryChanges", (S_FALSE == hr)? S_OK : hr);
return hr;
}
// INetCfgComponentSetup
STDMETHODIMP CArpsCfg::Install (DWORD dwSetupFlags)
{
m_fSaveRegistry = TRUE;
m_fRemoving = FALSE;
return S_OK;
}
STDMETHODIMP CArpsCfg::Upgrade( DWORD dwSetupFlags,
DWORD dwUpgradeFomBuildNo )
{
return S_FALSE;
}
STDMETHODIMP CArpsCfg::ReadAnswerFile(PCWSTR pszAnswerFile,
PCWSTR pszAnswerSection)
{
return S_OK;
}
STDMETHODIMP CArpsCfg::Removing ()
{
m_fRemoving = TRUE;
return S_OK;
}
// INetCfgBindNotify
STDMETHODIMP CArpsCfg::QueryBindingPath (DWORD dwChangeFlag,
INetCfgBindingPath* pncbpItem )
{
// OK to bind request
return S_OK;
}
STDMETHODIMP CArpsCfg::NotifyBindingPath (DWORD dwChangeFlag,
INetCfgBindingPath* pncbp )
{
Assert(!(dwChangeFlag & NCN_ADD && dwChangeFlag & NCN_REMOVE));
Assert(!(dwChangeFlag & NCN_ENABLE && dwChangeFlag & NCN_DISABLE));
// If we are told to add a card, we must be told at the same time whether the
// binding is enabled or disabled
Assert(FImplies((dwChangeFlag & NCN_ADD),
((dwChangeFlag & NCN_ENABLE)||(dwChangeFlag & NCN_DISABLE))));
// We handle NCN_ADD and NCN_REMOVE only:
// NCN_ADD: if item not on list, add a new item
//
// NCN_REMOVE: if item already on list, remove the item
// We do this in NotifyBindingPath because we only want to do this
// once for each binding change between arps and the card.
// If NotifyBindingInterface was used, we will get notified multiple
// times if the interface is on multiple paths.
HRESULT hr = S_OK;
Validate_INetCfgBindNotify_NotifyBindingPath(dwChangeFlag, pncbp);
INetCfgComponent * pnccLastComponent;
hr = HrGetLastComponentAndInterface(pncbp, &pnccLastComponent, NULL);
if (SUCCEEDED(hr))
{
GUID guidNetClass;
hr = pnccLastComponent->GetClassGuid (&guidNetClass);
AssertSz(IsEqualGUID(guidNetClass, GUID_DEVCLASS_NET), "Why the last component on the path is not an adapter?");
if (IsEqualGUID(guidNetClass, GUID_DEVCLASS_NET))
{
// If we are adding/removing cards, set m_fSaveRegistry
// so we apply the changes to registry
if ((dwChangeFlag & NCN_ADD) || (dwChangeFlag & NCN_REMOVE))
m_fSaveRegistry = TRUE;
if (dwChangeFlag & NCN_ADD)
{
hr = HrAddAdapter(pnccLastComponent);
}
if(dwChangeFlag & NCN_ENABLE)
{
hr = HrBindAdapter(pnccLastComponent);
}
if(dwChangeFlag & NCN_DISABLE)
{
hr = HrUnBindAdapter(pnccLastComponent);
}
if (dwChangeFlag & NCN_REMOVE)
{
hr = HrRemoveAdapter(pnccLastComponent);
}
}
ReleaseObj (pnccLastComponent);
}
Validate_INetCfgBindNotify_NotifyBindingPath_Return(hr);
TraceError("CArpsCfg::NotifyBindingPath", hr);
return hr;
}
// INetCfgProperties
STDMETHODIMP CArpsCfg::QueryPropertyUi(IUnknown* pUnk)
{
HRESULT hr = S_FALSE;
if (pUnk)
{
// Is this a lan connection ?
INetLanConnectionUiInfo * pLanConnUiInfo;
hr = pUnk->QueryInterface( IID_INetLanConnectionUiInfo,
reinterpret_cast<LPVOID *>(&pLanConnUiInfo));
if(FAILED(hr))
{
hr = S_FALSE;
}
}
TraceError("CArpsCfg::SetContext", hr);
return hr;
}
STDMETHODIMP CArpsCfg::SetContext(IUnknown * pUnk)
{
HRESULT hr = S_OK;
// release previous context, if any
if (m_pUnkContext)
ReleaseObj(m_pUnkContext);
m_pUnkContext = NULL;
if (pUnk) // set the new context
{
m_pUnkContext = pUnk;
m_pUnkContext->AddRef();
}
TraceError("CArpsCfg::SetContext", hr);
return hr;
}
STDMETHODIMP CArpsCfg::MergePropPages(
IN OUT DWORD* pdwDefPages,
OUT LPBYTE* pahpspPrivate,
OUT UINT* pcPages,
IN HWND hwndParent,
OUT PCWSTR* pszStartPage)
{
HRESULT hr = S_OK;
// Initialize output parameter
HPROPSHEETPAGE *ahpsp = NULL;
int cPages = 0;
Validate_INetCfgProperties_MergePropPages (
pdwDefPages, pahpspPrivate, pcPages, hwndParent, pszStartPage);
// We don't want any default pages to be shown
*pdwDefPages = 0;
*pcPages = NULL;
*pahpspPrivate = NULL;
// get the connection context in which we are bringing up the UI
hr = HrSetConnectionContext();
if SUCCEEDED(hr)
{
// Initialize the common controls library
INITCOMMONCONTROLSEX icc;
icc.dwSize = sizeof(icc);
icc.dwICC = ICC_INTERNET_CLASSES;
SideAssert(InitCommonControlsEx(&icc));
hr = HrSetupPropSheets(&ahpsp, &cPages);
if (SUCCEEDED(hr))
{
*pahpspPrivate = (LPBYTE)ahpsp;
*pcPages = cPages;
}
else
{
*pcPages = 0;
CoTaskMemFree(ahpsp);
}
}
Validate_INetCfgProperties_MergePropPages_Return(hr);
TraceError("CArpsCfg::MergePropPages", hr);
return hr;
}
STDMETHODIMP CArpsCfg::ValidateProperties(HWND hwndSheet)
{
return S_OK;
}
STDMETHODIMP CArpsCfg::CancelProperties()
{
// Release second memory info
delete m_pSecondMemoryAdapterInfo;
m_pSecondMemoryAdapterInfo = NULL;
return S_OK;
}
STDMETHODIMP CArpsCfg::ApplyProperties()
{
HRESULT hr = S_OK;
if(!m_fSaveRegistry)
m_fSaveRegistry = m_fSecondMemoryModified;
if (!m_fReconfig)
m_fReconfig = m_fSecondMemoryModified;
// Copy info from second memory state to first memory state
if (m_fSecondMemoryModified)
{
hr = HrSaveAdapterInfo();
}
// Release second memory info
delete m_pSecondMemoryAdapterInfo;
m_pSecondMemoryAdapterInfo = NULL;
TraceError("CArpsCfg::ApplyProperties", hr);
return hr;
}
//
// CArpsAdapterInfo
//
CArpsAdapterInfo & CArpsAdapterInfo::operator=(const CArpsAdapterInfo & info)
{
Assert(this != &info);
if (this == &info)
return *this;
m_strBindName = info.m_strBindName;
m_BindingState = info.m_BindingState;
m_dwSapSelector = info.m_dwSapSelector;
m_dwOldSapSelector = info.m_dwOldSapSelector;
CopyColString(&m_vstrRegisteredAtmAddrs, info.m_vstrRegisteredAtmAddrs);
CopyColString(&m_vstrOldRegisteredAtmAddrs, info.m_vstrOldRegisteredAtmAddrs);
CopyColString(&m_vstrMulticastIpAddrs, info.m_vstrMulticastIpAddrs);
CopyColString(&m_vstrOldMulticastIpAddrs, info.m_vstrOldMulticastIpAddrs);
m_fDeleted = info.m_fDeleted;
return *this;
}
HRESULT CArpsAdapterInfo::HrSetDefaults(PCWSTR pszBindName)
{
HRESULT hr = S_OK;
AssertSz(pszBindName, "NULL BindName passed to CArpsAdapterInfo::HrSetDefaults.");
m_strBindName = pszBindName;
m_BindingState = BIND_UNSET;
// SAP selector
m_dwSapSelector = c_dwDefSapSel;
m_dwOldSapSelector = c_dwDefSapSel;
// registered atm address
FreeCollectionAndItem(m_vstrRegisteredAtmAddrs);
m_vstrRegisteredAtmAddrs.push_back(new tstring(c_szDefRegAddrs));
CopyColString(&m_vstrOldRegisteredAtmAddrs, m_vstrRegisteredAtmAddrs);
// multicast ip address
FreeCollectionAndItem(m_vstrMulticastIpAddrs);
m_vstrMulticastIpAddrs.push_back(new tstring(c_szDefMCAddr1));
m_vstrMulticastIpAddrs.push_back(new tstring(c_szDefMCAddr2));
CopyColString(&m_vstrOldMulticastIpAddrs, m_vstrMulticastIpAddrs);
m_fDeleted = FALSE;
return hr;
}