161 lines
4.6 KiB
C++
161 lines
4.6 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_
|