// --------------------------------------------------------------------------------
// h t t p t a s k . h
// Copyright (c)1998 Microsoft Corporation, All Rights Reserved
// Greg S. Friedman
// --------------------------------------------------------------------------------
#ifndef __HTTPTASK_H
#define __HTTPTASK_H

// --------------------------------------------------------------------------------
// Depends
// --------------------------------------------------------------------------------
#include "spoolapi.h"
#include "srtarray.h"
#include "taskutil.h"

// --------------------------------------------------------------------------------
// State
// --------------------------------------------------------------------------------
#define HTTPSTATE_CANCELED      FLAG01
#define HTTPSTATE_EVENTSUCCESS  FLAG02  // one or more events succeeded

// --------------------------------------------------------------------------------
// HTTPEVENTINFO
// --------------------------------------------------------------------------------
typedef struct tagHTTPEVENTINFO {
    DWORD               dwFlags;                // Flags
    MESSAGEID           idMessage;              // Store Information
    BOOL                fComplete;              // has event been completed
    DWORD               cbSentTotal;            // running total of sent bytes
} HTTPEVENTINFO, *LPHTTPEVENTINFO;

// --------------------------------------------------------------------------------
// CHTTPTask
// --------------------------------------------------------------------------------
class CHTTPTask: public ISpoolerTask, IHTTPMailCallback
{
public:
    // ----------------------------------------------------------------------------
    // CHTTPTask
    // ----------------------------------------------------------------------------
    CHTTPTask(void);
private:
    ~CHTTPTask(void);
    
public:
    // ---------------------------------------------------------------------------
    // 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);

    // ----------------------------------------------------------------------------
    // ITransportCallback methods
    // ----------------------------------------------------------------------------
    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             pIxpResult,
            IInternetTransport     *pTransport);

    STDMETHODIMP OnProgress(
            DWORD                   dwIncrement,
            DWORD                   dwCurrent,
            DWORD                   dwMaximum,
            IInternetTransport     *pTransport);

    STDMETHODIMP OnCommand(
            CMDTYPE                 cmdtype,
            LPSTR                   pszLine,
            HRESULT                 hrResponse,
            IInternetTransport     *pTransport);

    STDMETHODIMP OnTimeout(
            DWORD                  *pdwTimeout,
            IInternetTransport     *pTransport);

    // ----------------------------------------------------------------------------
    // IHTTPMailCallback methods
    // ----------------------------------------------------------------------------
    STDMETHODIMP OnResponse(LPHTTPMAILRESPONSE pResponse);

    STDMETHODIMP GetParentWindow(HWND *phwndParent);

private:
    // ---------------------------------------------------------------------------
    // Private Methods
    // ---------------------------------------------------------------------------
    void _Reset(void);

    TASKRESULTTYPE _CatchResult(HRESULT hr);
    TASKRESULTTYPE _CatchResult(LPIXPRESULT pResult);

    HRESULT _HrAppendOutboxMessage(LPCSTR pszAccount, LPMESSAGEINFO pmi);
    HRESULT _HrCreateSendProps(IMimeMessage *pMessage, LPSTR *ppszFrom, LPHTTPTARGETLIST *ppTargets);
    HRESULT _HrCreateHeaderStream(IMimeMessage *pMessage, IStream **ppStream);
    HRESULT _HrOpenMessage(MESSAGEID idMessage, IMimeMessage **ppMessage);
    HRESULT _HrPostCurrentMessage(void);
    HRESULT _HrExecuteSend(EVENTID eid, DWORD_PTR dwTwinkie);
    HRESULT _HrAdoptSendMsgUrl(LPSTR pszSendMsgUrl);
    HRESULT _HrFinishCurrentEvent(HRESULT hrResult, LPSTR pszLocationUrl);
    HRESULT _HrStartNextEvent(void);
    HRESULT _OnDisconnectComplete(void);
    void    _UpdateSendMessageProgress(LPHTTPMAILRESPONSE pResponse);
    void    _DoProgress(void);

private:
    // ---------------------------------------------------------------------------
    // Private Data
    // ---------------------------------------------------------------------------
    LONG                    m_cRef;             // Reference counting
    CRITICAL_SECTION        m_cs;               // thread safety
    DWORD                   m_dwFlags;          // flags
    DWORD                   m_dwState;          // state flags
    DWORD                   m_cbTotal;          // total bytes to send
    DWORD                   m_cbSent;           // number of bytes sent
    DWORD                   m_cbStart;          // number of bytes sent at event start
    long                    m_cCompleted;       // number of messages successfully sent
    WORD                    m_wProgress;        // Current progress index
    ISpoolerBindContext     *m_pSpoolCtx;       // spooler bind context
    IImnAccount             *m_pAccount;        // account
    IMessageFolder          *m_pOutbox;         // The outbox
    IMessageFolder          *m_pSentItems;      // Sent items folder
    CSortedArray            *m_psaEvents;       // array of queued events
    long                    m_iEvent;           // Current Event
    LPSTR                   m_pszSubject;       // subject of current message
    IStream                 *m_pBody;            // current message body
    IHTTPMailTransport      *m_pTransport;      // http data transport
    ISpoolerUI              *m_pUI;             // SpoolerUI
    EVENTID                 m_idSendEvent;      // EventId for message send
    INETSERVER              m_rServer;          // Server information
    LPSTR                   m_pszAccountId;     // Account Id
    LPSTR                   m_pszSendMsgUrl;    // Url to post outbound messages to
};

#endif // __HTTPTASK_H