//+------------------------------------------------------------
//
// Copyright (C) 1998, Microsoft Corporation
//
// File: smtpseo.h
//
// Contents:
//   Common types definitions needed across projects for SMTP's seo
//   dispatcher
//
// Classes:
//
// Functions:
//
// History:
// jstamerj 980608 12:29:40: Created.
//
//-------------------------------------------------------------
#ifndef __SMTPSEO_H__
#define __SMTPSEO_H__

#include <mailmsg.h>
#include <smtpevent.h>

//+------------------------------------------------------------
//
// Function: SMTP SEO completion function
//
// Synopsis:
//
// Arguments:
//
// Returns:
//  S_OK: Success
//
// History:
// jstamerj 980610 16:13:28: Created.
//
//-------------------------------------------------------------
typedef HRESULT (*PFN_SMTPEVENT_CALLBACK)(HRESULT hrStatus,
                                          PVOID pvContext);


typedef enum _SMTP_DISPATCH_EVENT_TYPE
{
    SMTP_EVENT_NONE = 0,
    SMTP_MAIL_DROP_EVENT,
    SMTP_STOREDRV_DELIVERY_EVENT,
    SMTP_STOREDRV_ALLOC_EVENT,
    SMTP_STOREDRV_STARTUP_EVENT,
    SMTP_STOREDRV_PREPSHUTDOWN_EVENT,
    SMTP_STOREDRV_SHUTDOWN_EVENT,
    SMTP_MAILTRANSPORT_SUBMISSION_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_REGISTER_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_BEGIN_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_END_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_BUILDQUERY_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_BUILDQUERIES_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_SENDQUERY_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_SORTQUERYRESULT_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_PROCESSITEM_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_EXPANDITEM_EVENT,
    SMTP_MAILTRANSPORT_CATEGORIZE_COMPLETEITEM_EVENT,
    SMTP_MAILTRANSPORT_POSTCATEGORIZE_EVENT,
    SMTP_MAILTRANSPORT_GET_ROUTER_FOR_MESSAGE_EVENT,
    SMTP_STOREDRV_ENUMMESS_EVENT,
    SMTP_MAILTRANSPORT_PRECATEGORIZE_EVENT,
    SMTP_MSGTRACKLOG_EVENT,
    SMTP_DNSRESOLVERRECORDSINK_EVENT,
    SMTP_MAXMSGSIZE_EVENT,
    SMTP_LOG_EVENT,
    SMTP_GET_AUX_DOMAIN_INFO_FLAGS_EVENT
} SMTP_DISPATCH_EVENT_TYPE;

typedef struct _EVENTPARAMS_SUBMISSION {
    IMailMsgProperties *pIMailMsgProperties;
    PFN_SMTPEVENT_CALLBACK pfnCompletion;
    PVOID pCCatMsgQueue;
} EVENTPARAMS_SUBMISSION, *PEVENTPARAMS_SUBMISSION;

typedef struct _EVENTPARAMS_PRECATEGORIZE {
    IMailMsgProperties *pIMailMsgProperties;
    PFN_SMTPEVENT_CALLBACK pfnCompletion;
    PVOID pCCatMsgQueue;
} EVENTPARAMS_PRECATEGORIZE, *PEVENTPARAMS_PRECATEGORIZE;

typedef struct _EVENTPARAMS_POSTCATEGORIZE {
    IMailMsgProperties *pIMailMsgProperties;
    PFN_SMTPEVENT_CALLBACK pfnCompletion;
    PVOID pCCatMsgQueue;
} EVENTPARAMS_POSTCATEGORIZE, *PEVENTPARAMS_POSTCATEGORIZE;

typedef struct _EVENTPARAMS_CATREGISTER {
    ICategorizerParameters *pICatParams;
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    LPSTR pszSourceLine;
    LPVOID pvCCategorizer;
    HRESULT hrSinkStatus;
} EVENTPARAMS_CATREGISTER, *PEVENTPARAMS_CATREGISTER;

typedef struct _EVENTPARAMS_CATBEGIN {
    ICategorizerMailMsgs *pICatMailMsgs;
} EVENTPARAMS_CATBEGIN, *PEVENTPARAMS_CATBEGIN;

typedef struct _EVENTPARAMS_CATEND {
    ICategorizerMailMsgs *pICatMailMsgs;
    HRESULT hrStatus;
} EVENTPARAMS_CATEND, *PEVENTPARAMS_CATEND;

typedef struct _EVENTPARAMS_CATBUILDQUERY {
    ICategorizerParameters *pICatParams;
    ICategorizerItem *pICatItem;
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    PVOID pCCatAddr;
} EVENTPARAMS_CATBUILDQUERY, *PEVENTPARAMS_CATBUILDQUERY;

