Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

391 lines
9.4 KiB

//
// ccat.h -- This file contains the class definations for:
// CCategorizer
// CAttributes
// CCIRCULAR_DETECT
//
// Created:
// Sep 3, 1996 -- Alex Wetmore (awetmore)
// Changes:
//// jstamerj 980227 14:13:42: Modified for Platinum categorizer
#ifndef __CCAT_H__
#define __CCAT_H__
#include <windows.h>
#include <transmem.h>
#include <listmacr.h>
#include "cat.h"
#include "cattype.h"
#include "idstore.h"
#include "catdefs.h"
#include "spinlock.h"
#include "catperf.h"
#define DEFAULT_VIRTUAL_SERVER_INSTANCES 10
#define MAX_FULL_EMAIL CAT_MAX_INTERNAL_FULL_EMAIL
#define MAX_ENUM_RESULT 100
// maximum number of times to resolve forwarding addresses on a given address
// before giving up and realizing that its a loop
#define MAX_FORWARD_ITERATIONS 25
#define AB_HASHFILENAME "route.hsh"
VOID AsyncResolveCompletion(LPVOID pContext);
VOID AsyncIMsgCatCompletion(LPVOID pContext);
#define NUM_SYSTEM_CCATADDR_PROPIDS 2
BOOL FIsHResultRetryable(IN HRESULT hr);
//
// the address book
//
CatDebugClass(CCategorizer)
{
public:
CCategorizer();
~CCategorizer();
//
// Lifetime refcounting functions
//
LONG AddRef();
LONG Release();
VOID ReleaseAndWaitForDestruction();
//
// Initialize
//
HRESULT Initialize(
PCCATCONFIGINFO pConfigInfo,
DWORD dwICatItemPropIDs,
DWORD dwICatListResolvePropIDs);
//
// Simple method to make sure the string terminates before
// the max length, and the string points to readable memory.
//
BOOL VerifyStringLength(LPSTR szString, DWORD dwMaxLength);
HRESULT AsyncResolveIMsg(IUnknown *pImsg,
PFNCAT_COMPLETION pfnCatCompletion,
LPVOID pContext);
HRESULT AsyncResolveDLs( IUnknown *pImsg,
PFNCAT_COMPLETION pfnCatCompletion,
LPVOID pContext,
BOOL fMatchOnly,
PBOOL pfMatch,
CAT_ADDRESS_TYPE CAType,
LPSTR pszAddress);
//
// cancel all outstanding long running calls on other threads
//
void Cancel();
//
// Shutdown the address book
//
HRESULT Shutdown(void);
//
// Method to access EmailIDStore
//
CEmailIDStore<CCatAddr> *GetEmailIDStore() {
return m_pStore;
}
//
// Method to access our default SMTP domain
//
LPSTR GetDefaultSMTPDomain() {
return m_ConfigInfo.pszDefaultDomain;
}
VOID CatCompletion(
PFNCAT_COMPLETION pfnCatCOmpletion,
HRESULT hr,
LPVOID pContext,
IUnknown *pIMsg,
IUnknown **rgpIMsg);
VOID GetPerfCounters(
PCATPERFBLOCK pCatPerfBlock)
{
//
// Fill in the global LDAP perf counters on demand
//
CopyMemory(&(GetPerfBlock()->LDAPPerfBlock), &g_LDAPPerfBlock, sizeof(CATLDAPPERFBLOCK));
CopyMemory(pCatPerfBlock, GetPerfBlock(), sizeof(CATPERFBLOCK));
}
VOID SetNextCCategorizer(
CCategorizer *pCCat)
{
_ASSERT(m_pCCatNext == NULL);
m_pCCatNext = pCCat;
m_pCCatNext->AddRef();
}
VOID PrepareForShutdown()
{
m_fPrepareForShutdown = TRUE;
Cancel();
}
private:
//
// make sure that an email address is valid
//
BOOL VerifyEmailAddress(LPSTR szEmail);
BOOL VerifyDomainName(LPSTR szDomain);
//
// Do the default processing of OnCatRegister
//
HRESULT Register();
//
// Helper routine to set all schema parameters in ICatParams based
// on a particular schema type
//
HRESULT RegisterSchemaParameters(LPSTR pszSchema);
//
// Routine to retrieve the ICatItem propID reserved for ptr to a
// CCatAddr
//
DWORD GetICatItemCCatAddrPropId()
{
return m_dwICatParamSystemProp_CCatAddr;
}
//
// PropId we use to build a list of CCatAddr prior to the first
// resolution (we can't resolve as we go because asyncctx needs to
// be pre-initialized with the number of top level resolves
//
DWORD GetICatItemChainPropId()
{
return m_dwICatParamSystemProp_CCatAddr + 1;
}
//
// Routine to retrieve ISMTPServer for this virtual server
//
ISMTPServer *GetISMTPServer()
{
return m_ConfigInfo.pISMTPServer;
}
ISMTPServerEx *GetISMTPServerEx()
{
return m_pISMTPServerEx;
}
//
// Routine to retrieve the domain config interface for this virtual server
//
ICategorizerDomainInfo *GetIDomainInfo()
{
return m_ConfigInfo.pIDomainInfo;
}
//
// Retrieve the cat flags for this virtual server
//
DWORD GetCatFlags()
{
return m_ConfigInfo.dwCatFlags;
}
public:
//
// A special DWORD that enables/disables cat for this VS
//
BOOL IsCatEnabled()
{
//
// Check the enable/disable DWORD (DsUseCat) as well as
// dwCatFlags (at least one flag must be set or we're still
// disabled)
//
return ((m_ConfigInfo.dwEnable != 0) &&
(m_ConfigInfo.dwCatFlags != 0));
}
private:
//
// Copy in a config structure during initialization
//
HRESULT CopyCCatConfigInfo(PCCATCONFIGINFO pConfigInfo);
//
// Releae all memory and interfaces held by the ConfigInfo struct
//
VOID ReleaseConfigInfo();
//
// Helper routine to copy paramters
//
HRESULT SetICatParamsFromConfigInfo();
//
// Access to our config struct
//
PCCATCONFIGINFO GetCCatConfigInfo()
{
return &m_ConfigInfo;
}
ICategorizerParametersEx *GetICatParams()
{
return m_pICatParams;
}
DWORD GetNumCatItemProps()
{
return m_cICatParamProps;
}
DWORD GetNumCatListResolveProps()
{
return m_cICatListResolveProps;
}
//
// Delayed initialize function
//
HRESULT DelayedInitialize();
//
// Do delayed initialize if not already done
//
HRESULT DelayedInitializeIfNecessary();
PCATPERFBLOCK GetPerfBlock()
{
return &m_PerfBlock;
}
#define SIGNATURE_CCAT ((DWORD)'tacC')
#define SIGNATURE_CCAT_INVALID ((DWORD)'XacC')
DWORD m_dwSignature;
//
// Increment completion counters based on the list resolve status
//
HRESULT HrAdjustCompletionCounters(
HRESULT hrListResolveStatus,
IUnknown *pIMsg,
IUnknown **rgpIMsg);
BOOL fIsShuttingDown()
{
return m_fPrepareForShutdown;
}
//
// ref count
//
LONG m_lRefCount;
LONG m_lDestructionWaiters;
BOOL m_fPrepareForShutdown;
HANDLE m_hShutdownEvent;
//
// this is the pointer to the underlying EmailID store object.
//
CEmailIDStore<CCatAddr> *m_pStore;
//
// ICategorizerParametersEx -- configuration information for this
// virtual server
//
ICategorizerParametersEx *m_pICatParams;
//
// Number of properties we need to allocate in each ICatParams
//
DWORD m_cICatParamProps;
//
// Number of properties we need to allocate in each ICatListResolve
//
DWORD m_cICatListResolveProps;
//
// The property ID in an ICategorizerItem used for CCatAddr *
//
DWORD m_dwICatParamSystemProp_CCatAddr;
//
// Configuration parameters passed in
//
CCATCONFIGINFO m_ConfigInfo;
//
// One of the following values:
// CAT_S_NOT_INITIALIED: Delayed initialize has not yet been done
// CAT_E_INIT_FAILED: Delayed initialize failed
// S_OK: Initialized okay
//
HRESULT m_hrDelayedInit;
//
// Keep track of what we have initialized
//
DWORD m_dwInitFlags;
#define INITFLAG_REGISTER 0x0001
#define INITFLAG_REGISTEREVENT 0x0002
#define INITFLAG_STORE 0x0004
CRITICAL_SECTION m_csInit;
//
// A list to keep track of all outstanding list resolves
//
SPIN_LOCK m_PendingResolveListLock;
LIST_ENTRY m_ListHeadPendingResolves;
//
// Refcounted pointer to a CCategorizer with a newer config
//
CCategorizer *m_pCCatNext;
//
// ISMTPServerEx interface pointer; if available
//
ISMTPServerEx *m_pISMTPServerEx;
//
// Performance counters
//
CATPERFBLOCK m_PerfBlock;
VOID RemovePendingListResolve(
CICategorizerListResolveIMP *pListResolve);
VOID AddPendingListResolve(
CICategorizerListResolveIMP *pListResolve);
VOID CancelAllPendingListResolves(
HRESULT hrReason = HRESULT_FROM_WIN32(ERROR_CANCELLED));
friend VOID AsyncIMsgCatCompletion(LPVOID pContext);
friend HRESULT MailTransport_Default_CatRegister(
HRESULT hrStatus,
PVOID pvContext);
friend class CICategorizerListResolveIMP;
friend class CICategorizerDLListResolveIMP;
friend class CCatAddr;
friend class CABContext;
};
#endif //__CCAT_H__