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 #ifndef CHROME_FRAME_BIND_STATUS_CALLBACK_IMPL_H_ 6 #define CHROME_FRAME_BIND_STATUS_CALLBACK_IMPL_H_ 7 8 #include <atlbase.h> 9 #include <atlcom.h> 10 #include <string> 11 #include <urlmon.h> 12 13 #include "base/win/scoped_comptr.h" 14 #include "chrome_frame/utils.h" 15 16 // A generic base class for IBindStatus callback implementation. 17 // If initialized with delegate, it will hand over all the calls 18 // to the delegate. This can also be used as a base class to 19 // provide the base implementation by not providing any delegate. 20 class BSCBImpl 21 : public CComObjectRootEx<CComMultiThreadModel>, 22 public IBindStatusCallbackEx, 23 public IHttpNegotiate3, 24 public IServiceProvider { 25 public: 26 BSCBImpl(); 27 ~BSCBImpl(); 28 29 BEGIN_COM_MAP(BSCBImpl) 30 COM_INTERFACE_ENTRY(IBindStatusCallback) 31 COM_INTERFACE_ENTRY(IHttpNegotiate) 32 COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IBindStatusCallbackEx) 33 COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IHttpNegotiate2) 34 COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IHttpNegotiate3) 35 COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IServiceProvider) 36 COM_INTERFACE_ENTRY_FUNC_BLIND(0, DelegateQI) 37 END_COM_MAP() 38 39 static STDMETHODIMP DelegateQI(void* obj, REFIID iid, void** ret, 40 DWORD cookie); 41 42 void Initialize(IBindStatusCallback* original); 43 HRESULT AttachToBind(IBindCtx* original); 44 HRESULT ReleaseBind(); 45 46 // For the COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS macro. 47 IBindStatusCallback* delegate() const { 48 return delegate_; 49 } 50 51 IBindCtx* bind_ctx() const { 52 return bind_ctx_; 53 } 54 55 // IServiceProvider 56 STDMETHOD(QueryService)(REFGUID service, REFIID iid, void** object); 57 58 // IBindStatusCallback 59 STDMETHOD(OnStartBinding)(DWORD reserved, IBinding* binding); 60 STDMETHOD(GetPriority)(LONG* priority); 61 STDMETHOD(OnLowResource)(DWORD reserved); 62 STDMETHOD(OnProgress)(ULONG progress, ULONG progress_max, ULONG status_code, 63 LPCWSTR status_text); 64 STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR error); 65 STDMETHOD(GetBindInfo)(DWORD* bindf, BINDINFO* bind_info); 66 STDMETHOD(OnDataAvailable)(DWORD bscf, DWORD size, FORMATETC* format_etc, 67 STGMEDIUM* stgmed); 68 STDMETHOD(OnObjectAvailable)(REFIID iid, IUnknown* unk); 69 70 // IBindStatusCallbackEx 71 STDMETHOD(GetBindInfoEx)(DWORD* bindf, BINDINFO* bind_info, DWORD* bindf2, 72 DWORD* reserved); 73 74 // IHttpNegotiate 75 STDMETHOD(BeginningTransaction)(LPCWSTR url, LPCWSTR headers, DWORD reserved, 76 LPWSTR* additional_headers); 77 STDMETHOD(OnResponse)(DWORD response_code, LPCWSTR response_headers, 78 LPCWSTR request_headers, LPWSTR* additional_headers); 79 80 // IHttpNegotiate2 81 STDMETHOD(GetRootSecurityId)(BYTE* security_id, DWORD* security_id_size, 82 DWORD_PTR reserved); 83 84 // IHttpNegotiate3 85 STDMETHOD(GetSerializedClientCertContext)(BYTE** cert, DWORD* cert_size); 86 87 protected: 88 // used for logging. 89 std::string me(); 90 91 base::win::ScopedComPtr<IBindStatusCallback> delegate_; 92 base::win::ScopedComPtr<IBindCtx> bind_ctx_; 93 94 private: 95 DISALLOW_COPY_AND_ASSIGN(BSCBImpl); 96 }; 97 98 #endif // CHROME_FRAME_BIND_STATUS_CALLBACK_IMPL_H_ 99