Home | History | Annotate | Download | only in chrome_frame
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome_frame/bind_status_callback_impl.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/strings/string_util.h"
      9 #include "base/strings/stringprintf.h"
     10 #include "base/threading/platform_thread.h"
     11 
     12 BSCBImpl::BSCBImpl() {
     13   DVLOG(1) << __FUNCTION__ << me();
     14 }
     15 
     16 BSCBImpl::~BSCBImpl() {
     17   DVLOG(1) << __FUNCTION__ << me();
     18 }
     19 
     20 std::string BSCBImpl::me() {
     21   return base::StringPrintf(" obj=0x%08X", static_cast<BSCBImpl*>(this));
     22 }
     23 
     24 HRESULT BSCBImpl::DelegateQI(void* obj, REFIID iid, void** ret, DWORD cookie) {
     25   BSCBImpl* me = reinterpret_cast<BSCBImpl*>(obj);
     26   HRESULT hr = E_NOINTERFACE;
     27   if (me->delegate_)
     28     hr = me->delegate_.QueryInterface(iid, ret);
     29   return hr;
     30 }
     31 
     32 void BSCBImpl::Initialize(IBindStatusCallback* original) {
     33   DCHECK(!delegate_);
     34   delegate_ = original;
     35 }
     36 
     37 HRESULT BSCBImpl::AttachToBind(IBindCtx* bind_ctx) {
     38   HRESULT hr = S_OK;
     39   hr = ::RegisterBindStatusCallback(bind_ctx, this, delegate_.Receive(), 0);
     40   if (SUCCEEDED(hr)) {
     41     bind_ctx_ = bind_ctx;
     42   }
     43 
     44   return hr;
     45 }
     46 
     47 HRESULT BSCBImpl::ReleaseBind() {
     48   // AddRef ourselves while we release these objects as we might
     49   // perish during this operation.
     50   AddRef();
     51 
     52   HRESULT hr = S_OK;
     53   if (bind_ctx_) {
     54     hr = ::RevokeBindStatusCallback(bind_ctx_, this);
     55   }
     56   delegate_.Release();
     57   bind_ctx_.Release();
     58 
     59   Release();
     60 
     61   return hr;
     62 }
     63 
     64 // IServiceProvider
     65 HRESULT BSCBImpl::QueryService(REFGUID service, REFIID iid, void** object) {
     66   HRESULT hr = E_NOINTERFACE;
     67   if (delegate_) {
     68     base::win::ScopedComPtr<IServiceProvider> svc;
     69     svc.QueryFrom(delegate_);
     70     if (svc) {
     71       hr = svc->QueryService(service, iid, object);
     72     }
     73   }
     74   return hr;
     75 }
     76 
     77 // IBindStatusCallback
     78 HRESULT BSCBImpl::OnStartBinding(DWORD reserved, IBinding* binding) {
     79   DVLOG(1) << __FUNCTION__ << me()
     80            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
     81   HRESULT hr = S_OK;
     82   if (delegate_)
     83     hr = delegate_->OnStartBinding(reserved, binding);
     84   return hr;
     85 }
     86 
     87 HRESULT BSCBImpl::GetPriority(LONG* priority) {
     88   DVLOG(1) << __FUNCTION__ << me()
     89            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
     90   HRESULT hr = S_OK;
     91   if (delegate_)
     92     hr = delegate_->GetPriority(priority);
     93   return hr;
     94 }
     95 
     96 HRESULT BSCBImpl::OnLowResource(DWORD reserved) {
     97   DVLOG(1) << __FUNCTION__ << me()
     98            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
     99   HRESULT hr = S_OK;
    100   if (delegate_)
    101     hr = delegate_->OnLowResource(reserved);
    102   return hr;
    103 }
    104 
    105 HRESULT BSCBImpl::OnProgress(ULONG progress, ULONG progress_max,
    106                               ULONG status_code, LPCWSTR status_text) {
    107   DVLOG(1) << __FUNCTION__ << me()
    108            << base::StringPrintf(" status=%i tid=%i %ls", status_code,
    109                                  base::PlatformThread::CurrentId(),
    110                                  status_text);
    111   HRESULT hr = S_OK;
    112   if (delegate_)
    113     delegate_->OnProgress(progress, progress_max, status_code, status_text);
    114   return hr;
    115 }
    116 
    117 HRESULT BSCBImpl::OnStopBinding(HRESULT hresult, LPCWSTR error) {
    118   DVLOG(1) << __FUNCTION__ << me()
    119            << base::StringPrintf(" hr=0x%08X '%ls' tid=%i", hresult, error,
    120                                  base::PlatformThread::CurrentId());
    121   HRESULT hr = S_OK;
    122   if (delegate_)
    123     delegate_->OnStopBinding(hresult, error);
    124   return hr;
    125 }
    126 
    127 HRESULT BSCBImpl::GetBindInfo(DWORD* bindf, BINDINFO* bind_info) {
    128   DVLOG(1) << __FUNCTION__ << me()
    129            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
    130   HRESULT hr = S_OK;
    131   if (delegate_)
    132     delegate_->GetBindInfo(bindf, bind_info);
    133   return hr;
    134 }
    135 
    136 HRESULT BSCBImpl::OnDataAvailable(DWORD bscf, DWORD size,
    137                                    FORMATETC* format_etc, STGMEDIUM* stgmed) {
    138   DVLOG(1) << __FUNCTION__ << me()
    139            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
    140   HRESULT hr = S_OK;
    141   if (delegate_)
    142     hr = delegate_->OnDataAvailable(bscf, size, format_etc, stgmed);
    143   return hr;
    144 }
    145 
    146 HRESULT BSCBImpl::OnObjectAvailable(REFIID iid, IUnknown* unk) {
    147   DVLOG(1) << __FUNCTION__ << me()
    148            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
    149   HRESULT hr = S_OK;
    150   if (delegate_)
    151     delegate_->OnObjectAvailable(iid, unk);
    152   return hr;
    153 }
    154 
    155 // IBindStatusCallbackEx
    156 HRESULT BSCBImpl::GetBindInfoEx(DWORD* bindf, BINDINFO* bind_info,
    157                                 DWORD* bindf2, DWORD* reserved) {
    158   DVLOG(1) << __FUNCTION__ << me()
    159            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
    160   HRESULT hr = S_OK;
    161   if (delegate_) {
    162     base::win::ScopedComPtr<IBindStatusCallbackEx> bscbex;
    163     bscbex.QueryFrom(delegate_);
    164     if (bscbex)
    165       hr = bscbex->GetBindInfoEx(bindf, bind_info, bindf2, reserved);
    166   }
    167   return hr;
    168 }
    169 
    170 HRESULT BSCBImpl::BeginningTransaction(LPCWSTR url, LPCWSTR headers,
    171                                        DWORD reserved,
    172                                        LPWSTR* additional_headers) {
    173   DVLOG(1) << __FUNCTION__ << me()
    174            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
    175 
    176   HRESULT hr = S_OK;
    177   if (delegate_) {
    178     base::win::ScopedComPtr<IHttpNegotiate> http_negotiate;
    179     http_negotiate.QueryFrom(delegate_);
    180     if (http_negotiate) {
    181       hr = http_negotiate->BeginningTransaction(url, headers, reserved,
    182                                                 additional_headers);
    183     }
    184   }
    185 
    186   DLOG_IF(ERROR, FAILED(hr)) << __FUNCTION__;
    187   return hr;
    188 }
    189 
    190 HRESULT BSCBImpl::OnResponse(DWORD response_code, LPCWSTR response_headers,
    191                              LPCWSTR request_headers,
    192                              LPWSTR* additional_headers) {
    193   DVLOG(1) << __FUNCTION__ << me()
    194            << base::StringPrintf(" tid=%i", base::PlatformThread::CurrentId());
    195 
    196   HRESULT hr = S_OK;
    197   if (delegate_) {
    198     base::win::ScopedComPtr<IHttpNegotiate> http_negotiate;
    199     http_negotiate.QueryFrom(delegate_);
    200     if (http_negotiate) {
    201       hr = http_negotiate->OnResponse(response_code, response_headers,
    202                                       request_headers, additional_headers);
    203     }
    204   }
    205   return hr;
    206 }
    207 
    208 HRESULT BSCBImpl::GetRootSecurityId(BYTE* security_id, DWORD* security_id_size,
    209                                     DWORD_PTR reserved) {
    210   HRESULT hr = S_OK;
    211   if (delegate_) {
    212     base::win::ScopedComPtr<IHttpNegotiate2> http_negotiate;
    213     http_negotiate.QueryFrom(delegate_);
    214     if (http_negotiate) {
    215       hr = http_negotiate->GetRootSecurityId(security_id, security_id_size,
    216                                              reserved);
    217     }
    218   }
    219   return hr;
    220 }
    221 
    222 HRESULT BSCBImpl::GetSerializedClientCertContext(BYTE** cert,
    223                                                  DWORD* cert_size) {
    224   HRESULT hr = S_OK;
    225   if (delegate_) {
    226     base::win::ScopedComPtr<IHttpNegotiate3> http_negotiate;
    227     http_negotiate.QueryFrom(delegate_);
    228     if (http_negotiate) {
    229       return http_negotiate->GetSerializedClientCertContext(cert, cert_size);
    230     }
    231   }
    232   return hr;
    233 }
    234