Index: src/plugin/SinkPolicy.inl |
=================================================================== |
--- a/src/plugin/SinkPolicy.inl |
+++ b/src/plugin/SinkPolicy.inl |
@@ -358,32 +358,38 @@ |
inline HRESULT CustomSinkStartPolicy<Protocol, Sink>::OnStart(LPCWSTR szUrl, |
IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
DWORD grfPI, HANDLE_PTR dwReserved, |
- IInternetProtocol* pTargetProtocol) const |
+ IInternetProtocol* pTargetProtocol) |
{ |
ATLASSERT(pTargetProtocol != 0); |
+ bool handled = false; |
Sink* pSink = GetSink(static_cast<const Protocol*>(this)); |
HRESULT hr = pSink->OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
- dwReserved, pTargetProtocol); |
+ dwReserved, pTargetProtocol, handled); |
CComPtr<IInternetProtocolSink> spSink; |
CComPtr<IInternetBindInfo> spBindInfo; |
if (SUCCEEDED(hr)) |
{ |
- hr = pSink->QueryInterface(IID_IInternetProtocolSink, |
- reinterpret_cast<void**>(&spSink)); |
+ hr = pSink->QueryInterface(IID_IInternetProtocolSink, reinterpret_cast<void**>(&spSink)); |
ATLASSERT(SUCCEEDED(hr) && spSink != 0); |
} |
if (SUCCEEDED(hr)) |
{ |
- hr = pSink->QueryInterface(IID_IInternetBindInfo, |
- reinterpret_cast<void**>(&spBindInfo)); |
+ hr = pSink->QueryInterface(IID_IInternetBindInfo, reinterpret_cast<void**>(&spBindInfo)); |
ATLASSERT(SUCCEEDED(hr) && spBindInfo != 0); |
} |
- if (SUCCEEDED(hr)) |
+ if (SUCCEEDED(hr) && !handled) |
{ |
- hr = pTargetProtocol->Start(szUrl, spSink, spBindInfo, grfPI, |
- dwReserved); |
+ hr = pTargetProtocol->Start(szUrl, spSink, spBindInfo, grfPI, dwReserved); |
+ static_cast<Protocol*>(this)->m_hasOriginalStartCalled = true; |
+ } |
+ if (E_ABORT == hr && pSink->m_blockedInTransaction) |
+ { |
+ static_cast<Protocol*>(this)->m_shouldSupplyCustomContent = true; |
+ pSink->m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"text/html"); |
+ pSink->m_spInternetProtocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION, 0, static_cast<ULONG>(g_blockedByABPPage.size())); |
+ return S_OK; |
} |
return hr; |
} |