windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/smtp/server/buildq.hxx
2020-09-26 16:20:57 +08:00

131 lines
3.4 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name :
buildq.hxx
Abstract:
This module defines the SMTP_BUILDQ class.
This object maintains information about the initial
list of messages to be delivered upon service startup
Author:
KeithLau 10/9/96
Project:
SMTP Server DLL
Revision History:
--*/
#ifndef _SMTP_BUILDQ_HXX_
#define _SMTP_BUILDQ_HXX_
/************************************************************
* Include Headers
************************************************************/
//
// Redefine the type to indicate that this is a call-back function
//
typedef ATQ_COMPLETION PFN_ATQ_COMPLETION;
/************************************************************
* Symbolic Constants
************************************************************/
# define SMTP_BUILDQ_SIGNATURE_VALID 'BLQV'
# define SMTP_BUILDQ_SIGNATURE_FREE 'BLQF'
/************************************************************
* Global functions
************************************************************/
class SMTP_SERVER_INSTANCE;
//BOOL InitBuildQueueObject(void);
//void DestroyBuildQueueObject(void);
//void ShutdownBuildQueue(SMTP_BUILDQ *pBuildQ);
/*++
class SMTP_BUILDQ
It maintains the initial mail message list upon service startup.
--*/
class SMTP_BUILDQ
{
public:
SMTP_BUILDQ (SMTP_SERVER_INSTANCE * pInst);
~SMTP_BUILDQ(void);
BOOL InitializeObject(ATQ_COMPLETION pfnCompletion);
BOOL ProcessQueueObject(DWORD InputBufferLen,
DWORD dwCompletionStatus,
OVERLAPPED * lpo);
BOOL ProcessMailQIO(DWORD InputBufferLen,
DWORD dwCompletionStatus,
OVERLAPPED * lpo);
DWORD BuildInitialQueue(void);
void CloseAtqHandleAndFlushQueue(void);
LONG GetThreadCount() const {return m_cActiveThreads;}
PATQ_CONTEXT QueryAtqContext(void) const {return m_pAtqContext;}
DWORD GetNumEntries(void) {return m_Entries;}
BOOL InsertIntoInitialQueue(IN OUT PERSIST_QUEUE_ENTRY * pEntry);
PQUEUE_ENTRY PopQEntry(void);
void LockQ() {EnterCriticalSection (&m_CritSec);}
void UnLockQ() {LeaveCriticalSection (&m_CritSec);}
BOOL IsQueueEmpty(void) const {return IsListEmpty(&m_InitalQListHead);}
BOOL IsValid(void) const
{
return(m_Signature == SMTP_BUILDQ_SIGNATURE_VALID);
}
SMTP_SERVER_INSTANCE * QuerySmtpInstance( VOID ) const
{ _ASSERT(m_pInstance != NULL); return m_pInstance; }
BOOL IsSmtpInstance( VOID ) const
{ return m_pInstance != NULL; }
VOID SetSmtpInstance( IN SMTP_SERVER_INSTANCE * pInstance )
{ _ASSERT(m_pInstance == NULL); m_pInstance = pInstance; }
private :
ULONG m_Signature;
HANDLE m_hAtq;
LONG m_cPendingIoCount;
LONG m_cActiveThreads;
DWORD m_Entries;
PATQ_CONTEXT m_pAtqContext;
LIST_ENTRY m_InitalQListHead;
CRITICAL_SECTION m_CritSec;
SMTP_SERVER_INSTANCE *m_pInstance;
BOOL PostCompletionStatus(DWORD BytesTransferred);
LONG IncPendingIoCount(void) { return InterlockedIncrement(&m_cPendingIoCount); }
LONG DecPendingIoCount(void) { return InterlockedDecrement(&m_cPendingIoCount); }
LONG IncThreadCount(void) { return InterlockedIncrement(&m_cActiveThreads); }
LONG DecThreadCount(void) { return InterlockedDecrement(&m_cActiveThreads); }
BOOL MakeAllAddrsLocal (HANDLE hFile, char * szBuffer, ENVELOPE_HEADER * pMyHeader);
};
#endif
/************************ End of File ***********************/