windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dpnathlp/dpnhupnp/dpnhupnpdevice.h
2020-09-26 16:20:57 +08:00

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
};