C++程序  |  99行  |  3.31 KB

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_FRAME_BIND_STATUS_CALLBACK_IMPL_H_
#define CHROME_FRAME_BIND_STATUS_CALLBACK_IMPL_H_

#include <atlbase.h>
#include <atlcom.h>
#include <string>
#include <urlmon.h>

#include "base/win/scoped_comptr.h"
#include "chrome_frame/utils.h"

// A generic base class for IBindStatus callback implementation.
// If initialized with delegate, it will hand over all the calls
// to the delegate. This can also be used as a base class to
// provide the base implementation by not providing any delegate.
class BSCBImpl
  : public CComObjectRootEx<CComMultiThreadModel>,
    public IBindStatusCallbackEx,
    public IHttpNegotiate3,
    public IServiceProvider {
 public:
  BSCBImpl();
  ~BSCBImpl();

BEGIN_COM_MAP(BSCBImpl)
  COM_INTERFACE_ENTRY(IBindStatusCallback)
  COM_INTERFACE_ENTRY(IHttpNegotiate)
  COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IBindStatusCallbackEx)
  COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IHttpNegotiate2)
  COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IHttpNegotiate3)
  COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS(IServiceProvider)
  COM_INTERFACE_ENTRY_FUNC_BLIND(0, DelegateQI)
END_COM_MAP()

  static STDMETHODIMP DelegateQI(void* obj, REFIID iid, void** ret,
                                 DWORD cookie);

  void Initialize(IBindStatusCallback* original);
  HRESULT AttachToBind(IBindCtx* original);
  HRESULT ReleaseBind();

  // For the COM_INTERFACE_ENTRY_IF_DELEGATE_SUPPORTS macro.
  IBindStatusCallback* delegate() const {
    return delegate_;
  }

  IBindCtx* bind_ctx() const {
    return bind_ctx_;
  }

  // IServiceProvider
  STDMETHOD(QueryService)(REFGUID service, REFIID iid, void** object);

  // IBindStatusCallback
  STDMETHOD(OnStartBinding)(DWORD reserved, IBinding* binding);
  STDMETHOD(GetPriority)(LONG* priority);
  STDMETHOD(OnLowResource)(DWORD reserved);
  STDMETHOD(OnProgress)(ULONG progress, ULONG progress_max, ULONG status_code,
                        LPCWSTR status_text);
  STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR error);
  STDMETHOD(GetBindInfo)(DWORD* bindf, BINDINFO* bind_info);
  STDMETHOD(OnDataAvailable)(DWORD bscf, DWORD size, FORMATETC* format_etc,
                             STGMEDIUM* stgmed);
  STDMETHOD(OnObjectAvailable)(REFIID iid, IUnknown* unk);

  // IBindStatusCallbackEx
  STDMETHOD(GetBindInfoEx)(DWORD* bindf, BINDINFO* bind_info, DWORD* bindf2,
                           DWORD* reserved);

  // IHttpNegotiate
  STDMETHOD(BeginningTransaction)(LPCWSTR url, LPCWSTR headers, DWORD reserved,
                                  LPWSTR* additional_headers);
  STDMETHOD(OnResponse)(DWORD response_code, LPCWSTR response_headers,
                        LPCWSTR request_headers, LPWSTR* additional_headers);

  // IHttpNegotiate2
  STDMETHOD(GetRootSecurityId)(BYTE* security_id, DWORD* security_id_size,
                               DWORD_PTR reserved);

  // IHttpNegotiate3
  STDMETHOD(GetSerializedClientCertContext)(BYTE** cert, DWORD* cert_size);

 protected:
  // used for logging.
  std::string me();

  base::win::ScopedComPtr<IBindStatusCallback> delegate_;
  base::win::ScopedComPtr<IBindCtx> bind_ctx_;

 private:
  DISALLOW_COPY_AND_ASSIGN(BSCBImpl);
};

#endif  // CHROME_FRAME_BIND_STATUS_CALLBACK_IMPL_H_