diff options
Diffstat (limited to 'base/scoped_comptr_win.h')
-rw-r--r-- | base/scoped_comptr_win.h | 160 |
1 files changed, 5 insertions, 155 deletions
diff --git a/base/scoped_comptr_win.h b/base/scoped_comptr_win.h index dd9b9fc..7f15885 100644 --- a/base/scoped_comptr_win.h +++ b/base/scoped_comptr_win.h @@ -1,159 +1,9 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 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 BASE_SCOPED_COMPTR_WIN_H_ -#define BASE_SCOPED_COMPTR_WIN_H_ -#pragma once +// TODO(brettw) remove this file when all callers are converted to using the +// new location/namespace +#include "base/win/scoped_comptr.h" -#include <unknwn.h> - -#include "base/logging.h" -#include "base/ref_counted.h" - -// Utility template to prevent users of ScopedComPtr from calling AddRef and/or -// Release() without going through the ScopedComPtr class. -template <class Interface> -class BlockIUnknownMethods : public Interface { - private: - STDMETHOD(QueryInterface)(REFIID iid, void** object) = 0; - STDMETHOD_(ULONG, AddRef)() = 0; - STDMETHOD_(ULONG, Release)() = 0; -}; - -// A fairly minimalistic smart class for COM interface pointers. -// Uses scoped_refptr for the basic smart pointer functionality -// and adds a few IUnknown specific services. -template <class Interface, const IID* interface_id = &__uuidof(Interface)> -class ScopedComPtr : public scoped_refptr<Interface> { - public: - typedef scoped_refptr<Interface> ParentClass; - - ScopedComPtr() { - } - - explicit ScopedComPtr(Interface* p) : ParentClass(p) { - } - - ScopedComPtr(const ScopedComPtr<Interface, interface_id>& p) - : ParentClass(p) { - } - - ~ScopedComPtr() { - // We don't want the smart pointer class to be bigger than the pointer - // it wraps. - COMPILE_ASSERT(sizeof(ScopedComPtr<Interface, interface_id>) == - sizeof(Interface*), ScopedComPtrSize); - } - - // Explicit Release() of the held object. Useful for reuse of the - // ScopedComPtr instance. - // Note that this function equates to IUnknown::Release and should not - // be confused with e.g. scoped_ptr::release(). - void Release() { - if (ptr_ != NULL) { - ptr_->Release(); - ptr_ = NULL; - } - } - - // Sets the internal pointer to NULL and returns the held object without - // releasing the reference. - Interface* Detach() { - Interface* p = ptr_; - ptr_ = NULL; - return p; - } - - // Accepts an interface pointer that has already been addref-ed. - void Attach(Interface* p) { - DCHECK(ptr_ == NULL); - ptr_ = p; - } - - // Retrieves the pointer address. - // Used to receive object pointers as out arguments (and take ownership). - // The function DCHECKs on the current value being NULL. - // Usage: Foo(p.Receive()); - Interface** Receive() { - DCHECK(ptr_ == NULL) << "Object leak. Pointer must be NULL"; - return &ptr_; - } - - template <class Query> - HRESULT QueryInterface(Query** p) { - DCHECK(p != NULL); - DCHECK(ptr_ != NULL); - // IUnknown already has a template version of QueryInterface - // so the iid parameter is implicit here. The only thing this - // function adds are the DCHECKs. - return ptr_->QueryInterface(p); - } - - // QI for times when the IID is not associated with the type. - HRESULT QueryInterface(const IID& iid, void** obj) { - DCHECK(obj != NULL); - DCHECK(ptr_ != NULL); - return ptr_->QueryInterface(iid, obj); - } - - // Queries |other| for the interface this object wraps and returns the - // error code from the other->QueryInterface operation. - HRESULT QueryFrom(IUnknown* object) { - DCHECK(object != NULL); - return object->QueryInterface(Receive()); - } - - // Convenience wrapper around CoCreateInstance - HRESULT CreateInstance(const CLSID& clsid, IUnknown* outer = NULL, - DWORD context = CLSCTX_ALL) { - DCHECK(ptr_ == NULL); - HRESULT hr = ::CoCreateInstance(clsid, outer, context, *interface_id, - reinterpret_cast<void**>(&ptr_)); - return hr; - } - - // Checks if the identity of |other| and this object is the same. - bool IsSameObject(IUnknown* other) { - if (!other && !ptr_) - return true; - - if (!other || !ptr_) - return false; - - ScopedComPtr<IUnknown> my_identity; - QueryInterface(my_identity.Receive()); - - ScopedComPtr<IUnknown> other_identity; - other->QueryInterface(other_identity.Receive()); - - return static_cast<IUnknown*>(my_identity) == - static_cast<IUnknown*>(other_identity); - } - - // Provides direct access to the interface. - // Here we use a well known trick to make sure we block access to - // IUknown methods so that something bad like this doesn't happen: - // ScopedComPtr<IUnknown> p(Foo()); - // p->Release(); - // ... later the destructor runs, which will Release() again. - // and to get the benefit of the DCHECKs we add to QueryInterface. - // There's still a way to call these methods if you absolutely must - // by statically casting the ScopedComPtr instance to the wrapped interface - // and then making the call... but generally that shouldn't be necessary. - BlockIUnknownMethods<Interface>* operator->() const { - DCHECK(ptr_ != NULL); - return reinterpret_cast<BlockIUnknownMethods<Interface>*>(ptr_); - } - - // Pull in operator=() from the parent class. - using scoped_refptr<Interface>::operator=; - - // static methods - - static const IID& iid() { - return *interface_id; - } -}; - -#endif // BASE_SCOPED_COMPTR_WIN_H_ +using base::win::ScopedComPtr; |