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

420 lines
11 KiB
C++

//-----------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: A U N I O B J . C P P
//
// Contents: CAtmUniCfg interface method function implementation
//
// Notes:
//
// Author: tongl 21 Mar 1997
//
//-----------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "arpsobj.h"
#include "auniobj.h"
#include "atmutil.h"
#include "ncstl.h"
#include "aunidlg.h"
#include "netconp.h"
#include "ncpnp.h"
static const WCHAR c_szAtmuni[] = L"Atmuni";
extern const WCHAR c_szInfId_MS_RawWan[];
/////////////////////////////////////////////////////////////////////////////
//
CAtmUniCfg::CAtmUniCfg()
: m_pnc(NULL),
m_pnccUni(NULL),
m_pnccRwan(NULL),
m_fSaveRegistry(FALSE),
m_fUIParamChanged(FALSE),
m_fSecondMemoryModified(FALSE),
m_fPVCInfoLoaded(FALSE),
m_strGuidConn(c_szEmpty),
m_pUnkContext(NULL),
m_pSecondMemoryAdapterInfo(NULL),
m_uniPage(NULL)
{
}
CAtmUniCfg::~CAtmUniCfg()
{
ReleaseObj(m_pnc);
ReleaseObj(m_pnccUni);
ReleaseObj(m_pnccRwan);
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 ATM UNI config.");
if (m_pUnkContext)
ReleaseObj(m_pUnkContext) ;
delete m_uniPage;
}
// INetCfgComponentControl
STDMETHODIMP CAtmUniCfg::Initialize (INetCfgComponent* pncc,
INetCfg* pNetCfg,
BOOL fInstalling )
{
HRESULT hr = S_OK;
Validate_INetCfgNotify_Initialize(pncc, pNetCfg, fInstalling);
AssertSz(pNetCfg, "NetCfg pointer is NULL!");
m_pnc = pNetCfg;
AddRefObj(m_pnc);
AssertSz(pncc, "Component pointer is NULL!");
m_pnccUni = pncc;
AddRefObj(m_pnccUni);
// Get a copy of the ATMRwan and store in our object
hr = m_pnc->FindComponent(c_szInfId_MS_RawWan, &m_pnccRwan);
if (S_FALSE == hr) // RWan not found
{
if (!fInstalling) // Trace the error, RWan should be installed
{
TraceError("CAtmUniCfg::Initialize - ATMRwan has not been installed yet", hr);
}
else // We are ok since ATMUNI will install ATMRwan
{
hr = S_OK;
}
}
// Construct the in memory structure (m_listAdapters) by
// iterating through the binding path
if (!fInstalling)
{
hr = HrLoadSettings();
}
Validate_INetCfgNotify_Initialize_Return(hr);
TraceError("CAtmUniCfg::Initialize", hr);
return hr;
}
STDMETHODIMP CAtmUniCfg::Validate ()
{
return S_OK;
}
STDMETHODIMP CAtmUniCfg::CancelChanges ()
{
return S_OK;
}
STDMETHODIMP CAtmUniCfg::ApplyRegistryChanges ()
{
HRESULT hr = S_OK;
if (m_fSaveRegistry)
{
hr = HrSaveSettings();
if (SUCCEEDED(hr) && m_fUIParamChanged)
{
// send reconfig notification if parameter has changed
for (UNI_ADAPTER_LIST::iterator iterAdapter = m_listAdapters.begin();
iterAdapter != m_listAdapters.end();
iterAdapter ++)
{
if ((*iterAdapter)->m_fDeleted)
continue;
if (FIsSubstr(m_strGuidConn.c_str(), (*iterAdapter)->m_strBindName.c_str()))
{
HRESULT hrReconfig;
hrReconfig = HrSendNdisPnpReconfig(NDIS, c_szAtmuni,
(*iterAdapter)->m_strBindName.c_str(),
NULL, 0);
if (FAILED(hrReconfig))
{
TraceTag(ttidAtmUni,"Notifying Atm UNI Call manager of parameter change returns failure, prompt for reboot ...");
hr = NETCFG_S_REBOOT;
}
break;
}
}
}
}
else
{
// no change
hr = S_FALSE;
}
Validate_INetCfgNotify_Apply_Return(hr);
TraceError("CAtmUniCfg::ApplyRegistryChanges", (S_FALSE == hr)? S_OK : hr);
return hr;
}
// INetCfgComponentSetup
STDMETHODIMP CAtmUniCfg::Install (DWORD dwSetupFlags)
{
m_fSaveRegistry = TRUE;
// Just in case it was installed already, we need to release
// m_pnccRwan before we overwrite it.
//
ReleaseObj (m_pnccRwan);
// Install the ATM Rawwan protocol on behalf of ATMUNI
HRESULT hr = HrInstallComponentOboComponent( m_pnc, NULL,
GUID_DEVCLASS_NETTRANS,
c_szInfId_MS_RawWan,
m_pnccUni,
&m_pnccRwan);
TraceError("CAtmUniCfg::Install", hr);
return hr;
}
STDMETHODIMP CAtmUniCfg::Upgrade(DWORD dwSetupFlags,
DWORD dwUpgradeFomBuildNo )
{
return S_FALSE;
}
STDMETHODIMP CAtmUniCfg::ReadAnswerFile(PCWSTR pszAnswerFile,
PCWSTR pszAnswerSection)
{
return S_OK;
}
STDMETHODIMP CAtmUniCfg::Removing ()
{
// Remove ATMRwan protocol
HRESULT hr = HrRemoveComponentOboComponent(m_pnc,
GUID_DEVCLASS_NETTRANS,
c_szInfId_MS_RawWan,
m_pnccUni);
TraceError("CAtmUniCfg::Removing", hr);
return hr;
}
// INetCfgBindNotify
STDMETHODIMP CAtmUniCfg::QueryBindingPath (DWORD dwChangeFlag,
INetCfgBindingPath* pncbpItem )
{
return S_OK;
}
STDMETHODIMP CAtmUniCfg::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 (for Beta1):
// NCN_ADD: if item not on list, add a new item
// NCN_REMOVE: if item already on list, remove the item
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?");
// Is this a net card ?
if (SUCCEEDED(hr) && 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)
{
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("CAtmUniCfg::NotifyBindingPath", hr);
return hr;
}
// INetCfgProperties
STDMETHODIMP CAtmUniCfg::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("CAtmUniCfg::SetContext", hr);
return hr;
}
STDMETHODIMP CAtmUniCfg::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 CAtmUniCfg::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("CAtmUniCfg::MergePropPages", hr);
return hr;
}
STDMETHODIMP CAtmUniCfg::ValidateProperties (HWND hwndSheet)
{
// all error checking are done in the UI
return S_OK;
}
STDMETHODIMP CAtmUniCfg::CancelProperties ()
{
// Release second memory info
delete m_pSecondMemoryAdapterInfo;
m_pSecondMemoryAdapterInfo = NULL;
return S_OK;
}
STDMETHODIMP CAtmUniCfg::ApplyProperties ()
{
HRESULT hr = S_OK;
if(!m_fSaveRegistry)
m_fSaveRegistry = m_fSecondMemoryModified;
if(!m_fUIParamChanged)
m_fUIParamChanged = m_fSecondMemoryModified;
// Copy info from second memory state to first memory state
if (m_fSecondMemoryModified)
{
hr = HrSaveAdapterPVCInfo();
}
// Release second memory info
delete m_pSecondMemoryAdapterInfo;
m_pSecondMemoryAdapterInfo = NULL;
Validate_INetCfgProperties_ApplyProperties_Return(hr);
TraceError("CAtmUniCfg::ApplyProperties", hr);
return hr;
}