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.
20class BSCBImpl
21  : public CComObjectRootEx<CComMultiThreadModel>,
22    public IBindStatusCallbackEx,
23    public IHttpNegotiate3,
24    public IServiceProvider {
25 public:
26  BSCBImpl();
27  ~BSCBImpl();
28
29BEGIN_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)
37END_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