///////////////////////////////////////////////////////////////////////////// // Copyright (C) 1993-1996 Microsoft Corporation. All Rights Reserved. // // MODULE: ontask.h // // PURPOSE: Defines the Offline News task. // #ifndef __ONTASK_H__ #define __ONTASK_H__ #include "spoolapi.h" #include ///////////////////////////////////////////////////////////////////////////// // Forward references // class CNewsStore; ///////////////////////////////////////////////////////////////////////////// // Types of events we support // typedef struct tagONEVENTINFO { char szGroup[256]; FOLDERID idGroup; DWORD dwFlags; BOOL fMarked; BOOL fIMAP; } ONEVENTINFO; typedef enum tagONTASKSTATE { ONTS_IDLE = 0, // Idle ONTS_CONNECTING, // Waiting for a connect response ONTS_INIT, // Initializing ONTS_HEADERRESP, // Waiting for the header download ONTS_ALLMSGS, // Downloading all messages ONTS_NEWMSGS, // Downloading new messages ONTS_MARKEDMSGS, // Downloading marked messages ONTS_END, // Cleanup ONTS_MAX } ONTASKSTATE; typedef enum tagARTICLESTATE { ARTICLE_GETNEXT, ARTICLE_ONRESP, ARTICLE_END, ARTICLE_MAX } ARTICLESTATE; class COfflineTask; typedef HRESULT (COfflineTask::*PFNONSTATEFUNC)(THIS_ void); typedef HRESULT (COfflineTask::*PFNARTICLEFUNC)(THIS_ void); ///////////////////////////////////////////////////////////////////////////// // class COfflineTask // // Overview: // This object defines and implements the ISpoolerTask interface to handle // offline news functions. This is a separate object from CNewsTask to // provide a logical separation between what needs to be done online versus // what is only done offline in news. // class COfflineTask : public ISpoolerTask, public IStoreCallback, public ITimeoutCallback { public: ///////////////////////////////////////////////////////////////////////// // Constructor, destructor, initialization COfflineTask(); ~COfflineTask(); ///////////////////////////////////////////////////////////////////////// // IUnknown Interface STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj); STDMETHOD_(ULONG, AddRef)(THIS); STDMETHOD_(ULONG, Release)(THIS); ///////////////////////////////////////////////////////////////////////// // ISpoolerTask Interface STDMETHOD(Init)(THIS_ DWORD dwFlags, ISpoolerBindContext *pBindCtx); STDMETHOD(BuildEvents)(THIS_ ISpoolerUI *pSpoolerUI, IImnAccount *pAccount, FOLDERID idFolder); STDMETHOD(Execute)(THIS_ EVENTID eid, DWORD_PTR dwTwinkie); STDMETHOD(CancelEvent)(THIS_ EVENTID eid, DWORD_PTR dwTwinkie); STDMETHOD(ShowProperties)(THIS_ HWND hwndParent, EVENTID eid, DWORD_PTR dwTwinkie); STDMETHOD(GetExtendedDetails)(THIS_ EVENTID eid, DWORD_PTR dwTwinkie, LPSTR *ppszDetails); STDMETHOD(Cancel)(THIS); STDMETHOD(IsDialogMessage)(THIS_ LPMSG pMsg); STDMETHOD(OnFlagsChanged)(THIS_ DWORD dwFlags); ///////////////////////////////////////////////////////////////////////// // 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); STDMETHODIMP GetParentWindow(DWORD dwReserved, HWND *phwndParent); ///////////////////////////////////////////////////////////////////////// // ITimeoutCallback Interface STDMETHODIMP OnTimeoutResponse(TIMEOUTRESPONSE eResponse); private: ///////////////////////////////////////////////////////////////////////// // Window callback and message handling static LRESULT CALLBACK TaskWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); ///////////////////////////////////////////////////////////////////////// // These functions build the event list HRESULT InsertGroups(IImnAccount *pAccount, FOLDERID idFolder); HRESULT InsertAllGroups(FOLDERID idParent, IImnAccount *pAccount, BOOL fIMAP); ///////////////////////////////////////////////////////////////////////// // State Machine Stuff void NextState(void); HRESULT Download_Init(void); HRESULT Download_AllMsgs(void); HRESULT Download_NewMsgs(void); HRESULT Download_MarkedMsgs(void); HRESULT Download_Done(void); HRESULT Article_Init(MESSAGEIDLIST *pList); HRESULT Article_GetNext(void); HRESULT Article_OnResp(WPARAM wParam, LPARAM lParam); HRESULT Article_OnError(WPARAM wParam, LPARAM lParam); HRESULT Article_Done(void); ///////////////////////////////////////////////////////////////////////// // Utility functions void SetGeneralProgress(const TCHAR *pFmt, ...); void SetSpecificProgress(const TCHAR *pFmt, ...); void InsertError(const TCHAR *pFmt, ...); private: ///////////////////////////////////////////////////////////////////////// // Private member data ULONG m_cRef; // State BOOL m_fInited; DWORD m_dwFlags; ONTASKSTATE m_state; ARTICLESTATE m_as; EVENTID m_eidCur; ONEVENTINFO *m_pInfo; char m_szAccount[CCHMAX_ACCOUNT_NAME]; char m_szAccountId[CCHMAX_ACCOUNT_NAME]; FOLDERID m_idAccount; DWORD m_cEvents; BOOL m_fDownloadErrors; BOOL m_fFailed; DWORD m_fNewHeaders; BOOL m_fCancel; // Spooler Interfaces ISpoolerBindContext *m_pBindCtx; ISpoolerUI *m_pUI; IMessageFolder *m_pFolder; // Windows HWND m_hwnd; // State table static const PFNONSTATEFUNC m_rgpfnState[ONTS_MAX]; static const PFNARTICLEFUNC m_rgpfnArticle[ARTICLE_MAX]; // Used during event execution DWORD m_dwLast; DWORD m_dwPrev; DWORD m_cDownloaded; DWORD m_cCur; DWORD_PTR m_dwPrevHigh; DWORD m_dwNewInboxMsgs; LPMESSAGEIDLIST m_pList; // Callback HTIMEOUT m_hTimeout; IOperationCancel *m_pCancel; STOREOPERATIONTYPE m_tyOperation; }; #endif // __ONTASK_H__