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.
86 lines
3.0 KiB
86 lines
3.0 KiB
// POP3DropDir.h: interface for the POP3DropDir class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef __POP3DROPDIR_H_
|
|
#define __POP3DROPDIR_H_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include <mailbox.h>
|
|
#include <mailmsg.h>
|
|
#include <seo.h>
|
|
#include <eventlogger.h>
|
|
|
|
#define LODWORD(i64) (DWORD)(0xffffffff&(i64))
|
|
#define HIDWORD(i64) (DWORD)(((unsigned __int64)(i64))>>32)
|
|
#define PRIVATE_OPTIMAL_BUFFER_SIZE 64 * 1024 // From smtp\server\dropdir.h
|
|
#define OPTIMAL_BUFFER_W_DOTSTUFFING_PAD PRIVATE_OPTIMAL_BUFFER_SIZE * 4/3 + 1 // worst case every \r\n. sequence would be expanded to \r\n..
|
|
|
|
typedef struct _POP3DROPDIR_OVERLAPPED
|
|
{
|
|
FH_OVERLAPPED Overlapped;
|
|
PVOID ThisPtr;
|
|
} POP3DROPDIR_OVERLAPPED, *PPOP3DROPDIR_OVERLAPPED;
|
|
|
|
|
|
class CPOP3DropDir
|
|
{
|
|
public:
|
|
CPOP3DropDir( IMailMsgProperties *pIMailMsgProperties, DWORD dwRecipCount, DWORD *pdwRecipIndexes, IMailMsgNotify *pIMailMsgNotify );
|
|
virtual ~CPOP3DropDir();
|
|
private:
|
|
CPOP3DropDir(){;} // Hide default constructor
|
|
|
|
// Implementation
|
|
public:
|
|
HRESULT DoLocalDelivery();
|
|
bool isAllRecipientsProcessed( ){ return (m_dwRecipCurrent < m_dwRecipCount ) ? false : true; }
|
|
HRESULT NextRecipientCopyMailToDropDir(){ HRESULT hr; do{ hr = CopyMailToDropDir(); } while ( ERROR_INVALID_MESSAGEDEST == hr ); return hr; }
|
|
HRESULT ReadFileCompletion( DWORD cbSize, DWORD dwErr, PFH_OVERLAPPED lpo );
|
|
HRESULT SetHr( HRESULT hr ){ return m_hr = FAILED(hr) ? hr : m_hr; }
|
|
HRESULT WriteFileCompletion( DWORD cbSize, DWORD dwErr, PFH_OVERLAPPED lpo );
|
|
|
|
protected:
|
|
HRESULT CopyMailToDropDir();
|
|
HRESULT DotStuffBuffer( LPVOID *ppBuffer, LPDWORD pdwSize );
|
|
HRESULT MailboxAndContextCleanup( bool bDeleteMailFile );
|
|
HRESULT MarkRecipient( DWORD dwMark );
|
|
HRESULT ReadFile( IN LPVOID pBuffer, IN DWORD cbSize );
|
|
HRESULT WriteFile( IN LPVOID pBuffer, IN DWORD cbSize );
|
|
|
|
// Attributes
|
|
protected:
|
|
HRESULT m_hr;
|
|
unsigned __int64 m_i64ReadOffset;
|
|
unsigned __int64 m_i64WriteOffset;
|
|
DWORD m_dwRecipCount;
|
|
DWORD m_dwRecipCurrent; // Recipient currently delivering for
|
|
DWORD *m_pdwRecipIndexes;
|
|
WCHAR m_sRecipEmailName[POP3_MAX_ADDRESS_LENGTH]; // Domain name length + mailbox name length + @ + NULL
|
|
WCHAR m_sStoreFileName[64];
|
|
char m_sBuffer[OPTIMAL_BUFFER_W_DOTSTUFFING_PAD];
|
|
|
|
enum BufferWrapSequence{
|
|
NA = 0,
|
|
CR = 1,
|
|
CRLF = 2
|
|
};
|
|
BufferWrapSequence m_enumBWS;
|
|
|
|
PFIO_CONTEXT m_PFIOContextRead;
|
|
PFIO_CONTEXT m_PFIOContextWrite;
|
|
POP3DROPDIR_OVERLAPPED m_OverlappedRead;
|
|
POP3DROPDIR_OVERLAPPED m_OverlappedWrite;
|
|
CMailBox m_mailboxX;
|
|
|
|
IMailMsgBind *m_pIMailMsgBind;
|
|
IMailMsgProperties *m_pIMailMsgProperties;
|
|
IMailMsgNotify *m_pIMailMsgNotify;
|
|
IMailMsgRecipients *m_pIMailMsgRecipients;
|
|
|
|
};
|
|
|
|
#endif // __POP3DROPDIR_H_
|