windows-nt/Source/XPSP1/NT/inetsrv/iis/inc/iisassoc.hxx
2020-09-26 16:20:57 +08:00

154 lines
3.1 KiB
C++

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
iisassoc.hxx
Abstract:
This include file contains the declaration of the IIS_ASSOCIATION class.
An IIS_ASSOCIATION is used to create an N-way association between
IIS_ENDPOINTs and IIS_SERVER_INSTANCEs.
The current IIS_ASSOCIATION is hash based. It may hash on either the
IP address, the host name, or both. The hash method is specified when
the object is constructed.
Author:
Keith Moore (keithmo) 16-Jan-1997
Revision History:
--*/
#ifndef _IISASSOC_HXX_
#define _IISASSOC_HXX_
//
// We will need to do some perf tuning to get a more reasonable value for
// this number. We may need to make this metabase configurable, or at least
// base it on the 'size' of the server.
//
#define DEFAULT_ASSOCIATION_HASH_BUCKETS 97
typedef
BOOL
(WINAPI * LPFN_ASSOCIATION_CALLBACK)(
IN LPVOID CallbackContext,
IN LPVOID DescriptorContext,
IN DWORD IpAddress,
IN const CHAR * HostName
);
class IIS_ASSOCIATION {
public:
//
// This hash context is used to avoid redundant hash context calculations
// while searching through multiple associations.
//
typedef struct _HASH_CONTEXT {
DWORD IpAddressHash;
DWORD HostNameHash;
} HASH_CONTEXT, *PHASH_CONTEXT;
static
VOID
InitializeHashContext(
OUT PHASH_CONTEXT HashContext
) {
HashContext->IpAddressHash = 0;
HashContext->HostNameHash = 0;
}
//
// Usual constructor/destructor stuff.
//
IIS_ASSOCIATION(
IN BOOL HashIpAddress,
IN BOOL HashHostName,
IN INT NumHashBuckets = DEFAULT_ASSOCIATION_HASH_BUCKETS
);
~IIS_ASSOCIATION();
//
// Descriptor management.
//
DWORD
AddDescriptor(
IN DWORD IpAddress,
IN const CHAR * HostName OPTIONAL,
IN LPVOID Context,
IN OUT PHASH_CONTEXT HashContext = NULL
);
DWORD
LookupDescriptor(
IN DWORD IpAddress,
IN const CHAR * HostName OPTIONAL,
OUT LPVOID *Context,
IN OUT PHASH_CONTEXT HashContext = NULL
);
DWORD
RemoveDescriptor(
IN DWORD IpAddress,
IN const CHAR * HostName OPTIONAL,
OUT LPVOID *Context,
IN OUT PHASH_CONTEXT HashContext = NULL
);
VOID
EnumDescriptors(
IN LPFN_ASSOCIATION_CALLBACK Callback,
IN LPVOID CallbackContext
);
private:
VOID
CalculateHash(
IN DWORD IpAddress,
IN const CHAR * HostName OPTIONAL,
OUT PHASH_CONTEXT HashContext
);
struct _HASH_ENTRY *
FindDescriptor(
IN DWORD IpAddress,
IN const CHAR * HostName OPTIONAL,
IN PHASH_CONTEXT HashContext
);
struct _HASH_ENTRY *
CreateHashEntry(
IN DWORD IpAddress,
IN const CHAR * HostName OPTIONAL,
IN PHASH_CONTEXT HashContext
);
INT m_NumHashBuckets;
PLIST_ENTRY m_HashBuckets;
BOOL m_HashIpAddress;
BOOL m_HashHostName;
}; // IIS_ASSOCIATION
#endif // _IISASSOC_HXX_