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.
910 lines
21 KiB
910 lines
21 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: cdldelg.cxx
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 02-20-97 t-alans (Alan Shi) Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include <trans.h>
|
|
#include <wchar.h>
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::CCDLDelegate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CCDLDelegate::CCDLDelegate(CBinding *pCBinding, IBindStatusCallback *pBSC)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
None,
|
|
"CCDLDelegate::CCDLDelegate",
|
|
"this=%#x, %#x, %#x",
|
|
this, pCBinding, pBSC
|
|
));
|
|
|
|
_cRef = 1;
|
|
_pCBinding = pCBinding;
|
|
if (_pCBinding != NULL)
|
|
{
|
|
_pCBinding->AddRef();
|
|
}
|
|
_pBSC = pBSC;
|
|
if (_pBSC != NULL)
|
|
{
|
|
_pBSC->AddRef();
|
|
}
|
|
|
|
DEBUG_LEAVE(0);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::~CCDLDelegate
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CCDLDelegate::~CCDLDelegate()
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
None,
|
|
"CCDLDelegate::~CCDLDelegate",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
if (_pCBinding != NULL)
|
|
{
|
|
_pCBinding->Release();
|
|
}
|
|
if (_pBSC != NULL)
|
|
{
|
|
_pBSC->Release();
|
|
}
|
|
|
|
DEBUG_LEAVE(0);
|
|
}
|
|
|
|
/*
|
|
*
|
|
* IUnknown Methods
|
|
*
|
|
*/
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::QueryInterface
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::QueryInterface(REFIID riid, void **ppv)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IUnknown::QueryInterface",
|
|
"this=%#x, %#x, %#x",
|
|
this, &riid, ppv
|
|
));
|
|
|
|
HRESULT hr = E_NOINTERFACE;
|
|
|
|
*ppv = NULL;
|
|
if (riid == IID_IUnknown || riid == IID_IBindStatusCallback)
|
|
{
|
|
*ppv = (IBindStatusCallback *)this;
|
|
}
|
|
else if (riid == IID_IBinding)
|
|
{
|
|
*ppv = (IBinding *)this;
|
|
}
|
|
else if (riid == IID_IWindowForBindingUI)
|
|
{
|
|
*ppv = (IWindowForBindingUI *)this;
|
|
}
|
|
|
|
if (*ppv != NULL)
|
|
{
|
|
((IUnknown *)*ppv)->AddRef();
|
|
hr = S_OK;
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::AddRef
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP_(ULONG) CCDLDelegate::AddRef()
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Dword,
|
|
"CCDLDelegate::IUnknown::AddRef",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
ULONG ulRet = ++_cRef;
|
|
|
|
DEBUG_LEAVE(ulRet);
|
|
return ulRet;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::Release
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP_(ULONG) CCDLDelegate::Release()
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Dword,
|
|
"CCDLDelegate::IUnknown::Release",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
if (--_cRef)
|
|
{
|
|
DEBUG_LEAVE(_cRef);
|
|
return _cRef;
|
|
}
|
|
delete this;
|
|
|
|
DEBUG_LEAVE(0);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
*
|
|
* IBindStatusCallback Methods
|
|
*
|
|
*/
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::OnStartBinding
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::OnStartBinding(DWORD grfBSCOption, IBinding *pib)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBindStatusCallback::OnStartBinding",
|
|
"this=%#x, %#x, %#x",
|
|
this, grfBSCOption, pib
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
#if 0
|
|
if (_pCBinding != NULL)
|
|
{
|
|
hr = _pCBinding->OnTransNotification(BINDSTATUS_???,
|
|
0, 0, S_OK);
|
|
}
|
|
#endif
|
|
_pBinding = pib;
|
|
if (_pBinding != NULL)
|
|
{
|
|
_pBinding->AddRef();
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::OnStopBinding
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::OnStopBinding(HRESULT hresult, LPCWSTR szError)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBindStatusCallback::OnStopBinding",
|
|
"this=%#x, %#x, %.80wq",
|
|
this, hresult, szError
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
#if 0
|
|
if (_pCBinding != NULL)
|
|
{
|
|
hr = _pCBinding->OnTransNotification(BINDSTATUS_CODEDOWNLOADCOMPLETE,
|
|
0, 0, (LPWSTR)szError, hresult);
|
|
}
|
|
#endif
|
|
if (_pBinding != NULL)
|
|
{
|
|
_pBinding->Release();
|
|
_pBinding = NULL;
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::OnObjectAvailable
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::OnObjectAvailable(REFIID riid, IUnknown *punk)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBindStatusCallback::OnObjectAvailable",
|
|
"this=%#x, %#x, %#x",
|
|
this, &riid, punk
|
|
));
|
|
|
|
DEBUG_LEAVE(S_OK);
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::OnLowResource
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::OnLowResource(DWORD dwReserved)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBindStatusCallback::OnLowResource",
|
|
"this=%#x, %#x",
|
|
this, dwReserved
|
|
));
|
|
|
|
DEBUG_LEAVE(S_OK);
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::OnProgress
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::OnProgress(ULONG ulProgress, ULONG ulProgressMax,
|
|
ULONG ulStatusCode,
|
|
LPCWSTR szStatusText)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBindStatusCallback::OnProgress",
|
|
"this=%#x, %#x, %#x, %#x, %.80wq",
|
|
this, ulProgress, ulProgressMax ulStatusCode, szStatusText
|
|
));
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::GetBindInfo
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::GetBindInfo(DWORD *pgrfBINDF,
|
|
BINDINFO *pbindInfo)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBindStatusCallback::GetBindInfo",
|
|
"this=%#x, %#x, %#x",
|
|
this, pgrfBINDF, pbindInfo
|
|
));
|
|
|
|
*pgrfBINDF |= BINDF_ASYNCSTORAGE;
|
|
*pgrfBINDF |= BINDF_PULLDATA;
|
|
*pgrfBINDF |= BINDF_ASYNCHRONOUS;
|
|
|
|
DEBUG_LEAVE(S_OK);
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::OnDataAvailable
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::OnDataAvailable( DWORD grfBSCF, DWORD dwSize,
|
|
FORMATETC *pformatetc,
|
|
STGMEDIUM *pstgmed )
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBindStatusCallback::OnDataAvailable",
|
|
"this=%#x, %#x, %#x, %#x, %#x",
|
|
this, grfBSCF, dwSize, pformatetc, pstgmed
|
|
));
|
|
|
|
DEBUG_LEAVE(S_OK);
|
|
return S_OK;
|
|
}
|
|
|
|
/*
|
|
*
|
|
* IBinding Methods
|
|
*
|
|
*/
|
|
|
|
// delegates all calls back to URLMon
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::Abort
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::Abort(void)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBinding::Abort",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
HRESULT hr = E_NOTIMPL;
|
|
|
|
if (_pBinding != NULL)
|
|
{
|
|
hr = _pBinding->Abort();
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::Suspend
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::Suspend(void)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBinding::Suspend",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
HRESULT hr = E_NOTIMPL;
|
|
|
|
if (_pBinding != NULL)
|
|
{
|
|
hr = _pBinding->Suspend();
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::Resume
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::Resume(void)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBinding::Resume",
|
|
"this=%#x",
|
|
this
|
|
));
|
|
|
|
HRESULT hr = E_NOTIMPL;
|
|
|
|
if (_pBinding != NULL)
|
|
{
|
|
hr = _pBinding->Resume();
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::SetPriority
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::SetPriority(LONG nPriority)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBinding::SetPriority",
|
|
"this=%#x, %#x",
|
|
this, nPriority
|
|
));
|
|
|
|
HRESULT hr = E_NOTIMPL;
|
|
|
|
if (_pBinding != NULL)
|
|
{
|
|
hr = _pBinding->SetPriority(nPriority);
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::GetPriority
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::GetPriority(LONG *pnPriority)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBinding::GetPriority",
|
|
"this=%#x, %#x",
|
|
this, pnPriority
|
|
));
|
|
|
|
HRESULT hr = E_NOTIMPL;
|
|
|
|
if (_pBinding != NULL)
|
|
{
|
|
hr = _pBinding->GetPriority(pnPriority);
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::GetBindResult
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::GetBindResult(CLSID *pclsidProtocol,
|
|
DWORD *pdwBindResult,
|
|
LPWSTR *pszBindResult,
|
|
DWORD *dwReserved )
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IBinding::GetBindResult",
|
|
"this=%#x, %#x, %#x, %#x, %#x",
|
|
this, pclsidProtocol, pdwBindResult, pszBindResult, dwReserved
|
|
));
|
|
|
|
HRESULT hr = E_NOTIMPL;
|
|
|
|
if (_pBinding != NULL)
|
|
{
|
|
hr = _pBinding->GetBindResult(pclsidProtocol, pdwBindResult,
|
|
pszBindResult, dwReserved);
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|
|
/*
|
|
*
|
|
* IWindowForBindingUI Methods
|
|
*
|
|
*/
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: CCDLDelegate::GetWindow
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP CCDLDelegate::GetWindow(REFGUID rguidReason,
|
|
HWND __RPC_FAR *phwnd)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"CCDLDelegate::IWindowForBindingUI::GetWindow",
|
|
"this=%#x, %#x, %#x",
|
|
this, &rguidReason, phwnd
|
|
));
|
|
|
|
HRESULT hr = S_FALSE;
|
|
IWindowForBindingUI *pWindowForBindingUI = NULL;
|
|
IServiceProvider *pIServiceProvider = NULL;
|
|
|
|
hr = _pBSC->QueryInterface(IID_IWindowForBindingUI,
|
|
(LPVOID *)&pWindowForBindingUI);
|
|
if (FAILED(hr))
|
|
{
|
|
hr = _pBSC->QueryInterface(IID_IServiceProvider,
|
|
(LPVOID *)&pIServiceProvider);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
pIServiceProvider->QueryService(IID_IWindowForBindingUI,
|
|
IID_IWindowForBindingUI,
|
|
(LPVOID *)&pWindowForBindingUI);
|
|
pIServiceProvider->Release();
|
|
}
|
|
}
|
|
|
|
if (pWindowForBindingUI != NULL)
|
|
{
|
|
hr = pWindowForBindingUI->GetWindow(rguidReason, phwnd);
|
|
}
|
|
else
|
|
{
|
|
hr = S_FALSE;
|
|
*phwnd = (HWND)INVALID_HANDLE_VALUE;
|
|
}
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
|
|
}
|
|
|
|
/*
|
|
*
|
|
* Helper API to do code installation
|
|
*
|
|
*/
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Method: AsyncDLCodeInstall
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments:
|
|
//
|
|
//
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 01-27-1997 t-alans (Alan Shi) Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP AsyncDLCodeInstall(CBinding *pCBinding,
|
|
IBindStatusCallback *pIBSC,
|
|
IBinding **ppIBinding,
|
|
CCodeDownloadInfo *pCDLInfo)
|
|
{
|
|
DEBUG_ENTER((DBG_TRANS,
|
|
Hresult,
|
|
"AsyncDLCodeInstall",
|
|
"%#x, %#x, %#x, %#x",
|
|
pCBinding, pIBSC, ppIBinding, pCDLInfo
|
|
));
|
|
|
|
HRESULT hr = E_FAIL;
|
|
CCDLDelegate *pCDLDelegate = NULL;
|
|
IBindCtx *pbc = NULL;
|
|
IMoniker *pIMonikerCDL = NULL;
|
|
IStream *pIStream = NULL;
|
|
WCHAR szDisplayName[3 * (MAX_URL_SIZE + 1)];
|
|
CLSID clsid = CLSID_NULL;
|
|
LPWSTR pszStr = NULL;
|
|
WCHAR pszCodeBase[MAX_URL_SIZE + 1];
|
|
DWORD dwMajorVersion = 0;
|
|
DWORD dwMinorVersion = 0;
|
|
|
|
pCDLDelegate = new CCDLDelegate(pCBinding, pIBSC);
|
|
if (pCDLDelegate == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
goto Exit;
|
|
}
|
|
*ppIBinding = pCDLDelegate;
|
|
|
|
hr = CreateBindCtx(0, &pbc);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = RegisterBindStatusCallback(pbc, pCDLDelegate, NULL, 0);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
pCDLDelegate->Release();
|
|
}
|
|
else
|
|
{
|
|
pbc->Release();
|
|
goto Exit;
|
|
}
|
|
|
|
// AS TODO: Make this smarter...
|
|
|
|
LPWSTR pszPtr = pszCodeBase;
|
|
pCDLInfo->GetCodeBase(&pszPtr);
|
|
pCDLInfo->GetClassID(&clsid);
|
|
pCDLInfo->GetMajorVersion(&dwMajorVersion);
|
|
pCDLInfo->GetMinorVersion(&dwMinorVersion);
|
|
HRESULT succ = StringFromCLSID(clsid, &pszStr);
|
|
swprintf(szDisplayName, L"cdl:codebase=%s;clsid=%s;verMS=%ld;verLS=%ld"
|
|
, pszCodeBase, pszStr, dwMajorVersion, dwMinorVersion);
|
|
if (pszStr != NULL)
|
|
{
|
|
delete pszStr;
|
|
}
|
|
|
|
// assert( strlen( szDisplayName <= 3 * MAX_URL_SIZE ) );
|
|
hr = CreateURLMoniker(NULL, szDisplayName, &pIMonikerCDL);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pIMonikerCDL->BindToStorage(pbc, NULL, IID_IStream,
|
|
(void **)&pIStream);
|
|
pIMonikerCDL->Release();
|
|
}
|
|
|
|
}
|
|
|
|
if (pbc != NULL)
|
|
{
|
|
pbc->Release();
|
|
}
|
|
|
|
Exit:
|
|
|
|
DEBUG_LEAVE(hr);
|
|
return hr;
|
|
}
|
|
|