337 lines
7.9 KiB
C++
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;
|
|
}
|