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.
 
 
 
 
 
 

150 lines
4.0 KiB

//-----------------------------------------------------------------------------
//
//
// File: dsnevent.h
//
// Description: Define dsnevent structure. Used to pass parameters to DSN sink
// with intelligent defaults
//
// Author: Mike Swafford (MikeSwa)
//
// History:
// 7/11/98 - MikeSwa Created
//
// Copyright (C) 1998 Microsoft Corporation
//
//-----------------------------------------------------------------------------
#ifndef __DSNEVENT_H__
#define __DSNEVENT_H__
class CAQSvrInst;
#define DSN_PARAMS_SIG 'PnsD'
const CHAR DEFAULT_MTA_TYPE[] = "dns";
#define DSN_DEBUG_CONTEXT_MAX_SIZE 50
#define DSN_DEBUG_CONTEXT_FORMAT "12345678 - line#"
#define DSN_LINE_PREFIX " - "
//
// We will encode the filename using the same hash we use for domhash.
// This way, we can always have supplemental info useful for debugging DSNs
//
#define SET_DEBUG_DSN_CONTEXT(x, linenum) \
{ \
register LPSTR szCurrent = (x).szDebugContext; \
_itoa(dwDSNContextHash(__FILE__, sizeof(__FILE__)), \
szCurrent, 16); \
szCurrent += strlen((x).szDebugContext);\
strcpy(szCurrent, DSN_LINE_PREFIX); \
szCurrent += (sizeof(DSN_LINE_PREFIX)-1); \
_itoa(linenum, szCurrent, 10); \
}
//---[ CDSNParams ]------------------------------------------------------------
//
//
// Description:
// Encapsulated DSN Parameters in a class
// Hungarian:
// dsnparams, *pdsnparams
//
//-----------------------------------------------------------------------------
class CDSNParams :
public IDSNSubmission
{
private:
DWORD m_dwSignature;
public: //actual parameters of DSN Generation event
IMailMsgProperties *pIMailMsgProperties;
DWORD dwStartDomain; //starting index used to init context
DWORD dwDSNActions; //type(s) of DSN to generate
DWORD dwRFC821Status; //global RFC821 status
HRESULT hrStatus; //global HRESULT
//OUT param(s)
DWORD dwDSNTypesGenerated;
DWORD cRecips; //# of recipients DSN'd
CAQSvrInst *paqinst;
CHAR szDebugContext[DSN_DEBUG_CONTEXT_MAX_SIZE]; //debug context stampted as "x=" header
public:
inline CDSNParams();
public: // IDSNSubmission
STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj)
{
*ppvObj = NULL;
if(riid == IID_IUnknown)
{
*ppvObj = (IUnknown *)this;
}
else if(riid == IID_IDSNSubmission)
{
*ppvObj = (IDSNSubmission *)this;
}
else
{
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
//
// This class is always allocated on the stack
//
STDMETHOD_(ULONG, AddRef)(void) { return 2; }
STDMETHOD_(ULONG, Release)(void) { return 1; }
STDMETHOD(HrAllocBoundMessage)(
OUT IMailMsgProperties **ppMsg,
OUT PFIO_CONTEXT *phContent);
STDMETHOD(HrSubmitDSN)(
IN DWORD dwDSNAction,
IN DWORD cRecipsDSNd,
IN IMailMsgProperties *pDSNMsg);
};
CDSNParams::CDSNParams()
{
_ASSERT(sizeof(DSN_DEBUG_CONTEXT_FORMAT) < DSN_DEBUG_CONTEXT_MAX_SIZE);
m_dwSignature = DSN_PARAMS_SIG;
pIMailMsgProperties = NULL;
dwStartDomain = 0;
dwDSNActions = 0;
dwRFC821Status = 0;
hrStatus = S_OK;
dwDSNTypesGenerated = 0;
cRecips = 0;
paqinst = NULL;
szDebugContext[0] = '\0';
}
inline DWORD dwDSNContextHash(LPCSTR szString, DWORD cbString)
{
DWORD dwHash = 0;
LPCSTR szStringEnd = szString+cbString-1;
if (szStringEnd && cbString)
{
//
// Loop until the end of the string or we hit a file separation
// character.
//
while (szStringEnd &&
(szStringEnd >= szString) &&
('\\' != *szStringEnd))
{
//Use Hash from Domhash.lib
dwHash *= 131; //First prime after ASCII character codes
dwHash += *szStringEnd;
szStringEnd--;
}
}
return dwHash;
}
#endif //__DSNEVENT_H__