| OLD | NEW |
| (Empty) |
| 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 } | |
| OLD | NEW |