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.
 
 
 
 
 
 

275 lines
14 KiB

// --------------------------------------------------------------------------------
// Smtptask.h
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// Steven J. Bailey
// --------------------------------------------------------------------------------
#ifndef __SMTPTASK_H
#define __SMTPTASK_H
// --------------------------------------------------------------------------------
// Depends
// --------------------------------------------------------------------------------
#include "spoolapi.h"
#include "imnxport.h"
#include "taskutil.h"
#include "storutil.h"
// --------------------------------------------------------------------------------
// Forward Decls
// --------------------------------------------------------------------------------
typedef struct tagMAILMSGHDR *LPMAILMSGHDR;
interface ILogFile;
interface IMimeMessage;
interface IMimeEnumAddressTypes;
// --------------------------------------------------------------------------------
// State
// --------------------------------------------------------------------------------
#define SMTPSTATE_CANCELED FLAG01
#define SMTPSTATE_DEFAULT FLAG02
#define SMTPSTATE_ASKEDDEFAULT FLAG03
#define SMTPSTATE_USEDEFAULT FLAG04
#define SMTPSTATE_EXECUTEFAILED FLAG05
// --------------------------------------------------------------------------------
// SMTPTASKEVENT_xxx Flags
// --------------------------------------------------------------------------------
#define SMTPEVENT_SPLITPART FLAG01 // Sending a split part
#define SMTPEVENT_COMPLETE FLAG02 // The event was completed
// --------------------------------------------------------------------------------
// SMTPEVENTINFO
// --------------------------------------------------------------------------------
typedef struct tagSMTPEVENTINFO {
DWORD dwFlags; // Flags
MESSAGEID idMessage; // Store Information
DWORD cbEvent; // Size of the message
DWORD cbEventSent; // Size of the message
DWORD cbSentTotal; // Where m_cbSent should be after this
DWORD cRecipients; // Recipient
IMimeMessage *pMessage; // Message to send
DWORD iPart; // Part dwPart of cTotalParts
DWORD cParts; // Part dwPart of cTotalParts
DWORD cbParts; // Number of bytes of original message
HRESULT hrResult; // Result of this event
} SMTPEVENTINFO, *LPSMTPEVENTINFO;
// --------------------------------------------------------------------------------
// SMTPEVENTTABLE
// --------------------------------------------------------------------------------
typedef struct tagSMTPEVENTTABLE {
DWORD iEvent; // Current Event
DWORD cCompleted; // Number of events completed
DWORD cEvents; // Number of events in prgEvent
DWORD cAlloc; // Number of items allocated in prgEvent
LPSMTPEVENTINFO prgEvent; // Array of events
} SMTPEVENTTABLE, *LPSMTPEVENTTABLE;
// --------------------------------------------------------------------------------
// CSmtpTask
// --------------------------------------------------------------------------------
class CSmtpTask : public ISpoolerTask,
public ISMTPCallback,
public ITimeoutCallback,
public ITransportCallbackService,
public IStoreCallback
{
public:
// ----------------------------------------------------------------------------
// CSmtpTask
// ----------------------------------------------------------------------------
CSmtpTask(void);
~CSmtpTask(void);
// ---------------------------------------------------------------------------
// IUnknown members
// ---------------------------------------------------------------------------
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
// ---------------------------------------------------------------------------
// ISpoolerTask
// ---------------------------------------------------------------------------
STDMETHODIMP Init(DWORD dwFlags, ISpoolerBindContext *pBindCtx);
STDMETHODIMP BuildEvents(ISpoolerUI *pSpoolerUI, IImnAccount *pAccount, FOLDERID idFolder);
STDMETHODIMP Execute(EVENTID eid, DWORD_PTR dwTwinkie);
STDMETHODIMP CancelEvent(EVENTID eid, DWORD_PTR dwTwinkie);
STDMETHODIMP ShowProperties(HWND hwndParent, EVENTID eid, DWORD_PTR dwTwinkie) {
return TrapError(E_NOTIMPL); }
STDMETHODIMP GetExtendedDetails(EVENTID eid, DWORD_PTR dwTwinkie, LPSTR *ppszDetails) {
return TrapError(E_NOTIMPL); }
STDMETHODIMP Cancel(void);
STDMETHODIMP IsDialogMessage(LPMSG pMsg);
STDMETHODIMP OnFlagsChanged(DWORD dwFlags);
// --------------------------------------------------------------------------------
// ITransportCallbackService Members
// --------------------------------------------------------------------------------
STDMETHODIMP GetParentWindow(DWORD dwReserved, HWND *phwndParent) {
TraceCall("CSmtpTask::GetParentWindow");
if (ISFLAGSET(m_dwFlags, DELIVER_NOUI))
return TraceResult(E_FAIL);
if (m_pUI)
return m_pUI->GetWindow(phwndParent);
return TraceResult(E_FAIL);
}
STDMETHODIMP GetAccount(LPDWORD pdwServerType, IImnAccount **ppAccount) {
Assert(ppAccount && m_pAccount);
*pdwServerType = SRV_SMTP;
*ppAccount = m_pAccount;
(*ppAccount)->AddRef();
return(S_OK);
}
// --------------------------------------------------------------------------------
// ITransportCallback Members
// --------------------------------------------------------------------------------
STDMETHODIMP OnTimeout(DWORD *pdwTimeout, IInternetTransport *pTransport);
STDMETHODIMP OnLogonPrompt(LPINETSERVER pInetServer, IInternetTransport *pTransport);
STDMETHODIMP_(INT) OnPrompt(HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, IInternetTransport *pTransport);
STDMETHODIMP OnStatus(IXPSTATUS ixpstatus, IInternetTransport *pTransport);
STDMETHODIMP OnError(IXPSTATUS ixpstatus, LPIXPRESULT pResult, IInternetTransport *pTransport);
STDMETHODIMP OnCommand(CMDTYPE cmdtype, LPSTR pszLine, HRESULT hrResponse, IInternetTransport *pTransport);
// --------------------------------------------------------------------------------
// ISMTPCallback
// --------------------------------------------------------------------------------
STDMETHODIMP OnResponse(LPSMTPRESPONSE pResponse);
// --------------------------------------------------------------------------------
// ITimeoutCallback
// --------------------------------------------------------------------------------
STDMETHODIMP OnTimeoutResponse(TIMEOUTRESPONSE eResponse);
// --------------------------------------------------------------------------------
// IStoreCallback Interface
// --------------------------------------------------------------------------------
STDMETHODIMP OnBegin(STOREOPERATIONTYPE tyOperation, STOREOPERATIONINFO *pOpInfo, IOperationCancel *pCancel);
STDMETHODIMP OnProgress(STOREOPERATIONTYPE tyOperation, DWORD dwCurrent, DWORD dwMax, LPCSTR pszStatus);
STDMETHODIMP OnTimeout(LPINETSERVER pServer, LPDWORD pdwTimeout, IXPTYPE ixpServerType);
STDMETHODIMP CanConnect(LPCSTR pszAccountId, DWORD dwFlags);
STDMETHODIMP OnLogonPrompt(LPINETSERVER pServer, IXPTYPE ixpServerType);
STDMETHODIMP OnComplete(STOREOPERATIONTYPE tyOperation, HRESULT hrComplete, LPSTOREOPERATIONINFO pOpInfo, LPSTOREERROR pErrorInfo);
STDMETHODIMP OnPrompt(HRESULT hrError, LPCTSTR pszText, LPCTSTR pszCaption, UINT uType, INT *piUserResponse);
private:
// ---------------------------------------------------------------------------
// Private Methods
// ---------------------------------------------------------------------------
HRESULT _HrAppendOutboxMessage(LPCSTR pszAccount, LPMESSAGEINFO pMsgInfo, BOOL fSplitMsgs, DWORD cbMaxPart);
HRESULT _HrAppendEventTable(LPSMTPEVENTINFO *ppEvent);
HRESULT _HrAppendSplitMessage(LPMESSAGEINFO pMsgInfo, DWORD cbMaxPart);
HRESULT _HrOpenMessage(MESSAGEID dwMsgId, IMimeMessage **ppMessage);
HRESULT _ExecuteSMTP(EVENTID eid, DWORD_PTR dwTwinkie);
HRESULT _ExecuteUpload(EVENTID eid, DWORD_PTR dwTwinkie);
void _FreeEventTableElements(void);
void _ResetObject(BOOL fDeconstruct);
// ---------------------------------------------------------------------------
// Error / Progress Methods
// ---------------------------------------------------------------------------
TASKRESULTTYPE _CatchResult(LPIXPRESULT pResult, INETSERVER *pServer, IXPTYPE ixpType);
TASKRESULTTYPE _CatchResult(HRESULT hrResult, IXPTYPE ixpType);
void _DoProgress(void);
// ---------------------------------------------------------------------------
// Event State Methods
// ---------------------------------------------------------------------------
HRESULT _HrStartCurrentEvent(void);
HRESULT _HrCommandMAIL(void);
HRESULT _HrCommandRCPT(void);
HRESULT _HrSendDataStream(void);
HRESULT _HrFinishCurrentEvent(HRESULT hrResult);
HRESULT _HrStartNextEvent(void);
HRESULT _HrOnConnected(void);
HRESULT _OnDisconnectComplete(void);
void _OnStreamProgress(LPSMTPSTREAM pInfo);
private:
// ---------------------------------------------------------------------------
// Private Data
// ---------------------------------------------------------------------------
DWORD m_cRef; // Reference Coutning
INETSERVER m_rServer; // Server information
DWORD m_dwFlags; // DELIVER_xxx flags
ISpoolerBindContext *m_pSpoolCtx; // Spooler bind contexting
IImnAccount *m_pAccount; // Internet Account
ISMTPTransport *m_pTransport; // SMTP transport
IMessageFolder *m_pOutbox; // The outbox
IMessageFolder *m_pSentItems;
SMTPEVENTTABLE m_rTable; // Event Table
DWORD m_cbTotal; // Total number of bytes to send
DWORD m_cbSent; // Total number of bytes to send
WORD m_wProgress; // Current progress index
EVENTID m_idEvent; // EventId for SMTP message send
EVENTID m_idEventUpload; // EventId for SMTP message send
ISpoolerUI *m_pUI; // SpoolerUI
DWORD m_dwState; // State
IMimeEnumAddressTypes *m_pAdrEnum; // Address Enumerator
HWND m_hwndTimeout; // Handle to timeout window
ILogFile *m_pLogFile; // Logfile
CRITICAL_SECTION m_cs; // Thread Safety
// Callback
MESSAGEIDLIST m_rList;
IOperationCancel *m_pCancel;
STOREOPERATIONTYPE m_tyOperation;
};
// --------------------------------------------------------------------------------
// CMessageIdStream
// --------------------------------------------------------------------------------
class CMessageIdStream : public IStream
{
public:
// -------------------------------------------------------------------------
// Construction
// -------------------------------------------------------------------------
CMessageIdStream(IStream *pStream);
~CMessageIdStream(void) { m_pStream->Release(); }
// -------------------------------------------------------------------------
// IUnknown
// -------------------------------------------------------------------------
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP_(ULONG) AddRef(void) { return ++m_cRef; }
STDMETHODIMP_(ULONG) Release(void) {
if (0 != --m_cRef)
return m_cRef;
delete this;
return 0;
}
// -------------------------------------------------------------------------
// IStream Not implemented Methods
// -------------------------------------------------------------------------
STDMETHODIMP Stat(STATSTG *, DWORD) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP Write(const void *, ULONG, ULONG *) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP SetSize(ULARGE_INTEGER) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP CopyTo(LPSTREAM, ULARGE_INTEGER, ULARGE_INTEGER *, ULARGE_INTEGER *) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP Commit(DWORD) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP Revert(void) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP Clone(LPSTREAM *) { Assert(FALSE); return E_NOTIMPL; }
STDMETHODIMP Read(LPVOID pv, ULONG cbWanted, ULONG *pcbRead);
STDMETHODIMP Seek(LARGE_INTEGER liMove, DWORD dwOrigin, ULARGE_INTEGER *pulNew);
// -------------------------------------------------------------------------
// CMessageIdStream - Returns the length of the messageid
// -------------------------------------------------------------------------
ULONG CchMessageId(void) { return m_cchMessageId; }
private:
IStream *m_pStream;
CHAR m_szMessageId[512];
ULONG m_cchMessageId;
ULONG m_cbIndex;
ULONG m_cRef;
};
#endif // __SMTPTASK_H