///////////////////////////////////////////////////////////////////////////// // Copyright (C) 1993-1998 Microsoft Corporation. All Rights Reserved. // // MODULE: watchtsk.h // // PURPOSE: Defines the spooler task that is responsible for checking // for watched messages. // #pragma once #include "spoolapi.h" #include "storutil.h" ///////////////////////////////////////////////////////////////////////////// // States for the state machine // typedef enum tagWATCHTASKSTATE { WTS_IDLE = 0, WTS_CONNECTING, WTS_INIT, WTS_NEXTFOLDER, WTS_RESP, WTS_END, WTS_MAX } WATCHTASKSTATE; class CWatchTask; typedef HRESULT (CWatchTask::*PFNWSTATEFUNC)(THIS_ void); ///////////////////////////////////////////////////////////////////////////// // class CWatchTask // // Overview: // This object is responsible for checking folders on the server for new // messages that might be part of a conversation the user is watching. If // one of these messages is found, then that message is downloaded into the // users's store and the user is notified. // class CWatchTask : public ISpoolerTask, public IStoreCallback, public ITimeoutCallback { public: ///////////////////////////////////////////////////////////////////////// // Constructor, destructor, initialization // CWatchTask(); ~CWatchTask(); ///////////////////////////////////////////////////////////////////////// // IUnknown Interface // STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR* ppvObj); STDMETHOD_(ULONG, AddRef)(void); STDMETHOD_(ULONG, Release)(void); ///////////////////////////////////////////////////////////////////////// // ISpoolerTask Interface // 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); STDMETHODIMP GetExtendedDetails(EVENTID eid, DWORD_PTR dwTwinkie, LPSTR *ppszDetails); STDMETHODIMP Cancel(void); STDMETHODIMP IsDialogMessage(LPMSG pMsg); STDMETHODIMP OnFlagsChanged(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); protected: ///////////////////////////////////////////////////////////////////////// // Window callback and message handling // static LRESULT CALLBACK _TaskWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); ///////////////////////////////////////////////////////////////////////// // General stuff // void CWatchTask::_NextState(void); BOOL _ChildFoldersHaveWatched(FOLDERID id); BOOL _FolderContainsWatched(FOLDERID id); ///////////////////////////////////////////////////////////////////////// // State Machine functions, public but don't call 'em directly. // public: HRESULT _Watch_Init(void); HRESULT _Watch_NextFolder(void); HRESULT _Watch_Done(void); private: ///////////////////////////////////////////////////////////////////////// // Private data // ULONG m_cRef; // Reference Count // State BOOL m_fInited; // TRUE if we've had our Init() member called DWORD m_dwFlags; // Execution flags from the spooler engine TCHAR m_szAccount[256]; TCHAR m_szAccountId[256]; FOLDERID m_idAccount; EVENTID m_eidCur; // The current executing event // Interfaces ISpoolerBindContext *m_pBindCtx; // Interface to communicate with the spooler engine ISpoolerUI *m_pUI; // Interface to communicate with the UI IImnAccount *m_pAccount; // Interface of the account we're checking IMessageServer *m_pServer; // Interface of the server object we're using IOperationCancel *m_pCancel; // Interface we use to cancel the current server op // Stuff FOLDERID m_idFolderCheck;// If the user just want's us to check one folder FOLDERID *m_rgidFolders; // Array of all of the folders we need to check DWORD m_cFolders; // Number of folders in m_rgidFolders HWND m_hwnd; // Handle of our window HTIMEOUT m_hTimeout; // Handle of the timeout dialog DWORD m_cMsgs; // Number of watched messages downloaded // State Machine goo DWORD m_state; BOOL m_fCancel; // TRUE if the user has pressed the Cancel button DWORD m_cCurFolder; // Current folder being checked. Index's into m_rgidFolders; DWORD m_cFailed; // Number of folders that could not be checked STOREOPERATIONTYPE m_tyOperation; // Current operation type };