Windows-Server-2003/inetcore/urlmon/eapp/clshndlr.hxx

161 lines
4.7 KiB
C++

#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_