Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.0 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 2000
  6. //
  7. // File: cbsc.h
  8. //
  9. //--------------------------------------------------------------------------
  10. #ifndef __TASKUI_CBSC_H
  11. #define __TASKUI_CBSC_H
  12. template <DWORD dwBindFlags=BINDF_ASYNCHRONOUS|BINDF_ASYNCSTORAGE|BINDF_PULLDATA>
  13. class ATL_NO_VTABLE CBindStatusCallback :
  14. public CComObjectRoot,
  15. public IBindStatusCallback
  16. {
  17. private:
  18. BEGIN_COM_MAP(CBindStatusCallback)
  19. COM_INTERFACE_ENTRY(IBindStatusCallback)
  20. END_COM_MAP()
  21. STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pBinding)
  22. {
  23. return S_OK;
  24. }
  25. STDMETHOD(GetPriority)(LONG *pnPriority)
  26. {
  27. if (NULL == pnPriority)
  28. return E_POINTER;
  29. *pnPriority = THREAD_PRIORITY_NORMAL;
  30. return S_OK;
  31. }
  32. STDMETHOD(OnLowResource)(DWORD reserved)
  33. {
  34. return S_OK;
  35. }
  36. STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
  37. {
  38. return S_OK;
  39. }
  40. STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError)
  41. {
  42. return S_OK;
  43. }
  44. STDMETHOD(GetBindInfo)(DWORD *pgrfBINDF, BINDINFO *pbindInfo)
  45. {
  46. if (pbindInfo==NULL || pbindInfo->cbSize==0 || pgrfBINDF==NULL)
  47. return E_INVALIDARG;
  48. *pgrfBINDF = dwBindFlags; //BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
  49. ULONG cbSize = pbindInfo->cbSize; // remember incoming cbSize
  50. memset(pbindInfo, 0, cbSize); // zero out structure
  51. pbindInfo->cbSize = cbSize; // restore cbSize
  52. pbindInfo->dwBindVerb = BINDVERB_GET; // set verb
  53. return S_OK;
  54. }
  55. STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
  56. {
  57. return S_OK;
  58. }
  59. STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk)
  60. {
  61. return S_OK;
  62. }
  63. public:
  64. static HRESULT Download(BSTR bstrURL, IStream** ppStream)
  65. {
  66. CComObject<CBindStatusCallback<dwBindFlags> > *pbsc;
  67. HRESULT hr = CComObject<CBindStatusCallback<dwBindFlags> >::CreateInstance(&pbsc);
  68. if (SUCCEEDED(hr))
  69. {
  70. CComPtr<IMoniker> spMoniker;
  71. hr = CreateURLMoniker(NULL, bstrURL, &spMoniker);
  72. if (SUCCEEDED(hr))
  73. {
  74. CComPtr<IBindCtx> spBindCtx;
  75. hr = CreateBindCtx(0, &spBindCtx);
  76. if (SUCCEEDED(hr))
  77. {
  78. hr = RegisterBindStatusCallback(spBindCtx, static_cast<IBindStatusCallback*>(pbsc), 0, 0L);
  79. if (SUCCEEDED(hr))
  80. hr = spMoniker->BindToStorage(spBindCtx, 0, IID_IStream, (void**)ppStream);
  81. }
  82. }
  83. }
  84. return hr;
  85. }
  86. };
  87. HRESULT BindToURL(BSTR bstrURL, IStream** ppStream)
  88. {
  89. return CBindStatusCallback<>::Download(bstrURL, ppStream);
  90. }
  91. #endif // __TASKUI_CBSC_H