windows-nt/Source/XPSP1/NT/net/rras/ras/ui/rasdlg/uiinfo.cpp
2020-09-26 16:20:57 +08:00

337 lines
7.9 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: U I I N F O . C P P
//
// Contents: Implements a call-back COM object used to raise properties
// on INetCfg components. This object implements the
// INetRasConnectionIpUiInfo interface.
//
// Notes:
//
// Author: shaunco 1 Jan 1998
//
//----------------------------------------------------------------------------
#include "rasdlgp.h"
#include "netconp.h"
#include "uiinfo.h"
class CRasConnectionUiIpInfo :
public INetRasConnectionIpUiInfo
{
private:
ULONG m_cRef;
PEINFO* m_pInfo;
friend
void
RevokePeinfoFromUiInfoCallbackObject (
IUnknown* punk);
public:
CRasConnectionUiIpInfo (PEINFO* pInfo);
// IUnknown
//
STDMETHOD (QueryInterface) (REFIID riid, void** ppv);
STDMETHOD_(ULONG, AddRef) (void);
STDMETHOD_(ULONG, Release) (void);
// INetRasConnectionIpUiInfo
//
STDMETHOD (GetUiInfo) (RASCON_IPUI* pIpui);
};
// Constructor. Set our reference count to 1 and initialize our members.
//
CRasConnectionUiIpInfo::CRasConnectionUiIpInfo (
PEINFO* pInfo)
{
m_cRef = 1;
m_pInfo = pInfo;
}
// IUnknown
//
STDMETHODIMP
CRasConnectionUiIpInfo::QueryInterface (
REFIID riid,
void** ppv)
{
static const IID IID_INetRasConnectionIpUiInfo =
{0xFAEDCF58,0x31FE,0x11D1,{0xAA,0xD2,0x00,0x80,0x5F,0xC1,0x27,0x0E}};
if (!ppv)
{
return E_POINTER;
}
if ((IID_IUnknown == riid) ||
(IID_INetRasConnectionIpUiInfo == riid))
{
*ppv = static_cast<void*>(static_cast<IUnknown*>(this));
AddRef ();
return S_OK;
}
*ppv = NULL;
return E_NOINTERFACE;
}
// Standard AddRef and Release implementations.
//
STDMETHODIMP_(ULONG)
CRasConnectionUiIpInfo::AddRef (void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG)
CRasConnectionUiIpInfo::Release (void)
{
ULONG cRef = --m_cRef;
if (0 == cRef)
{
delete this;
}
return cRef;
}
// INetRasConnectionIpUiInfo
//
STDMETHODIMP
CRasConnectionUiIpInfo::GetUiInfo (
RASCON_IPUI* pIpui)
{
// Validate parameters.
//
if (!pIpui)
{
return E_POINTER;
}
ZeroMemory (pIpui, sizeof(*pIpui));
// We need to have a PEINFO with which to answer the call.
// If it was revoked, it means we're being called after everything
// has gone away. (The caller probably has not released us when he
// he should have.)
//
if (!m_pInfo)
{
return E_UNEXPECTED;
}
PBENTRY* pEntry = m_pInfo->pArgs->pEntry;
// Phonebook upgrade code needs to assure that pGuid is always present.
//
pIpui->guidConnection = *pEntry->pGuid;
// Set whether its SLIP or PPP.
//
if (BP_Slip == pEntry->dwBaseProtocol)
{
pIpui->dwFlags = RCUIF_SLIP;
}
else
{
pIpui->dwFlags = RCUIF_PPP;
}
// Set whether this is demand dial or not
//
if (m_pInfo->pArgs->fRouter)
{
pIpui->dwFlags |= RCUIF_DEMAND_DIAL;
}
// Set whether we're in non-admin mode (406630)
//
if (m_pInfo->fNonAdmin)
{
pIpui->dwFlags |= RCUIF_NOT_ADMIN;
}
// !!! This is temporary and can be removed when this flag has been added to
// the checked in necomp IDL file.
//
#ifndef RCUIF_VPN
#define RCUIF_VPN 0x40
#endif
// Note if it's a VPN connection.
//
if (pEntry->dwType == RASET_Vpn)
{
pIpui->dwFlags |= RCUIF_VPN;
}
// Set whether to use a specific IP address.
//
// Whistler bug 304064 NT4SLIP connection gets wrong IP settings on upgrade
//
if (pEntry->pszIpAddress &&
((BP_Slip == pEntry->dwBaseProtocol) ||
(ASRC_RequireSpecific == pEntry->dwIpAddressSource)))
{
pIpui->dwFlags |= RCUIF_USE_IP_ADDR;
if (pEntry->pszIpAddress &&
lstrcmp(pEntry->pszIpAddress, TEXT("0.0.0.0")))
{
lstrcpynW (
pIpui->pszwIpAddr,
pEntry->pszIpAddress,
sizeof(pIpui->pszwIpAddr) / sizeof(WCHAR));
}
}
// Set whether to use specific name server addresses.
//
// Whistler bug 304064 NT4SLIP connection gets wrong IP settings on upgrade
//
if (((BP_Slip == pEntry->dwBaseProtocol) ||
(ASRC_RequireSpecific == pEntry->dwIpNameSource)) &&
(pEntry->pszIpDnsAddress || pEntry->pszIpDns2Address ||
pEntry->pszIpWinsAddress || pEntry->pszIpWins2Address))
{
pIpui->dwFlags |= RCUIF_USE_NAME_SERVERS;
// Since the phonebook stores zeros even for unused IP address
// strings, we need to ignore them explicitly.
//
if (pEntry->pszIpDnsAddress &&
lstrcmp(pEntry->pszIpDnsAddress, TEXT("0.0.0.0")))
{
lstrcpynW (
pIpui->pszwDnsAddr,
pEntry->pszIpDnsAddress,
sizeof(pIpui->pszwDnsAddr) / sizeof(WCHAR));
}
if (pEntry->pszIpDns2Address &&
lstrcmp(pEntry->pszIpDns2Address, TEXT("0.0.0.0")))
{
lstrcpynW (
pIpui->pszwDns2Addr,
pEntry->pszIpDns2Address,
sizeof(pIpui->pszwDns2Addr) / sizeof(WCHAR));
}
if (pEntry->pszIpWinsAddress &&
lstrcmp(pEntry->pszIpWinsAddress, TEXT("0.0.0.0")))
{
lstrcpynW (
pIpui->pszwWinsAddr,
pEntry->pszIpWinsAddress,
sizeof(pIpui->pszwWinsAddr) / sizeof(WCHAR));
}
if (pEntry->pszIpWins2Address &&
lstrcmp(pEntry->pszIpWins2Address, TEXT("0.0.0.0")))
{
lstrcpynW (
pIpui->pszwWins2Addr,
pEntry->pszIpWins2Address,
sizeof(pIpui->pszwWins2Addr) / sizeof(WCHAR));
}
}
if (!m_pInfo->pArgs->fRouter && pEntry->fIpPrioritizeRemote)
{
pIpui->dwFlags |= RCUIF_USE_REMOTE_GATEWAY;
}
if (pEntry->fIpHeaderCompression)
{
pIpui->dwFlags |= RCUIF_USE_HEADER_COMPRESSION;
}
if (BP_Slip == pEntry->dwBaseProtocol)
{
pIpui->dwFrameSize = pEntry->dwFrameSize;
}
// pmay: 389632
//
// Initialize the dns controls
//
if (pEntry->dwIpDnsFlags & DNS_RegPrimary)
{
if ((pEntry->dwIpDnsFlags & DNS_RegPerConnection) ||
(pEntry->dwIpDnsFlags & DNS_RegDhcpInform))
{
pIpui->dwFlags |= RCUIF_USE_PRIVATE_DNS_SUFFIX;
}
}
else
{
pIpui->dwFlags |= RCUIF_USE_DISABLE_REGISTER_DNS;
}
if (pEntry->pszIpDnsSuffix)
{
lstrcpyn(
pIpui->pszwDnsSuffix,
pEntry->pszIpDnsSuffix,
255);
}
if (pEntry->dwIpNbtFlags & PBK_ENTRY_IP_NBT_Enable)
{
pIpui->dwFlags |= RCUIF_ENABLE_NBT;
}
return S_OK;
}
EXTERN_C
HRESULT
HrCreateUiInfoCallbackObject (
PEINFO* pInfo,
IUnknown** ppunk)
{
// Validate parameters.
//
if (!pInfo || !ppunk)
{
return E_POINTER;
}
// Create the object and return its IUnknown interface.
// This assumes the object is created with a ref-count of 1.
// (Check the constructor above to make sure.)
//
HRESULT hr = S_OK;
CRasConnectionUiIpInfo* pObj = new CRasConnectionUiIpInfo (pInfo);
if (pObj)
{
*ppunk = static_cast<IUnknown*>(pObj);
}
else
{
*ppunk = NULL;
hr = E_OUTOFMEMORY;
}
return hr;
}
// Set the m_pInfo member to NULL. Since we don't have direct control over
// the lifetime of this object (clients can hold references as long as they
// want) revoking m_pInfo is a saftey net to keep us from trying to access
// memory that may have gone away.
//
EXTERN_C
void
RevokePeinfoFromUiInfoCallbackObject (
IUnknown* punk)
{
CRasConnectionUiIpInfo* pObj = static_cast<CRasConnectionUiIpInfo*>(punk);
pObj->m_pInfo = NULL;
}