Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cIUnkAgg.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cIUnkAgg_H
7 #define _INC_cIUnkAgg_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "cRefPtr.h"
13 
14 namespace Gray
15 {
16  template<class TYPE = IUnknown>
18  {
23 
24  protected:
26 
27  public:
28  cIUnkAggBase(TYPE* pIAggOuter)
29  : m_pIAggOuter(pIAggOuter)
30  {
31  ASSERT(pIAggOuter != nullptr);
32  }
33  virtual ~cIUnkAggBase()
34  {
35  }
36  // Support IUnknown functions.
37  HRESULT QueryInterface(const IID& riid, void **ppv)
38  {
39  if (ppv == nullptr || m_pIAggOuter == nullptr)
40  {
41  *ppv = nullptr;
42  return E_POINTER;
43  }
44  return m_pIAggOuter->QueryInterface(riid, ppv);
45  }
46  ULONG AddRef(void)
47  {
48  return m_pIAggOuter->AddRef();
49  }
50  ULONG Release(void)
51  {
52  return m_pIAggOuter->Release();
53  }
54  };
55 
56  class DECLSPEC_NOVTABLE cIUnkAgg : public cRefBase, public cIUnkAggBase < IUnknown >
57  {
60  public:
61  cIUnkAgg(IUnknown* pIAggOuter)
62  : cIUnkAggBase((pIAggOuter == nullptr) ? this : pIAggOuter)
63  {
64  }
65  // Support IUknown functions.
66  STDMETHODIMP_(ULONG) AddRef(void) override
67  {
68  if (m_pIAggOuter == this)
69  {
70  IncRefCount();
71  return (ULONG) get_RefCount();
72  }
73  return m_pIAggOuter->AddRef();
74  }
75  STDMETHODIMP_(ULONG) Release(void) override
76  {
77  if (m_pIAggOuter == this)
78  {
79  DecRefCount();
80  return (ULONG) get_RefCount();
81  }
82  return m_pIAggOuter->Release();
83  }
84  STDMETHODIMP QueryInterface(const IID& riid, void **ppv) override
85  {
86  if (ppv == nullptr)
87  {
88  return E_POINTER;
89  }
90  if (m_pIAggOuter == nullptr)
91  {
92  *ppv = nullptr;
93  return E_POINTER;
94  }
95  if (m_pIAggOuter == this)
96  {
97  if (riid == __uuidof(IUnknown))
98  {
99  *ppv = this;
100  IncRefCount();
101  return S_OK;
102  }
103  return E_NOINTERFACE;
104  }
105  return m_pIAggOuter->QueryInterface(riid, ppv);
106  }
107  };
108 }
109 #endif // _INC_cIUnkAgg_H
#define TYPE
Definition: StrT.cpp:38
#define DECLSPEC_NOVTABLE
Definition: SysTypes.h:322
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cIUnkAgg.h:18
ULONG Release(void)
Definition: cIUnkAgg.h:50
HRESULT QueryInterface(const IID &riid, void **ppv)
Definition: cIUnkAgg.h:37
cIUnkAggBase(TYPE *pIAggOuter)
Definition: cIUnkAgg.h:28
TYPE * m_pIAggOuter
the outer object interface.
Definition: cIUnkAgg.h:25
virtual ~cIUnkAggBase()
Definition: cIUnkAgg.h:33
ULONG AddRef(void)
Definition: cIUnkAgg.h:46
Definition: cIUnkAgg.h:57
STDMETHODIMP_(ULONG) Release(void) override
Definition: cIUnkAgg.h:75
STDMETHODIMP_(ULONG) AddRef(void) override
Definition: cIUnkAgg.h:66
cIUnkAgg(IUnknown *pIAggOuter)
Definition: cIUnkAgg.h:61
STDMETHODIMP QueryInterface(const IID &riid, void **ppv) override
Definition: cIUnkAgg.h:84
Definition: cRefPtr.h:22
Definition: IUnknown.h:68
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
Definition: IUnknown.h:34