typedef struct _EVENTPARAMS_CATBUILDQUERIES {
    ICategorizerParameters *pICatParams;
    DWORD dwcAddresses;
    ICategorizerItem **rgpICatItems;
    ICategorizerQueries *pICatQueries;
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    PVOID pblk;
} EVENTPARAMS_CATBUILDQUERIES, *PEVENTPARAMS_CATBUILDQUERIES;

typedef struct _EVENTPARAMS_CATSENDQUERY {
    //
    // Params needed to call real sinks
    //
    ICategorizerParameters *pICatParams;
    ICategorizerQueries *pICatQueries;
    ICategorizerAsyncContext *pICatAsyncContext;
    //
    // Params needed by our implementation of ICategorizerAsyncContext
    //
    IMailTransportNotify *pIMailTransportNotify;
    PVOID pvNotifyContext;
    HRESULT hrResolutionStatus;
    PVOID pblk;
    //
    // Default/completion processing functions
    //
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    PFN_SMTPEVENT_CALLBACK pfnCompletion;

} EVENTPARAMS_CATSENDQUERY, *PEVENTPARAMS_CATSENDQUERY;

typedef struct _EVENTPARAMS_CATSORTQUERYRESULT {
    ICategorizerParameters *pICatParams;
    HRESULT hrResolutionStatus;
    DWORD dwcAddresses;
    ICategorizerItem **rgpICatItems;
    DWORD dwcResults;
    ICategorizerItemAttributes **rgpICatItemAttributes;
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    PVOID pblk;
} EVENTPARAMS_CATSORTQUERYRESULT, *PEVENTPARAMS_CATSORTQUERYRESULT;

typedef struct _EVENTPARAMS_CATPROCESSITEM {
    ICategorizerParameters *pICatParams;
    ICategorizerItem *pICatItem;
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    PVOID pCCatAddr;
} EVENTPARAMS_CATPROCESSITEM, *PEVENTPARAMS_CATPROCESSITEM;

typedef struct _EVENTPARAMS_CATEXPANDITEM {
    ICategorizerParameters *pICatParams;
    ICategorizerItem *pICatItem;
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    PFN_SMTPEVENT_CALLBACK pfnCompletion;
    PVOID pCCatAddr;
    IMailTransportNotify *pIMailTransportNotify;
    PVOID pvNotifyContext;
} EVENTPARAMS_CATEXPANDITEM, *PEVENTPARAMS_CATEXPANDITEM;

typedef struct _EVENTPARAMS_CATCOMPLETEITEM {
    ICategorizerParameters *pICatParams;
    ICategorizerItem *pICatItem;
    PFN_SMTPEVENT_CALLBACK pfnDefault;
    PVOID pCCatAddr;
} EVENTPARAMS_CATCOMPLETEITEM, *PEVENTPARAMS_CATCOMPLETEITEM;

typedef struct _EVENTPARAMS_ROUTER {
    DWORD dwVirtualServerID;
    IMailMsgProperties *pIMailMsgProperties;
    IMessageRouter *pIMessageRouter;
    IMailTransportRouterReset *pIRouterReset;
    IMailTransportRoutingEngine *pIRoutingEngineDefault;
} EVENTPARAMS_ROUTER, *PEVENTPARAMS_ROUTER;


typedef struct _EVENTPARAMS_MSGTRACKLOG
{
    IUnknown           *pIServer;
    IMailMsgProperties *pIMailMsgProperties;
    LPMSG_TRACK_INFO    pMsgTrackInfo;
} EVENTPARAMS_MSGTRACKLOG, *PEVENTPARAMS_MSGTRACKLOG;


typedef struct _EVENTPARAMS_DNSRESOLVERRECORD {
    LPSTR                  pszHostName;
    LPSTR                  pszFQDN;
    DWORD                  dwVirtualServerId;
    IDnsResolverRecord   **ppIDnsResolverRecord;
} EVENTPARAMS_DNSRESOLVERRECORD, *PEVENTPARAMS_DNSRESOLVERRECORD;

typedef struct _EVENTPARAMS_MAXMSGSIZE
{
    IUnknown           *pIUnknown;
    IMailMsgProperties *pIMailMsg;
    BOOL               *pfShouldImposeLimit;
} EVENTPARAMS_MAXMSGSIZE, *PEVENTPARAMS_MAXMSGSIZE;

typedef struct _EVENTPARAMS_LOG
{
    LPSMTP_LOG_EVENT_INFO   pSmtpEventLogInfo;
    PVOID                   pDefaultEventLogHandler;
    DWORD                   iSelectedDebugLevel;
} EVENTPARAMS_LOG, *PEVENTPARAMS_LOG;

typedef struct _EVENTPARAMS_GET_AUX_DOMAIN_INFO_FLAGS
{
    IUnknown               *pIServer;
    LPCSTR                  pszDomainName;
    DWORD                  *pdwDomainInfoFlags;
} EVENTPARAMS_GET_AUX_DOMAIN_INFO_FLAGS, *PEVENTPARAMS_GET_AUX_DOMAIN_INFO_FLAGS;

#endif //__SMTPSEO_H__