#ifndef _CLSHNDLR_HXX_ #define _CLSHNDLR_HXX_ enum INSTALLSTATE { installingNone, installingDone, installingBoth, installingDocObject, installingHandler }; class CClassInstallFilterSink; class CInstallBindInfo : public IOInetBindInfo { public: // IUnknown methods STDMETHODIMP QueryInterface(REFIID iid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IOInetBindInfo methods STDMETHODIMP GetBindInfo(DWORD *grfBINDF, BINDINFO * pbindinfo); STDMETHODIMP GetBindString(ULONG ulStringType, LPOLESTR *ppwzStr, ULONG cEl, ULONG *pcElFetched); CInstallBindInfo(); ~CInstallBindInfo(); private: DWORD _CRefs; }; class CClassInstallFilter : public IOInetProtocol ,public IOInetProtocolSink ,public IServiceProvider ,public IInternetHostSecurityManager { friend class CClassInstallFilterSink; public: CClassInstallFilter(); ~CClassInstallFilter(); // IUnknown methods STDMETHODIMP QueryInterface(REFIID iid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); //IOInetProtocol methods STDMETHODIMP Start(LPCWSTR szUrl,IOInetProtocolSink *pProtSink, IOInetBindInfo *pOIBindInfo,DWORD grfSTI,DWORD_PTR dwReserved); STDMETHODIMP Continue(PROTOCOLDATA *pStateInfo); STDMETHODIMP Abort(HRESULT hrReason,DWORD dwOptions); STDMETHODIMP Terminate(DWORD dwOptions); STDMETHODIMP Suspend(); STDMETHODIMP Resume(); STDMETHODIMP Read(void *pv,ULONG cb,ULONG *pcbRead); STDMETHODIMP Seek(LARGE_INTEGER dlibMove,DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition); STDMETHODIMP LockRequest(DWORD dwOptions); STDMETHODIMP UnlockRequest(); // IOInetProtocolSink methods STDMETHODIMP Switch(PROTOCOLDATA *pStateInfo); STDMETHODIMP ReportProgress(ULONG ulStatusCode, LPCWSTR szStatusText); STDMETHODIMP ReportData(DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax); STDMETHODIMP ReportResult(HRESULT hrResult, DWORD dwError, LPCWSTR wzResult); // IServiceProvider STDMETHODIMP QueryService(REFGUID rsid, REFIID riid, void ** ppvObj); INSTALLSTATE GetInstallState() { return _state; }; void SetInstallState(INSTALLSTATE state) { _state = state; }; // IInternetHostSecurityManager STDMETHODIMP GetSecurityId(BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD_PTR dwReserved); STDMETHODIMP ProcessUrlAction(DWORD dwAction, BYTE *pPolicy, DWORD cbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwFlags, DWORD dwReserved); STDMETHODIMP QueryCustomPolicy(REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext, DWORD dwReserved); private: HRESULT InstallerReportResult(HRESULT hrResult, DWORD dwError, LPCWSTR wzResult); CClassInstallFilterSink* _pInstallSink; IOInetProtocolSink* _pProtSnk; IOInetProtocol* _pCDLnetProtocol; IOInetProtocol* _pProt; LPWSTR _pwzCDLURL; INSTALLSTATE _state; BOOL _bAddRef; DWORD _grfBSCF; ULONG _ulProgress; ULONG _ulProgressMax; DWORD _dwTotalSize; // cached ReportData if main DocObject finishes downloading before install handler BOOL _fDocObjectDone; DWORD _hrResult; DWORD _dwError; LPWSTR _wzResult; BOOL _fReportResult; DWORD _CRefs; LPWSTR _pwzUrl; LPWSTR _pwzClsId; LPWSTR _pwzMime; WCHAR _pwzDocBase[INTERNET_MAX_URL_LENGTH]; IInternetSecurityManager *_pSecMgr; }; class CClassInstallFilterSink : public IOInetProtocolSink ,public IServiceProvider { public: // IUnknown methods STDMETHODIMP QueryInterface(REFIID iid, void **ppvObj); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IOInetProtocolSink methods STDMETHODIMP Switch(PROTOCOLDATA *pStateInfo); STDMETHODIMP ReportProgress(ULONG ulStatusCode, LPCWSTR szStatusText); STDMETHODIMP ReportData( DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax); STDMETHODIMP ReportResult(HRESULT hrResult, DWORD dwError, LPCWSTR wzResult); // IServiceProvider STDMETHODIMP QueryService(REFGUID rsid, REFIID riid, void ** ppvObj); CClassInstallFilterSink(CClassInstallFilter *pInstallFilter); ~CClassInstallFilterSink(); private: CClassInstallFilter *_pInstallFilter; DWORD _dwRef; BOOL _bDone; }; #endif // _CLSHNDLR_HXX_