Windows2003-3790/inetcore/urlmon/trans/cdldelg.cxx
2020-09-30 16:53:55 +02:00

911 lines
21 KiB
C++

//+---------------------------------------------------------------------------
//
// 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;
}