| Index: chrome_frame/com_type_info_holder.h
|
| diff --git a/chrome_frame/com_type_info_holder.h b/chrome_frame/com_type_info_holder.h
|
| deleted file mode 100644
|
| index a777d7ce4e52d6c4f4fdc77dc7bd2ffb71a9e450..0000000000000000000000000000000000000000
|
| --- a/chrome_frame/com_type_info_holder.h
|
| +++ /dev/null
|
| @@ -1,191 +0,0 @@
|
| -// 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_COM_TYPE_INFO_HOLDER_H_
|
| -#define CHROME_FRAME_COM_TYPE_INFO_HOLDER_H_
|
| -
|
| -#include <map>
|
| -#include <ocidl.h> // IProvideClassInfo2
|
| -
|
| -#include "base/synchronization/lock.h"
|
| -#include "base/win/scoped_comptr.h"
|
| -
|
| -#define NO_VTABLE __declspec(novtable)
|
| -
|
| -namespace com_util {
|
| -
|
| -// A map from a name hash (32 bit value) to a DISPID.
|
| -// Used as a caching layer before looking the name up in a type lib.
|
| -class NameToDispIdCache {
|
| - public:
|
| - typedef uint32 HashType;
|
| -
|
| - bool Lookup(HashType hash, DISPID* dispid) const;
|
| - void Add(HashType hash, DISPID dispid);
|
| -
|
| - // Hashes the name by calling LHashValOfName.
|
| - // The returned hash value is independent of the case of the characters
|
| - // in |name|.
|
| - static HashType Hash(const wchar_t* name);
|
| -
|
| - protected:
|
| - typedef std::map<HashType, DISPID> DispidMap;
|
| - DispidMap map_;
|
| - mutable base::Lock lock_;
|
| -};
|
| -
|
| -// Wraps an instance of ITypeInfo and builds+maintains a cache of names
|
| -// to dispids. Also offers an Invoke method that simply forwards the call
|
| -// to ITypeInfo::Invoke.
|
| -class TypeInfoNameCache {
|
| - public:
|
| - // Loads the module's type library and fetches the ITypeInfo object for
|
| - // the specified interface ID.
|
| - HRESULT Initialize(const IID& iid);
|
| -
|
| - // Fetches the id's of the given names. If there's a cache miss, the results
|
| - // are fetched from the underlying ITypeInfo and then cached.
|
| - HRESULT GetIDsOfNames(OLECHAR** names, uint32 count, DISPID* dispids);
|
| -
|
| - // Calls ITypeInfo::Invoke.
|
| - HRESULT Invoke(IDispatch* p, DISPID dispid, WORD flags, DISPPARAMS* params,
|
| - VARIANT* result, EXCEPINFO* excepinfo, UINT* arg_err);
|
| -
|
| - inline ITypeInfo* CopyTypeInfo() {
|
| - ITypeInfo* ti = type_info_.get();
|
| - if (ti)
|
| - ti->AddRef();
|
| - return ti;
|
| - }
|
| -
|
| - protected:
|
| - base::win::ScopedComPtr<ITypeInfo> type_info_;
|
| - NameToDispIdCache cache_;
|
| -};
|
| -
|
| -// The root class for type lib access.
|
| -// This class has only one instance that should be accessed via the
|
| -// Singleton method.
|
| -class TypeInfoCache {
|
| - public:
|
| - TypeInfoCache() {
|
| - }
|
| -
|
| - ~TypeInfoCache();
|
| -
|
| - // Looks up a previously cached TypeInfoNameCache instance or creates and
|
| - // caches a new one.
|
| - TypeInfoNameCache* Lookup(const IID* iid);
|
| -
|
| - // Call to get access to the singleton instance of TypeInfoCache.
|
| - static TypeInfoCache* Singleton();
|
| -
|
| - protected:
|
| - typedef std::map<const IID*, TypeInfoNameCache*> CacheMap;
|
| - base::Lock lock_;
|
| - CacheMap cache_;
|
| -};
|
| -
|
| -// Holds a pointer to the type info of a given COM interface.
|
| -// The type info is loaded once on demand and after that cached.
|
| -// NOTE: This class only supports loading the first typelib from the
|
| -// current module.
|
| -template <const IID& iid>
|
| -class TypeInfoHolder {
|
| - public:
|
| - TypeInfoHolder() : type_info_(NULL) {
|
| - }
|
| -
|
| - bool EnsureTI() {
|
| - if (!type_info_)
|
| - type_info_ = TypeInfoCache::Singleton()->Lookup(&iid);
|
| - return type_info_ != NULL;
|
| - }
|
| -
|
| - HRESULT GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** info) {
|
| - if (EnsureTI()) {
|
| - *info = type_info_->CopyTypeInfo();
|
| - return S_OK;
|
| - }
|
| -
|
| - return E_UNEXPECTED;
|
| - }
|
| -
|
| - HRESULT GetIDsOfNames(REFIID riid, OLECHAR** names, UINT count, LCID lcid,
|
| - DISPID* dispids) {
|
| - if (!EnsureTI())
|
| - return E_UNEXPECTED;
|
| - return type_info_->GetIDsOfNames(names, count, dispids);
|
| - }
|
| -
|
| - HRESULT Invoke(IDispatch* p, DISPID dispid, REFIID riid, LCID lcid,
|
| - WORD flags, DISPPARAMS* params, VARIANT* result,
|
| - EXCEPINFO* excepinfo, UINT* arg_err) {
|
| - if (!EnsureTI())
|
| - return E_UNEXPECTED;
|
| -
|
| - return type_info_->Invoke(p, dispid, flags, params, result, excepinfo,
|
| - arg_err);
|
| - }
|
| -
|
| - protected:
|
| - TypeInfoNameCache* type_info_;
|
| -};
|
| -
|
| -// Implements IDispatch part of T (where T is an IDispatch derived interface).
|
| -// The class assumes that the type info of T is available in a typelib of the
|
| -// current module.
|
| -template <class T, const IID& iid = __uuidof(T)>
|
| -class NO_VTABLE IDispatchImpl : public T {
|
| - public:
|
| - STDMETHOD(GetTypeInfoCount)(UINT* count) {
|
| - if (count == NULL)
|
| - return E_POINTER;
|
| - *count = 1;
|
| - return S_OK;
|
| - }
|
| -
|
| - STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo) {
|
| - return type_info_.GetTypeInfo(itinfo, lcid, pptinfo);
|
| - }
|
| -
|
| - STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* names, UINT count,
|
| - LCID lcid, DISPID* dispids) {
|
| - return type_info_.GetIDsOfNames(riid, names, count, lcid, dispids);
|
| - }
|
| - STDMETHOD(Invoke)(DISPID dispid, REFIID riid, LCID lcid, WORD flags,
|
| - DISPPARAMS* params, VARIANT* result, EXCEPINFO* excepinfo,
|
| - UINT* arg_err) {
|
| - return type_info_.Invoke(static_cast<IDispatch*>(this), dispid, riid, lcid,
|
| - flags, params, result, excepinfo, arg_err);
|
| - }
|
| -
|
| - protected:
|
| - TypeInfoHolder<iid> type_info_;
|
| -};
|
| -
|
| -// Simple implementation of IProvideClassInfo[2].
|
| -template <const CLSID& class_id, const IID& source_iid>
|
| -class NO_VTABLE IProvideClassInfo2Impl : public IProvideClassInfo2 {
|
| - public:
|
| - STDMETHOD(GetClassInfo)(ITypeInfo** pptinfo) {
|
| - return type_info_.GetTypeInfo(0, LANG_NEUTRAL, pptinfo);
|
| - }
|
| -
|
| - STDMETHOD(GetGUID)(DWORD guid_kind, GUID* guid) {
|
| - if (guid == NULL || guid_kind != GUIDKIND_DEFAULT_SOURCE_DISP_IID)
|
| - return E_INVALIDARG;
|
| -
|
| - *guid = source_iid;
|
| -
|
| - return S_OK;
|
| - }
|
| -
|
| - protected:
|
| - TypeInfoHolder<class_id> type_info_;
|
| -};
|
| -
|
| -} // namespace com_util
|
| -
|
| -#endif // CHROME_FRAME_COM_TYPE_INFO_HOLDER_H_
|
|
|