107 lines
3 KiB
C
107 lines
3 KiB
C
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 2000
|
||
|
//
|
||
|
// File: cbsc.h
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
#ifndef __TASKUI_CBSC_H
|
||
|
#define __TASKUI_CBSC_H
|
||
|
|
||
|
|
||
|
template <DWORD dwBindFlags=BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE|BINDF_PULLDATA>
|
||
|
class ATL_NO_VTABLE CBindStatusCallback :
|
||
|
public CComObjectRoot,
|
||
|
public IBindStatusCallback
|
||
|
{
|
||
|
private:
|
||
|
BEGIN_COM_MAP(CBindStatusCallback)
|
||
|
COM_INTERFACE_ENTRY(IBindStatusCallback)
|
||
|
END_COM_MAP()
|
||
|
|
||
|
STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pBinding)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHOD(GetPriority)(LONG *pnPriority)
|
||
|
{
|
||
|
if (NULL == pnPriority)
|
||
|
return E_POINTER;
|
||
|
*pnPriority = THREAD_PRIORITY_NORMAL;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHOD(OnLowResource)(DWORD reserved)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHOD(GetBindInfo)(DWORD *pgrfBINDF, BINDINFO *pbindInfo)
|
||
|
{
|
||
|
if (pbindInfo==NULL || pbindInfo->cbSize==0 || pgrfBINDF==NULL)
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
*pgrfBINDF = dwBindFlags; //BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
|
||
|
|
||
|
ULONG cbSize = pbindInfo->cbSize; // remember incoming cbSize
|
||
|
memset(pbindInfo, 0, cbSize); // zero out structure
|
||
|
pbindInfo->cbSize = cbSize; // restore cbSize
|
||
|
pbindInfo->dwBindVerb = BINDVERB_GET; // set verb
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk)
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
static HRESULT Download(BSTR bstrURL, IStream** ppStream)
|
||
|
{
|
||
|
CComObject<CBindStatusCallback<dwBindFlags> > *pbsc;
|
||
|
HRESULT hr = CComObject<CBindStatusCallback<dwBindFlags> >::CreateInstance(&pbsc);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
CComPtr<IMoniker> spMoniker;
|
||
|
hr = CreateURLMoniker(NULL, bstrURL, &spMoniker);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
CComPtr<IBindCtx> spBindCtx;
|
||
|
hr = CreateBindCtx(0, &spBindCtx);
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
hr = RegisterBindStatusCallback(spBindCtx, static_cast<IBindStatusCallback*>(pbsc), 0, 0L);
|
||
|
if (SUCCEEDED(hr))
|
||
|
hr = spMoniker->BindToStorage(spBindCtx, 0, IID_IStream, (void**)ppStream);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
HRESULT BindToURL(BSTR bstrURL, IStream** ppStream)
|
||
|
{
|
||
|
return CBindStatusCallback<>::Download(bstrURL, ppStream);
|
||
|
}
|
||
|
|
||
|
#endif // __TASKUI_CBSC_H
|