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
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__
|