440 lines
11 KiB
C++
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;
|
|
}
|
|
|