- add sources.
[platform/framework/web/crosswalk.git] / src / chrome_frame / bind_status_callback_impl.cc
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 }