//----------------------------------------------------------------------- // // 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(&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; }