// 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_CONTEXT_INFO_H_ #define CHROME_FRAME_BIND_CONTEXT_INFO_H_ #include <atlbase.h> #include <atlcom.h> #include "base/win/scoped_comptr.h" #include "chrome_frame/protocol_sink_wrap.h" class __declspec(uuid("71CC3EC7-7E8A-457f-93BC-1090CF31CC18")) IBindContextInfoInternal : public IUnknown { public: STDMETHOD(GetCppObject)(void** me) = 0; }; // This class maintains contextual information used by ChromeFrame. // This information is maintained in the bind context. // Association with GUID_NULL is for convenience. class __declspec(uuid("00000000-0000-0000-0000-000000000000")) BindContextInfo : public CComObjectRootEx<CComMultiThreadModel>, public IBindContextInfoInternal { public: BindContextInfo(); ~BindContextInfo(); BEGIN_COM_MAP(BindContextInfo) COM_INTERFACE_ENTRY(IBindContextInfoInternal) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, ftm_) END_COM_MAP() // Returns the BindContextInfo instance associated with the bind // context. Creates it if needed. // The returned info object will be AddRef-ed on return, so use // base::win::ScopedComPtr<>::Receive() to receive this pointer. static HRESULT FromBindContext(IBindCtx* bind_context, BindContextInfo** info); void set_chrome_request(bool chrome_request) { chrome_request_ = chrome_request; } bool chrome_request() const { return chrome_request_; } void set_no_cache(bool no_cache) { no_cache_ = no_cache; } bool no_cache() const { return no_cache_; } bool is_switching() const { return is_switching_; } void SetToSwitch(IStream* cache); IStream* cache() { return cache_; } void set_prot_data(ProtData* data) { prot_data_ = data; } scoped_refptr<ProtData> get_prot_data() { return prot_data_; } bool has_prot_data() const { return prot_data_.get() != NULL; } void set_protocol(IInternetProtocol* protocol) { protocol_ = protocol; } IInternetProtocol* protocol() { return protocol_.get(); } // Returns the url being navigated to. We retrieve the url from the ProtData // instance which wraps the underlying protocol sink. std::wstring GetUrl(); protected: STDMETHOD(GetCppObject)(void** me) { DCHECK(me); AddRef(); *me = static_cast<BindContextInfo*>(this); return S_OK; } HRESULT Initialize(IBindCtx* bind_ctx); private: base::win::ScopedComPtr<IStream> cache_; bool no_cache_; bool chrome_request_; bool is_switching_; base::win::ScopedComPtr<IUnknown> ftm_; scoped_refptr<ProtData> prot_data_; base::win::ScopedComPtr<IInternetProtocol> protocol_; DISALLOW_COPY_AND_ASSIGN(BindContextInfo); }; #endif // CHROME_FRAME_BIND_CONTEXT_INFO_H_