186 lines
3.6 KiB
C++
186 lines
3.6 KiB
C++
#ifndef _SITEBINDING_HXX_
|
|
#define _SITEBINDING_HXX_
|
|
|
|
#define WILDCARD_ADDRESS (0)
|
|
|
|
typedef ULONGLONG SITE_BINDING_KEY;
|
|
|
|
class SITE_BINDING_HASH;
|
|
|
|
class SITE_BINDING
|
|
{
|
|
public:
|
|
SITE_BINDING(
|
|
DWORD LocalAddress,
|
|
USHORT LocalPort,
|
|
DWORD dwSiteId
|
|
)
|
|
{
|
|
_cRefs = 1;
|
|
|
|
DBG_ASSERT( dwSiteId != 0 );
|
|
_dwSiteId = dwSiteId;
|
|
|
|
_bindingKey = GenerateBindingKey( LocalAddress, LocalPort );
|
|
}
|
|
|
|
DWORD
|
|
QuerySiteId(
|
|
VOID
|
|
) const
|
|
{
|
|
return _dwSiteId;
|
|
}
|
|
|
|
VOID
|
|
ReferenceSiteBinding(
|
|
VOID
|
|
)
|
|
{
|
|
InterlockedIncrement( &_cRefs );
|
|
}
|
|
|
|
VOID
|
|
DereferenceSiteBinding(
|
|
VOID
|
|
)
|
|
{
|
|
if ( InterlockedDecrement( &_cRefs ) == 0 )
|
|
{
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
SITE_BINDING_KEY
|
|
QueryBindingKey(
|
|
VOID
|
|
) const
|
|
{
|
|
return _bindingKey;
|
|
}
|
|
|
|
static
|
|
SITE_BINDING_KEY
|
|
GenerateBindingKey(
|
|
DWORD LocalAddress,
|
|
USHORT LocalPort
|
|
)
|
|
{
|
|
LARGE_INTEGER liKey;
|
|
|
|
liKey.HighPart = LocalAddress;
|
|
liKey.LowPart = LocalPort;
|
|
return liKey.QuadPart;
|
|
}
|
|
|
|
static
|
|
HRESULT
|
|
ParseSiteBinding(
|
|
WCHAR * pszBinding,
|
|
DWORD * pLocalAddress,
|
|
USHORT * pLocalPort
|
|
);
|
|
|
|
static
|
|
HRESULT
|
|
HandleSiteBindingChange(
|
|
DWORD dwSiteId,
|
|
WCHAR * pszSitePath
|
|
);
|
|
|
|
static
|
|
HRESULT
|
|
Initialize(
|
|
VOID
|
|
);
|
|
|
|
static
|
|
VOID
|
|
Terminate(
|
|
VOID
|
|
);
|
|
|
|
static
|
|
HRESULT
|
|
GetSiteId(
|
|
DWORD LocalAddress,
|
|
USHORT LocalPort,
|
|
DWORD * pdwSiteId
|
|
);
|
|
|
|
private:
|
|
SITE_BINDING_KEY _bindingKey;
|
|
DWORD _dwSiteId;
|
|
LONG _cRefs;
|
|
|
|
static SITE_BINDING_HASH * sm_pSiteBindingHash;
|
|
static BOOL sm_fAllWildcardBindings;
|
|
};
|
|
|
|
class SITE_BINDING_HASH
|
|
: public CTypedHashTable<
|
|
SITE_BINDING_HASH,
|
|
SITE_BINDING,
|
|
SITE_BINDING_KEY
|
|
>
|
|
{
|
|
public:
|
|
SITE_BINDING_HASH()
|
|
: CTypedHashTable< SITE_BINDING_HASH,
|
|
SITE_BINDING,
|
|
SITE_BINDING_KEY > ( "SITE_BINDING_HASH" )
|
|
{
|
|
}
|
|
|
|
static
|
|
SITE_BINDING_KEY
|
|
ExtractKey(
|
|
const SITE_BINDING * pSiteBinding
|
|
)
|
|
{
|
|
return pSiteBinding->QueryBindingKey();
|
|
}
|
|
|
|
static
|
|
DWORD
|
|
CalcKeyHash(
|
|
SITE_BINDING_KEY siteBindingKey
|
|
)
|
|
{
|
|
return HashBlob( &siteBindingKey,
|
|
sizeof( SITE_BINDING_KEY ) );
|
|
}
|
|
|
|
static
|
|
bool
|
|
EqualKeys(
|
|
SITE_BINDING_KEY key1,
|
|
SITE_BINDING_KEY key2
|
|
)
|
|
{
|
|
return key1 == key2;
|
|
}
|
|
|
|
static
|
|
void
|
|
AddRefRecord(
|
|
SITE_BINDING * pSiteBinding,
|
|
int nIncr
|
|
)
|
|
{
|
|
DBG_ASSERT( pSiteBinding != NULL );
|
|
|
|
if ( nIncr == +1 )
|
|
{
|
|
pSiteBinding->ReferenceSiteBinding();
|
|
}
|
|
else
|
|
{
|
|
DBG_ASSERT( nIncr == -1 );
|
|
pSiteBinding->DereferenceSiteBinding();
|
|
}
|
|
}
|
|
};
|
|
|
|
#endif
|