|
|
#include <urlmon.h>
#include "cdlbsc.hpp"
#include "resource.h"
CodeDownloadBSC::CodeDownloadBSC( HWND hwnd, HWND hdlg, LPITEMIDLIST pidlUpdate ) { _cRef = 1; _pIBinding = NULL; _hwnd = hwnd; _pidlUpdate = pidlUpdate; _hdlg = hdlg; }
CodeDownloadBSC::~CodeDownloadBSC() { if ( _pidlUpdate ) ILFree( _pidlUpdate ); }
HRESULT CodeDownloadBSC::Abort() { return _pIBinding->Abort(); }
/*
* * IUnknown Methods * */
STDMETHODIMP CodeDownloadBSC::QueryInterface(REFIID riid, void **ppv) { HRESULT hr = E_NOINTERFACE;
*ppv = NULL; if (riid == IID_IUnknown || riid == IID_IBindStatusCallback) { *ppv = (IBindStatusCallback *)this; } else if ( riid == IID_IWindowForBindingUI ) { *ppv = (IWindowForBindingUI *)this; }
if (*ppv != NULL) { ((IUnknown *)*ppv)->AddRef(); hr = S_OK; }
return hr; }
STDMETHODIMP_(ULONG) CodeDownloadBSC::AddRef() { return ++_cRef; }
STDMETHODIMP_(ULONG) CodeDownloadBSC::Release() { if (--_cRef) { return _cRef; } delete this;
return 0; }
/*
* * IBindStatusCallback Methods * */
STDMETHODIMP CodeDownloadBSC::OnStartBinding(DWORD grfBSCOption, IBinding *pib) { if (_pIBinding != NULL) { _pIBinding->Release(); } _pIBinding = pib;
if (_pIBinding != NULL) { _pIBinding->AddRef(); }
return S_OK; }
STDMETHODIMP CodeDownloadBSC::OnStopBinding(HRESULT hresult, LPCWSTR szError) { if ( _hdlg != NULL ) PostMessage(_hdlg, WM_COMMAND, DOWNLOAD_COMPLETE, SUCCEEDED(hresult) ? TRUE : FALSE);
if ( SUCCEEDED(hresult) && _pidlUpdate ) { SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_IDLIST, _pidlUpdate, NULL); SHChangeNotifyHandleEvents(); } return S_OK; }
STDMETHODIMP CodeDownloadBSC::OnObjectAvailable(REFIID riid, IUnknown *punk) { if ( _hdlg != NULL ) PostMessage(_hdlg, WM_COMMAND, DOWNLOAD_COMPLETE, TRUE ); return S_OK; }
STDMETHODIMP CodeDownloadBSC::GetPriority(LONG *pnPriority) { return S_OK; }
STDMETHODIMP CodeDownloadBSC::OnLowResource(DWORD dwReserved) { return S_OK; }
STDMETHODIMP CodeDownloadBSC::OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText) { if ( _hdlg != NULL ) { // convert progress to a percentage - 0->100
LPARAM lprog; if ( ulStatusCode == BINDSTATUS_ENDDOWNLOADDATA ) lprog = 100; else lprog = (ulProgressMax != 0)? (ulProgress * 100) / ulProgressMax : 0; PostMessage(_hdlg, WM_COMMAND, DOWNLOAD_PROGRESS, lprog ); }
return S_OK; }
STDMETHODIMP CodeDownloadBSC::GetBindInfo(DWORD *pgrfBINDF, BINDINFO *pbindInfo) { // *pgrfBINDF |= BINDF_SILENTOPERATION;
return S_OK; }
STDMETHODIMP CodeDownloadBSC::OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed) { return S_OK; }
STDMETHODIMP CodeDownloadBSC::GetWindow( REFGUID rguidReason, HWND __RPC_FAR *phwnd ) { *phwnd = _hwnd; return S_OK; }
|