mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
419 lines
11 KiB
419 lines
11 KiB
//-----------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|
|
|