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