15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome_frame/bind_status_callback_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BSCBImpl::BSCBImpl() {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me();
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BSCBImpl::~BSCBImpl() {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me();
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string BSCBImpl::me() {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::StringPrintf(" obj=0x%08X", static_cast<BSCBImpl*>(this));
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::DelegateQI(void* obj, REFIID iid, void** ret, DWORD cookie) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BSCBImpl* me = reinterpret_cast<BSCBImpl*>(obj);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = E_NOINTERFACE;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (me->delegate_)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = me->delegate_.QueryInterface(iid, ret);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BSCBImpl::Initialize(IBindStatusCallback* original) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!delegate_);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_ = original;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::AttachToBind(IBindCtx* bind_ctx) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hr = ::RegisterBindStatusCallback(bind_ctx, this, delegate_.Receive(), 0);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (SUCCEEDED(hr)) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bind_ctx_ = bind_ctx;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::ReleaseBind() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AddRef ourselves while we release these objects as we might
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // perish during this operation.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddRef();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bind_ctx_) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = ::RevokeBindStatusCallback(bind_ctx_, this);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate_.Release();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bind_ctx_.Release();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Release();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IServiceProvider
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::QueryService(REFGUID service, REFIID iid, void** object) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = E_NOINTERFACE;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::ScopedComPtr<IServiceProvider> svc;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    svc.QueryFrom(delegate_);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (svc) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = svc->QueryService(service, iid, object);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IBindStatusCallback
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::OnStartBinding(DWORD reserved, IBinding* binding) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = delegate_->OnStartBinding(reserved, binding);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::GetPriority(LONG* priority) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = delegate_->GetPriority(priority);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::OnLowResource(DWORD reserved) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = delegate_->OnLowResource(reserved);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::OnProgress(ULONG progress, ULONG progress_max,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ULONG status_code, LPCWSTR status_text) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" status=%i tid=%i %ls", status_code,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::PlatformThread::CurrentId(),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 status_text);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnProgress(progress, progress_max, status_code, status_text);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::OnStopBinding(HRESULT hresult, LPCWSTR error) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" hr=0x%08X '%ls' tid=%i", hresult, error,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 base::PlatformThread::CurrentId());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnStopBinding(hresult, error);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::GetBindInfo(DWORD* bindf, BINDINFO* bind_info) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->GetBindInfo(bindf, bind_info);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::OnDataAvailable(DWORD bscf, DWORD size,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   FORMATETC* format_etc, STGMEDIUM* stgmed) {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hr = delegate_->OnDataAvailable(bscf, size, format_etc, stgmed);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::OnObjectAvailable(REFIID iid, IUnknown* unk) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->OnObjectAvailable(iid, unk);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IBindStatusCallbackEx
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::GetBindInfoEx(DWORD* bindf, BINDINFO* bind_info,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                DWORD* bindf2, DWORD* reserved) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::ScopedComPtr<IBindStatusCallbackEx> bscbex;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bscbex.QueryFrom(delegate_);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bscbex)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = bscbex->GetBindInfoEx(bindf, bind_info, bindf2, reserved);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::BeginningTransaction(LPCWSTR url, LPCWSTR headers,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       DWORD reserved,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       LPWSTR* additional_headers) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::ScopedComPtr<IHttpNegotiate> http_negotiate;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_negotiate.QueryFrom(delegate_);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (http_negotiate) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = http_negotiate->BeginningTransaction(url, headers, reserved,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                additional_headers);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DLOG_IF(ERROR, FAILED(hr)) << __FUNCTION__;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::OnResponse(DWORD response_code, LPCWSTR response_headers,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             LPCWSTR request_headers,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             LPWSTR* additional_headers) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << me()
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::ScopedComPtr<IHttpNegotiate> http_negotiate;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_negotiate.QueryFrom(delegate_);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (http_negotiate) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = http_negotiate->OnResponse(response_code, response_headers,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      request_headers, additional_headers);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::GetRootSecurityId(BYTE* security_id, DWORD* security_id_size,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    DWORD_PTR reserved) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::ScopedComPtr<IHttpNegotiate2> http_negotiate;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_negotiate.QueryFrom(delegate_);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (http_negotiate) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      hr = http_negotiate->GetRootSecurityId(security_id, security_id_size,
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             reserved);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BSCBImpl::GetSerializedClientCertContext(BYTE** cert,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 DWORD* cert_size) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HRESULT hr = S_OK;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::win::ScopedComPtr<IHttpNegotiate3> http_negotiate;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    http_negotiate.QueryFrom(delegate_);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (http_negotiate) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return http_negotiate->GetSerializedClientCertContext(cert, cert_size);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return hr;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
234