225 lines
10 KiB
C
225 lines
10 KiB
C
|
/***************************************************************************
|
||
|
*
|
||
|
* Copyright (C) 2001-2002 Microsoft Corporation. All Rights Reserved.
|
||
|
*
|
||
|
* File: dpnhupnpdevice.h
|
||
|
*
|
||
|
* Content: Header for device object class.
|
||
|
*
|
||
|
* History:
|
||
|
* Date By Reason
|
||
|
* ======== ======== =========
|
||
|
* 04/16/01 VanceO Split DPNATHLP into DPNHUPNP and DPNHPAST.
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//=============================================================================
|
||
|
// Object flags
|
||
|
//=============================================================================
|
||
|
#ifndef DPNBUILD_NOHNETFWAPI
|
||
|
#define DEVICE_CHECKEDFORHNETFIREWALL 0x0001 // the check for a local HomeNet firewall has been performed for the device at least once
|
||
|
#define DEVICE_HNETFIREWALLED 0x0002 // the device is firewalled, and can be controlled with the HomeNet APIs
|
||
|
#define DEVICE_UPNPDISCOVERYSOCKETMAPPEDONHNETFIREWALL 0x0004 // the UPnP discovery socket for this device was mapped on the firewall
|
||
|
#endif // ! DPNBUILD_NOHNETFWAPI
|
||
|
#define DEVICE_PERFORMINGREMOTEUPNPDISCOVERY 0x0008 // the check for a remote UPnP gateway device is being performed
|
||
|
#define DEVICE_PERFORMINGLOCALUPNPDISCOVERY 0x0010 // the check for a local UPnP gateway device is being performed
|
||
|
#define DEVICE_GOTREMOTEUPNPDISCOVERYCONNRESET 0x0020 // the check for a remote UPnP gateway device generated a WSAECONNRESET error
|
||
|
#define DEVICE_GOTLOCALUPNPDISCOVERYCONNRESET 0x0040 // the check for a local UPnP gateway device generated a WSAECONNRESET error
|
||
|
#ifdef DBG
|
||
|
#ifndef DPNBUILD_NOWINSOCK2
|
||
|
#define DEVICE_PRIMARY 0x0080 // this device appears to be the primary adapter with which its gateway should be reached
|
||
|
#define DEVICE_SECONDARY 0x0100 // this device appears to be a secondary adapter on a shared network
|
||
|
#define DEVICE_NOGATEWAY 0x0200 // this device does not currently have a gateway
|
||
|
#endif // ! DPNBUILD_NOWINSOCK2
|
||
|
#endif // DBG
|
||
|
|
||
|
|
||
|
|
||
|
//=============================================================================
|
||
|
// Macros
|
||
|
//=============================================================================
|
||
|
#define DEVICE_FROM_BILINK(b) (CONTAINING_OBJECT(b, CDevice, m_blList))
|
||
|
#define DEVICE_FROM_TEMP_BILINK(b) (CONTAINING_OBJECT(b, CDevice, m_blTempList))
|
||
|
|
||
|
|
||
|
|
||
|
//=============================================================================
|
||
|
// Typedefs
|
||
|
//=============================================================================
|
||
|
class CDevice;
|
||
|
class CUPnPDevice;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//=============================================================================
|
||
|
// Device object class
|
||
|
//=============================================================================
|
||
|
class CDevice
|
||
|
{
|
||
|
public:
|
||
|
#undef DPF_MODNAME
|
||
|
#define DPF_MODNAME "CDevice::CDevice"
|
||
|
CDevice(const DWORD dwLocalAddressV4)
|
||
|
{
|
||
|
this->m_blList.Initialize();
|
||
|
this->m_blTempList.Initialize();
|
||
|
this->m_blOwnedRegPorts.Initialize();
|
||
|
|
||
|
this->m_Sig[0] = 'D';
|
||
|
this->m_Sig[1] = 'E';
|
||
|
this->m_Sig[2] = 'V';
|
||
|
this->m_Sig[3] = 'I';
|
||
|
|
||
|
this->m_dwFlags = 0;
|
||
|
this->m_dwLocalAddressV4 = dwLocalAddressV4;
|
||
|
this->m_wUPnPDiscoverySocketPort = 0;
|
||
|
this->m_sUPnPDiscoverySocket = INVALID_SOCKET;
|
||
|
this->m_pUPnPDevice = NULL;
|
||
|
this->m_dwFirstUPnPDiscoveryTime = 0;
|
||
|
|
||
|
#ifdef DBG
|
||
|
this->m_dwNumUPnPDeviceFailures = 0;
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
#undef DPF_MODNAME
|
||
|
#define DPF_MODNAME "CDevice::~CDevice"
|
||
|
~CDevice(void)
|
||
|
{
|
||
|
#ifdef DBG
|
||
|
DPFX(DPFPREP, 8, "(0x%p) NumUPnPDeviceFailures = %u",
|
||
|
this, this->m_dwNumUPnPDeviceFailures);
|
||
|
|
||
|
|
||
|
DNASSERT(this->m_blList.IsEmpty());
|
||
|
DNASSERT(this->m_blTempList.IsEmpty());
|
||
|
DNASSERT(this->m_blOwnedRegPorts.IsEmpty());
|
||
|
|
||
|
#ifndef DPNBUILD_NOHNETFWAPI
|
||
|
DNASSERT(! (this->m_dwFlags & DEVICE_UPNPDISCOVERYSOCKETMAPPEDONHNETFIREWALL));
|
||
|
#endif // ! DPNBUILD_NOHNETFWAPI
|
||
|
DNASSERT(this->m_sUPnPDiscoverySocket == INVALID_SOCKET);
|
||
|
DNASSERT(this->m_pUPnPDevice == NULL);
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|
||
|
|
||
|
#ifndef DPNBUILD_NOHNETFWAPI
|
||
|
inline BOOL HasCheckedForFirewallAvailability(void) const { return ((this->m_dwFlags & DEVICE_CHECKEDFORHNETFIREWALL) ? TRUE : FALSE); };
|
||
|
inline BOOL IsHNetFirewalled(void) const { return ((this->m_dwFlags & DEVICE_HNETFIREWALLED) ? TRUE : FALSE); };
|
||
|
inline BOOL IsUPnPDiscoverySocketMappedOnHNetFirewall(void) const { return ((this->m_dwFlags & DEVICE_UPNPDISCOVERYSOCKETMAPPEDONHNETFIREWALL) ? TRUE : FALSE); };
|
||
|
#endif // ! DPNBUILD_NOHNETFWAPI
|
||
|
inline BOOL IsOKToPerformRemoteUPnPDiscovery(void) const { return (((this->m_dwFlags & DEVICE_PERFORMINGREMOTEUPNPDISCOVERY) && (! (this->m_dwFlags & DEVICE_GOTREMOTEUPNPDISCOVERYCONNRESET)))? TRUE : FALSE); };
|
||
|
inline BOOL IsOKToPerformLocalUPnPDiscovery(void) const { return (((this->m_dwFlags & DEVICE_PERFORMINGLOCALUPNPDISCOVERY) && (! (this->m_dwFlags & DEVICE_GOTLOCALUPNPDISCOVERYCONNRESET)))? TRUE : FALSE); };
|
||
|
|
||
|
inline BOOL GotRemoteUPnPDiscoveryConnReset(void) const { return ((this->m_dwFlags & DEVICE_GOTREMOTEUPNPDISCOVERYCONNRESET) ? TRUE : FALSE); };
|
||
|
inline BOOL GotLocalUPnPDiscoveryConnReset(void) const { return ((this->m_dwFlags & DEVICE_GOTLOCALUPNPDISCOVERYCONNRESET) ? TRUE : FALSE); };
|
||
|
#ifdef DBG
|
||
|
inline BOOL IsPerformingRemoteUPnPDiscovery(void) const { return ((this->m_dwFlags & DEVICE_PERFORMINGREMOTEUPNPDISCOVERY) ? TRUE : FALSE); };
|
||
|
inline BOOL IsPerformingLocalUPnPDiscovery(void) const { return ((this->m_dwFlags & DEVICE_PERFORMINGLOCALUPNPDISCOVERY) ? TRUE : FALSE); };
|
||
|
|
||
|
#ifndef DPNBUILD_NOWINSOCK2
|
||
|
inline BOOL IsPrimaryDevice(void) const { return ((this->m_dwFlags & DEVICE_PRIMARY) ? TRUE : FALSE); };
|
||
|
inline BOOL IsSecondaryDevice(void) const { return ((this->m_dwFlags & DEVICE_SECONDARY) ? TRUE : FALSE); };
|
||
|
inline BOOL HasNoGateway(void) const { return ((this->m_dwFlags & DEVICE_NOGATEWAY) ? TRUE : FALSE); };
|
||
|
#endif // ! DPNBUILD_NOWINSOCK2
|
||
|
#endif // DBG
|
||
|
|
||
|
|
||
|
inline DWORD GetLocalAddressV4(void) const { return this->m_dwLocalAddressV4; };
|
||
|
|
||
|
inline WORD GetUPnPDiscoverySocketPort(void) const { return this->m_wUPnPDiscoverySocketPort; };
|
||
|
|
||
|
inline SOCKET GetUPnPDiscoverySocket(void) const { return this->m_sUPnPDiscoverySocket; };
|
||
|
|
||
|
//
|
||
|
// This does not add a reference (when not NULL)!
|
||
|
//
|
||
|
inline CUPnPDevice * GetUPnPDevice(void) { return this->m_pUPnPDevice; };
|
||
|
|
||
|
inline DWORD GetFirstUPnPDiscoveryTime(void) const { return this->m_dwFirstUPnPDiscoveryTime; };
|
||
|
|
||
|
|
||
|
#ifndef DPNBUILD_NOHNETFWAPI
|
||
|
inline void NoteCheckedForFirewallAvailability(void) { this->m_dwFlags |= DEVICE_CHECKEDFORHNETFIREWALL; };
|
||
|
|
||
|
#undef DPF_MODNAME
|
||
|
#define DPF_MODNAME "CDevice::NoteHNetFirewalled"
|
||
|
inline void NoteHNetFirewalled(void)
|
||
|
{
|
||
|
DNASSERT(! (this->m_dwFlags & DEVICE_HNETFIREWALLED));
|
||
|
this->m_dwFlags |= DEVICE_HNETFIREWALLED;
|
||
|
};
|
||
|
|
||
|
#undef DPF_MODNAME
|
||
|
#define DPF_MODNAME "CDevice::NoteUPnPDiscoverySocketMappedOnHNetFirewall"
|
||
|
inline void NoteUPnPDiscoverySocketMappedOnHNetFirewall(void)
|
||
|
{
|
||
|
DNASSERT(! (this->m_dwFlags & DEVICE_UPNPDISCOVERYSOCKETMAPPEDONHNETFIREWALL));
|
||
|
this->m_dwFlags |= DEVICE_UPNPDISCOVERYSOCKETMAPPEDONHNETFIREWALL;
|
||
|
};
|
||
|
#endif // ! DPNBUILD_NOHNETFWAPI
|
||
|
|
||
|
inline void NotePerformingRemoteUPnPDiscovery(void) { this->m_dwFlags |= DEVICE_PERFORMINGREMOTEUPNPDISCOVERY; };
|
||
|
inline void NotePerformingLocalUPnPDiscovery(void) { this->m_dwFlags |= DEVICE_PERFORMINGLOCALUPNPDISCOVERY; };
|
||
|
inline void NoteGotRemoteUPnPDiscoveryConnReset(void) { this->m_dwFlags |= DEVICE_GOTREMOTEUPNPDISCOVERYCONNRESET; };
|
||
|
inline void NoteGotLocalUPnPDiscoveryConnReset(void) { this->m_dwFlags |= DEVICE_GOTLOCALUPNPDISCOVERYCONNRESET; };
|
||
|
|
||
|
#ifndef DPNBUILD_NOHNETFWAPI
|
||
|
inline void NoteNotHNetFirewalled(void) { this->m_dwFlags &= ~DEVICE_HNETFIREWALLED; };
|
||
|
inline void NoteNotUPnPDiscoverySocketMappedOnHNetFirewall(void) { this->m_dwFlags &= ~DEVICE_UPNPDISCOVERYSOCKETMAPPEDONHNETFIREWALL; };
|
||
|
#endif // ! DPNBUILD_NOHNETFWAPI
|
||
|
inline void NoteNotPerformingRemoteUPnPDiscovery(void) { this->m_dwFlags &= ~DEVICE_PERFORMINGREMOTEUPNPDISCOVERY; };
|
||
|
inline void NoteNotPerformingLocalUPnPDiscovery(void) { this->m_dwFlags &= ~DEVICE_PERFORMINGLOCALUPNPDISCOVERY; };
|
||
|
inline void NoteNotGotRemoteUPnPDiscoveryConnReset(void) { this->m_dwFlags &= ~DEVICE_GOTREMOTEUPNPDISCOVERYCONNRESET; };
|
||
|
inline void NoteNotGotLocalUPnPDiscoveryConnReset(void) { this->m_dwFlags &= ~DEVICE_GOTLOCALUPNPDISCOVERYCONNRESET; };
|
||
|
|
||
|
#ifdef DBG
|
||
|
#ifndef DPNBUILD_NOWINSOCK2
|
||
|
inline void NotePrimaryDevice(void) { this->m_dwFlags |= DEVICE_PRIMARY; };
|
||
|
inline void NoteSecondaryDevice(void) { this->m_dwFlags |= DEVICE_SECONDARY; };
|
||
|
inline void NoteNoGateway(void) { this->m_dwFlags |= DEVICE_NOGATEWAY; };
|
||
|
|
||
|
inline void ClearGatewayFlags(void) { this->m_dwFlags &= ~(DEVICE_PRIMARY | DEVICE_SECONDARY | DEVICE_NOGATEWAY); };
|
||
|
#endif // ! DPNBUILD_NOWINSOCK2
|
||
|
#endif // DBG
|
||
|
|
||
|
inline void SetUPnPDiscoverySocketPort(const WORD wPort) { this->m_wUPnPDiscoverySocketPort = wPort; };
|
||
|
inline void SetUPnPDiscoverySocket(const SOCKET sSocket) { this->m_sUPnPDiscoverySocket = sSocket; };
|
||
|
inline void SetUPnPDevice(CUPnPDevice * const pUPnPDevice) { this->m_pUPnPDevice = pUPnPDevice; };
|
||
|
inline void SetFirstUPnPDiscoveryTime(const DWORD dwTime) { this->m_dwFirstUPnPDiscoveryTime = dwTime; };
|
||
|
|
||
|
#ifdef DBG
|
||
|
inline void IncrementUPnPDeviceFailures(void) { this->m_dwNumUPnPDeviceFailures++; };
|
||
|
#endif // DBG
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
CBilink m_blList; // list of all the available devices
|
||
|
CBilink m_blTempList; // temporary list of all the available devices
|
||
|
CBilink m_blOwnedRegPorts; // list of all the ports registered using this device
|
||
|
|
||
|
|
||
|
private:
|
||
|
//
|
||
|
// Note that all values here are protected by the global CNATHelpUPnP lock.
|
||
|
//
|
||
|
BYTE m_Sig[4]; // debugging signature ('DEVI')
|
||
|
DWORD m_dwFlags; // flags describing this object
|
||
|
DWORD m_dwLocalAddressV4; // address this object represents
|
||
|
WORD m_wUPnPDiscoverySocketPort; // port being used by UPnP discovery socket
|
||
|
SOCKET m_sUPnPDiscoverySocket; // socket opened for UPnP discovery communication on this device
|
||
|
CUPnPDevice * m_pUPnPDevice; // pointer to UPnP Internet gateway for this device, if any
|
||
|
DWORD m_dwFirstUPnPDiscoveryTime; // the time we first sent UPnP discovery traffic from this particular port, locally or remotely
|
||
|
|
||
|
#ifdef DBG
|
||
|
DWORD m_dwNumUPnPDeviceFailures; // how many times a UPnP device returned an error or stopped responding and had to be cleared
|
||
|
#endif // DBG
|
||
|
};
|
||
|
|