|
|
//+------------------------------------------------------------
//
// Copyright (C) 2001, Microsoft Corporation
//
// File: dsninternal.h
//
// Contents: Classes used internally in the DSN code
//
// Classes:
//
// Functions:
//
// History:
// jstamerj 2001/05/10 20:34:19: Created.
//
//-------------------------------------------------------------
#ifndef __DSNINTERNAL_H__
#define __DSNINTERNAL_H__
#define RECIPITER_SIG (DWORD)'IpRD'
#define RECIPITER_SIG_INVALID (DWORD)'XpRD'
//
// The default implementation of the DSN Recipient iterator
//
class CDefaultDSNRecipientIterator : public IDSNRecipientIterator { public: //IUnknown
STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj); //
// This class is allocated as a part of another object. Pass
// AddRef/Release to the parent object
//
STDMETHOD_(ULONG, AddRef)(void) { return m_pUnk->AddRef(); } STDMETHOD_(ULONG, Release)(void) { return m_pUnk->Release(); } public: STDMETHOD(HrReset) ();
STDMETHOD(HrGetNextRecipient) ( OUT DWORD *piRecipient, OUT DWORD *pdwDSNAction);
STDMETHOD(HrNotifyActionHandled) ( IN DWORD iRecipient, IN DWORD dwDSNAction);
public: CDefaultDSNRecipientIterator( IUnknown *pUnk) { m_dwStartDomain = 0; m_dwDSNActions = 0; m_pIRecips = NULL; m_fFilterInit = NULL; m_pUnk = pUnk; m_dwSig = RECIPITER_SIG; }
~CDefaultDSNRecipientIterator();
HRESULT HrInit( IN IMailMsgProperties *pIMsg, IN DWORD dwStartDomain, IN DWORD dwDSNActions);
private: VOID GetFilterMaskAndFlags( IN DWORD dwDSNActions, OUT DWORD *pdwRecipMask, OUT DWORD *pdwRecipFlags);
VOID GetDSNAction( IN DWORD dwDSNAction, IN DWORD dwCurrentRecipFlags, OUT DWORD *pdwCurrentDSNAction);
VOID GetRecipientFlagsForActions( IN DWORD dwDSNAction, OUT DWORD *pdwRecipientFlags);
VOID TerminateFilter();
private: DWORD m_dwSig; IUnknown *m_pUnk; DWORD m_dwStartDomain; DWORD m_dwDSNActions; IMailMsgRecipients *m_pIRecips; BOOL m_fFilterInit; RECIPIENT_FILTER_CONTEXT m_rpfctxt; };
class CPostDSNHandler : public IDSNSubmission { #define SIGNATURE_CPOSTDSNHANDLER (DWORD)'SDPC'
#define SIGNATURE_CPOSTDSNHANDLER_INVALID (DWORD)'SDPX'
public: CPostDSNHandler( IN IUnknown *pUnk, IN CDSNGenerator *pDSNGenerator, IN IAQServerEvent *pIServerEvent, IN DWORD dwVSID, IN ISMTPServer *pISMTPServer, IN IMailMsgProperties *pIMsgOrig, IN IDSNSubmission *pIAQDSNSubmission, IN IDSNGenerationSink *pDefaultSink);
~CPostDSNHandler();
VOID SetPropInterface( IN IMailMsgPropertyBag *pIDSNProps) { if(m_pIDSNProps) m_pIDSNProps->Release(); m_pIDSNProps = pIDSNProps; m_pIDSNProps->AddRef(); }
VOID ReleaseAQDSNSubmission() { if(m_pIAQDSNSubmission) { m_pIAQDSNSubmission->Release(); m_pIAQDSNSubmission = NULL; } } public: STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj); //
// This class is allocated as a part of another object. Pass
// AddRef/Release to the parent object
//
STDMETHOD_(ULONG, AddRef)(void) { return m_pUnk->AddRef(); } STDMETHOD_(ULONG, Release)(void) { return m_pUnk->Release(); } STDMETHOD(HrAllocBoundMessage)( OUT IMailMsgProperties **ppMsg, OUT PFIO_CONTEXT *phContent); STDMETHOD(HrSubmitDSN)( IN DWORD dwDSNAction, IN DWORD cRecipsDSNd, IN IMailMsgProperties *pDSNMsg);
private: DWORD m_dwSig; IUnknown *m_pUnk; CDSNGenerator *m_pDSNGenerator; IAQServerEvent *m_pIServerEvent; DWORD m_dwVSID; ISMTPServer *m_pISMTPServer; IMailMsgProperties *m_pIMsgOrig; IMailMsgPropertyBag *m_pIDSNProps; IDSNSubmission *m_pIAQDSNSubmission; IDSNGenerationSink *m_pDefaultSink; };
//
// The class will control the refcounting and lifetime of all the
// per-DSN classes
//
#define SIGNATURE_CDSNPOOL (DWORD)'PSDC'
#define SIGNATURE_CDSNPOOL_INVALID (DWORD)'PSDX'
class CDSNPool : public IUnknown { public: //
// Disable the warning that we are using "this" in the
// constructor. Since All we do is save the pointer for later
// use, we are safe.
//
#pragma warning( disable : 4355)
CDSNPool( IN CDSNGenerator *pDSNGenerator, IN IAQServerEvent *pIServerEvent, IN DWORD dwVSID, IN ISMTPServer *pISMTPServer, IN IMailMsgProperties *pIMsgOrig, IN IDSNSubmission *pIAQDSNSubmission, IN IDSNGenerationSink *pDefaultSink) : m_DefaultRecipIter(this), m_PostDSNHandler( this, pDSNGenerator, pIServerEvent, dwVSID, pISMTPServer, pIMsgOrig, pIAQDSNSubmission, pDefaultSink) { m_dwSig = SIGNATURE_CDSNPOOL; m_lRef = 1; } #pragma warning( default : 4355 )
~CDSNPool() { _ASSERT(m_dwSig == SIGNATURE_CDSNPOOL); m_dwSig = SIGNATURE_CDSNPOOL_INVALID; }
void *operator new(size_t size) { return sm_Pool.Alloc(); } void operator delete(void *p, size_t size) { return sm_Pool.Free(p); }
public: STDMETHOD(QueryInterface)(REFIID riid, LPVOID * ppvObj) { if(riid == IID_IUnknown) { *ppvObj = (IUnknown *)this; AddRef(); return S_OK; } else { return E_NOINTERFACE; } } STDMETHOD_(ULONG, AddRef)(void) { return InterlockedIncrement(&m_lRef); } STDMETHOD_(ULONG, Release)(void) { ULONG ulRet = InterlockedDecrement(&m_lRef); if(ulRet == 0) { delete this; } return ulRet; }
CDefaultDSNRecipientIterator * GetDefaultIter() { return &m_DefaultRecipIter; } CPostDSNHandler * GetPostDSNHandler() { return &m_PostDSNHandler; } CMailMsgPropertyBag * GetDSNProperties() { return &m_PropBag; }
static HRESULT HrStaticInit(); static VOID StaticDeinit();
private: static CPool sm_Pool; DWORD m_dwSig; LONG m_lRef; CDefaultDSNRecipientIterator m_DefaultRecipIter; CPostDSNHandler m_PostDSNHandler; CMailMsgPropertyBag m_PropBag; };
#endif //__DSNINTERNAL_H__
|