// // Delivery Agents base class #ifndef _DELAGENT_H #define _DELAGENT_H #include "offline.h" #define INET_S_AGENT_BASIC_SUCCESS _HRESULT_TYPEDEF_(0x000C0FFEL) class CDeliveryAgent : public ISubscriptionAgentControl, public IShellPropSheetExt, public IExtractIconA, public IExtractIcon, public ISubscriptionAgentShellExt { private: // Data for our OLE support ULONG m_cRef; #ifdef AGENT_AUTODIAL enum DIALER_STATUS { DIALER_OFFLINE, DIALER_CONNECTING, DIALER_ONLINE }; DIALER_STATUS m_iDialerStatus; #endif enum { FLAG_BUSY =0x00010000, // addrefed ourselves; between begin & end reports FLAG_PAUSED =0x00020000, // We are paused FLAG_OPSTARTED =0x00040000, // We've entered StartOperation }; // Derived agents can use high 8 bits of this field DWORD m_dwAgentFlags; void SendUpdateBegin(); void SendUpdateEnd(); HRESULT ProcessEndItem(ISubscriptionItem *pEndItem); protected: // Upper 16 bits allowable here enum { FLAG_HOSTED =0x00100000, // hosted by another delivery agent FLAG_CHANGESONLY =0x00200000, // We're in "Changes Only" mode FLAG_WAITING_FOR_INCREASED_CACHE = 0x00400000, // Special paused state }; POOEBuf m_pBuf; HPROPSHEETPAGE m_hPage[MAX_WC_AGENT_PAGES]; ISubscriptionAgentEvents *m_pAgentEvents; ISubscriptionItem *m_pSubscriptionItem; SUBSCRIPTIONCOOKIE m_SubscriptionCookie; long m_lSizeDownloadedKB; // Size downloaded in KB SCODE m_scEndStatus; void SendUpdateNone(); // Call from StartOperation if we won't be doing anything void SendUpdateProgress(LPCWSTR pwszURL, long lProgress, long lMax, long lCurSizeKB=-1); BOOL IsAgentFlagSet(int iFlag) { return (m_dwAgentFlags & iFlag); } void ClearAgentFlag(int iFlag) { m_dwAgentFlags &= ~iFlag; } void SetAgentFlag(int iFlag) { m_dwAgentFlags |= iFlag; } HRESULT CheckResponseCode(DWORD dwHttpResponseCode); // Also sets EndStatus. E_ABORT on error. // DIALER_STATUS GetDialerStatus() { return m_iDialerStatus; } void SetEndStatus(SCODE sc) { m_scEndStatus = sc; } virtual ~CDeliveryAgent(); public: CDeliveryAgent(); BOOL GetBusy() { return IsAgentFlagSet(FLAG_BUSY); } BOOL IsPaused() { return IsAgentFlagSet(FLAG_PAUSED); } SCODE GetEndStatus() { return m_scEndStatus; } // IUnknown members STDMETHODIMP QueryInterface(REFIID riid, void **punk); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // ISubscriptionAgentControl members STDMETHODIMP StartUpdate(IUnknown *pItem, IUnknown *punkAdvise); STDMETHODIMP PauseUpdate(DWORD dwFlags); STDMETHODIMP ResumeUpdate(DWORD dwFlags); STDMETHODIMP AbortUpdate(DWORD dwFlags); STDMETHODIMP SubscriptionControl(IUnknown *pItem, DWORD dwControl); // Called on delete // IShellPropSheetExt members STDMETHODIMP AddPages(LPFNADDPROPSHEETPAGE, LPARAM); STDMETHODIMP ReplacePage(UINT, LPFNADDPROPSHEETPAGE, LPARAM); // ISubscriptionAgentShellExt STDMETHODIMP Initialize(SUBSCRIPTIONCOOKIE *pSubscriptionCookie, LPCWSTR pwszURL, LPCWSTR pwszName, SUBSCRIPTIONTYPE subsType); STDMETHODIMP RemovePages(HWND hdlg); STDMETHODIMP SaveSubscription(); STDMETHODIMP URLChange(LPCWSTR pwszNewURL); // IExtractIconA STDMETHODIMP GetIconLocation(UINT uFlags, LPSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags); STDMETHODIMP Extract(LPCSTR pszFile, UINT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize); // IExtractIconT STDMETHODIMP GetIconLocation(UINT uFlags, LPTSTR szIconFile, UINT cchMax, int * piIndex, UINT * pwFlags); STDMETHODIMP Extract(LPCTSTR pszFile, UINT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize); private: // Functions we provide common implementations for HRESULT DoStartDownload(); #ifdef AGENT_AUTODIAL HRESULT NotifyAutoDialer(); HRESULT OnInetOnline(); HRESULT OnInetOffline(); #endif protected: // Virtual functions for our derived classes to override as necessary // We provide implementations which should be called after processing virtual HRESULT AgentPause(DWORD dwFlags); virtual HRESULT AgentResume(DWORD dwFlags); virtual HRESULT AgentAbort(DWORD dwFlags); virtual HRESULT ModifyUpdateEnd(ISubscriptionItem *pEndItem, UINT *puiRes); virtual HRESULT StartOperation(); // connects to internet virtual HRESULT StartDownload() = 0; // we just got connected virtual void CleanUp(); }; #endif // _DELAGENT_H