Home | History | Annotate | Download | only in chrome_frame
      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