Index: base/win/scoped_comptr.h |
diff --git a/base/win/scoped_comptr.h b/base/win/scoped_comptr.h |
deleted file mode 100644 |
index 373c0c3ba50985bb83c4a93b3626def6601a9977..0000000000000000000000000000000000000000 |
--- a/base/win/scoped_comptr.h |
+++ /dev/null |
@@ -1,167 +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 BASE_WIN_SCOPED_COMPTR_H_ |
-#define BASE_WIN_SCOPED_COMPTR_H_ |
- |
-#include <unknwn.h> |
- |
-#include "base/logging.h" |
-#include "base/memory/ref_counted.h" |
- |
-namespace base { |
-namespace win { |
- |
-// 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: |
- // Utility template to prevent users of ScopedComPtr from calling AddRef |
- // and/or Release() without going through the ScopedComPtr class. |
- class BlockIUnknownMethods : public Interface { |
- private: |
- STDMETHOD(QueryInterface)(REFIID iid, void** object) = 0; |
- STDMETHOD_(ULONG, AddRef)() = 0; |
- STDMETHOD_(ULONG, Release)() = 0; |
- }; |
- |
- 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_); |
- 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_) << "Object leak. Pointer must be NULL"; |
- return &ptr_; |
- } |
- |
- // A convenience for whenever a void pointer is needed as an out argument. |
- void** ReceiveVoid() { |
- return reinterpret_cast<void**>(Receive()); |
- } |
- |
- 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_); |
- 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 my_identity == other_identity; |
- } |
- |
- // Provides direct access to the interface. |
- // Here we use a well known trick to make sure we block access to |
- // IUnknown 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* operator->() const { |
- DCHECK(ptr_ != NULL); |
- return reinterpret_cast<BlockIUnknownMethods*>(ptr_); |
- } |
- |
- // Pull in operator=() from the parent class. |
- using scoped_refptr<Interface>::operator=; |
- |
- // static methods |
- |
- static const IID& iid() { |
- return *interface_id; |
- } |
-}; |
- |
-} // namespace win |
-} // namespace base |
- |
-#endif // BASE_WIN_SCOPED_COMPTR_H_ |