xref: /aosp_15_r20/external/lzma/CPP/Common/MyCom.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // MyCom.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_MY_COM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_MY_COM_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "MyWindows.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "MyTypes.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker template <class T>
10*f6dc9357SAndroid Build Coastguard Worker class CMyComPtr
11*f6dc9357SAndroid Build Coastguard Worker {
12*f6dc9357SAndroid Build Coastguard Worker   T* _p;
13*f6dc9357SAndroid Build Coastguard Worker public:
CMyComPtr()14*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr(): _p(NULL) {}
throw()15*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr(T* p) throw() { if ((_p = p) != NULL) p->AddRef(); }
throw()16*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr(const CMyComPtr<T>& lp) throw() { if ((_p = lp._p) != NULL) _p->AddRef(); }
~CMyComPtr()17*f6dc9357SAndroid Build Coastguard Worker   ~CMyComPtr() { if (_p) _p->Release(); }
Release()18*f6dc9357SAndroid Build Coastguard Worker   void Release() { if (_p) { _p->Release(); _p = NULL; } }
19*f6dc9357SAndroid Build Coastguard Worker   operator T*() const {  return (T*)_p;  }
Interface()20*f6dc9357SAndroid Build Coastguard Worker   T* Interface() const {  return (T*)_p;  }
21*f6dc9357SAndroid Build Coastguard Worker   // T& operator*() const {  return *_p; }
22*f6dc9357SAndroid Build Coastguard Worker   T** operator&() { return &_p; }
23*f6dc9357SAndroid Build Coastguard Worker   T* operator->() const { return _p; }
24*f6dc9357SAndroid Build Coastguard Worker   T* operator=(T* p)
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     if (p)
27*f6dc9357SAndroid Build Coastguard Worker       p->AddRef();
28*f6dc9357SAndroid Build Coastguard Worker     if (_p)
29*f6dc9357SAndroid Build Coastguard Worker       _p->Release();
30*f6dc9357SAndroid Build Coastguard Worker     _p = p;
31*f6dc9357SAndroid Build Coastguard Worker     return p;
32*f6dc9357SAndroid Build Coastguard Worker   }
33*f6dc9357SAndroid Build Coastguard Worker   T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }
34*f6dc9357SAndroid Build Coastguard Worker   bool operator!() const { return (_p == NULL); }
35*f6dc9357SAndroid Build Coastguard Worker   // bool operator==(T* pT) const {  return _p == pT; }
Attach(T * p2)36*f6dc9357SAndroid Build Coastguard Worker   void Attach(T* p2)
37*f6dc9357SAndroid Build Coastguard Worker   {
38*f6dc9357SAndroid Build Coastguard Worker     Release();
39*f6dc9357SAndroid Build Coastguard Worker     _p = p2;
40*f6dc9357SAndroid Build Coastguard Worker   }
Detach()41*f6dc9357SAndroid Build Coastguard Worker   T* Detach()
42*f6dc9357SAndroid Build Coastguard Worker   {
43*f6dc9357SAndroid Build Coastguard Worker     T* pt = _p;
44*f6dc9357SAndroid Build Coastguard Worker     _p = NULL;
45*f6dc9357SAndroid Build Coastguard Worker     return pt;
46*f6dc9357SAndroid Build Coastguard Worker   }
47*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN32
48*f6dc9357SAndroid Build Coastguard Worker   HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
49*f6dc9357SAndroid Build Coastguard Worker   {
50*f6dc9357SAndroid Build Coastguard Worker     return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);
51*f6dc9357SAndroid Build Coastguard Worker   }
52*f6dc9357SAndroid Build Coastguard Worker   #endif
53*f6dc9357SAndroid Build Coastguard Worker   /*
54*f6dc9357SAndroid Build Coastguard Worker   HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)
55*f6dc9357SAndroid Build Coastguard Worker   {
56*f6dc9357SAndroid Build Coastguard Worker     CLSID clsid;
57*f6dc9357SAndroid Build Coastguard Worker     HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
58*f6dc9357SAndroid Build Coastguard Worker     ATLASSERT(_p == NULL);
59*f6dc9357SAndroid Build Coastguard Worker     if (SUCCEEDED(hr))
60*f6dc9357SAndroid Build Coastguard Worker       hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);
61*f6dc9357SAndroid Build Coastguard Worker     return hr;
62*f6dc9357SAndroid Build Coastguard Worker   }
63*f6dc9357SAndroid Build Coastguard Worker   */
64*f6dc9357SAndroid Build Coastguard Worker   template <class Q>
QueryInterface(REFGUID iid,Q ** pp)65*f6dc9357SAndroid Build Coastguard Worker   HRESULT QueryInterface(REFGUID iid, Q** pp) const throw()
66*f6dc9357SAndroid Build Coastguard Worker   {
67*f6dc9357SAndroid Build Coastguard Worker     // if (*pp) throw 20220216; // for debug
68*f6dc9357SAndroid Build Coastguard Worker     return _p->QueryInterface(iid, (void**)pp);
69*f6dc9357SAndroid Build Coastguard Worker   }
70*f6dc9357SAndroid Build Coastguard Worker };
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker template <class iface, class cls>
74*f6dc9357SAndroid Build Coastguard Worker class CMyComPtr2
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker   cls* _p;
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2(const CMyComPtr2<iface, cls>& lp);
79*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2(cls* p);
80*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2(iface* p);
81*f6dc9357SAndroid Build Coastguard Worker   iface* operator=(const CMyComPtr2<iface, cls>& lp);
82*f6dc9357SAndroid Build Coastguard Worker   iface* operator=(cls* p);
83*f6dc9357SAndroid Build Coastguard Worker   iface* operator=(iface* p);
84*f6dc9357SAndroid Build Coastguard Worker public:
CMyComPtr2()85*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2(): _p(NULL) {}
~CMyComPtr2()86*f6dc9357SAndroid Build Coastguard Worker   ~CMyComPtr2()
87*f6dc9357SAndroid Build Coastguard Worker   {
88*f6dc9357SAndroid Build Coastguard Worker     if (_p)
89*f6dc9357SAndroid Build Coastguard Worker     {
90*f6dc9357SAndroid Build Coastguard Worker       iface *ip = _p;
91*f6dc9357SAndroid Build Coastguard Worker       ip->Release();
92*f6dc9357SAndroid Build Coastguard Worker     }
93*f6dc9357SAndroid Build Coastguard Worker   }
94*f6dc9357SAndroid Build Coastguard Worker   // void Release() { if (_p) { (iface *)_p->Release(); _p = NULL; } }
95*f6dc9357SAndroid Build Coastguard Worker   cls* operator->() const { return _p; }
ClsPtr()96*f6dc9357SAndroid Build Coastguard Worker   cls* ClsPtr() const { return _p; }
97*f6dc9357SAndroid Build Coastguard Worker   operator iface*() const
98*f6dc9357SAndroid Build Coastguard Worker   {
99*f6dc9357SAndroid Build Coastguard Worker     iface *ip = _p;
100*f6dc9357SAndroid Build Coastguard Worker     return ip;
101*f6dc9357SAndroid Build Coastguard Worker   }
Interface()102*f6dc9357SAndroid Build Coastguard Worker   iface* Interface() const
103*f6dc9357SAndroid Build Coastguard Worker   {
104*f6dc9357SAndroid Build Coastguard Worker     iface *ip = _p;
105*f6dc9357SAndroid Build Coastguard Worker     return ip;
106*f6dc9357SAndroid Build Coastguard Worker   }
107*f6dc9357SAndroid Build Coastguard Worker   // operator bool() const {  return _p != NULL; }
IsDefined()108*f6dc9357SAndroid Build Coastguard Worker   bool IsDefined() const {  return _p != NULL; }
Create_if_Empty()109*f6dc9357SAndroid Build Coastguard Worker   void Create_if_Empty()
110*f6dc9357SAndroid Build Coastguard Worker   {
111*f6dc9357SAndroid Build Coastguard Worker     if (!_p)
112*f6dc9357SAndroid Build Coastguard Worker     {
113*f6dc9357SAndroid Build Coastguard Worker       _p = new cls;
114*f6dc9357SAndroid Build Coastguard Worker       iface *ip = _p;
115*f6dc9357SAndroid Build Coastguard Worker       ip->AddRef();
116*f6dc9357SAndroid Build Coastguard Worker     }
117*f6dc9357SAndroid Build Coastguard Worker   }
Detach()118*f6dc9357SAndroid Build Coastguard Worker   iface* Detach()
119*f6dc9357SAndroid Build Coastguard Worker   {
120*f6dc9357SAndroid Build Coastguard Worker     iface *ip = _p;
121*f6dc9357SAndroid Build Coastguard Worker     _p = NULL;
122*f6dc9357SAndroid Build Coastguard Worker     return ip;
123*f6dc9357SAndroid Build Coastguard Worker   }
SetFromCls(cls * src)124*f6dc9357SAndroid Build Coastguard Worker   void SetFromCls(cls *src)
125*f6dc9357SAndroid Build Coastguard Worker   {
126*f6dc9357SAndroid Build Coastguard Worker     if (src)
127*f6dc9357SAndroid Build Coastguard Worker     {
128*f6dc9357SAndroid Build Coastguard Worker       iface *ip = src;
129*f6dc9357SAndroid Build Coastguard Worker       ip->AddRef();
130*f6dc9357SAndroid Build Coastguard Worker     }
131*f6dc9357SAndroid Build Coastguard Worker     if (_p)
132*f6dc9357SAndroid Build Coastguard Worker     {
133*f6dc9357SAndroid Build Coastguard Worker       iface *ip = _p;
134*f6dc9357SAndroid Build Coastguard Worker       ip->Release();
135*f6dc9357SAndroid Build Coastguard Worker     }
136*f6dc9357SAndroid Build Coastguard Worker     _p = src;
137*f6dc9357SAndroid Build Coastguard Worker   }
138*f6dc9357SAndroid Build Coastguard Worker };
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker template <class iface, class cls>
142*f6dc9357SAndroid Build Coastguard Worker class CMyComPtr2_Create
143*f6dc9357SAndroid Build Coastguard Worker {
144*f6dc9357SAndroid Build Coastguard Worker   cls* _p;
145*f6dc9357SAndroid Build Coastguard Worker 
146*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2_Create(const CMyComPtr2_Create<iface, cls>& lp);
147*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2_Create(cls* p);
148*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2_Create(iface* p);
149*f6dc9357SAndroid Build Coastguard Worker   iface* operator=(const CMyComPtr2_Create<iface, cls>& lp);
150*f6dc9357SAndroid Build Coastguard Worker   iface* operator=(cls* p);
151*f6dc9357SAndroid Build Coastguard Worker   iface* operator=(iface* p);
152*f6dc9357SAndroid Build Coastguard Worker public:
CMyComPtr2_Create()153*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr2_Create(): _p(new cls)
154*f6dc9357SAndroid Build Coastguard Worker   {
155*f6dc9357SAndroid Build Coastguard Worker     iface *ip = _p;
156*f6dc9357SAndroid Build Coastguard Worker     ip->AddRef();
157*f6dc9357SAndroid Build Coastguard Worker   }
~CMyComPtr2_Create()158*f6dc9357SAndroid Build Coastguard Worker   ~CMyComPtr2_Create()
159*f6dc9357SAndroid Build Coastguard Worker   {
160*f6dc9357SAndroid Build Coastguard Worker     iface *ip = _p;
161*f6dc9357SAndroid Build Coastguard Worker     ip->Release();
162*f6dc9357SAndroid Build Coastguard Worker   }
163*f6dc9357SAndroid Build Coastguard Worker   cls* operator->() const { return _p; }
ClsPtr()164*f6dc9357SAndroid Build Coastguard Worker   cls* ClsPtr() const { return _p; }
165*f6dc9357SAndroid Build Coastguard Worker   operator iface*() const
166*f6dc9357SAndroid Build Coastguard Worker   {
167*f6dc9357SAndroid Build Coastguard Worker     iface *ip = _p;
168*f6dc9357SAndroid Build Coastguard Worker     return ip;
169*f6dc9357SAndroid Build Coastguard Worker   }
Interface()170*f6dc9357SAndroid Build Coastguard Worker   iface* Interface() const
171*f6dc9357SAndroid Build Coastguard Worker   {
172*f6dc9357SAndroid Build Coastguard Worker     iface *ip = _p;
173*f6dc9357SAndroid Build Coastguard Worker     return ip;
174*f6dc9357SAndroid Build Coastguard Worker   }
175*f6dc9357SAndroid Build Coastguard Worker };
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker #define Z7_DECL_CMyComPtr_QI_FROM(i, v, unk) \
179*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<i> v; (unk)->QueryInterface(IID_ ## i, (void **)&v);
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker 
182*f6dc9357SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////
183*f6dc9357SAndroid Build Coastguard Worker 
StringToBstr(LPCOLESTR src,BSTR * bstr)184*f6dc9357SAndroid Build Coastguard Worker inline HRESULT StringToBstr(LPCOLESTR src, BSTR *bstr)
185*f6dc9357SAndroid Build Coastguard Worker {
186*f6dc9357SAndroid Build Coastguard Worker   *bstr = ::SysAllocString(src);
187*f6dc9357SAndroid Build Coastguard Worker   return (*bstr) ? S_OK : E_OUTOFMEMORY;
188*f6dc9357SAndroid Build Coastguard Worker }
189*f6dc9357SAndroid Build Coastguard Worker 
190*f6dc9357SAndroid Build Coastguard Worker class CMyComBSTR
191*f6dc9357SAndroid Build Coastguard Worker {
192*f6dc9357SAndroid Build Coastguard Worker   BSTR m_str;
Z7_CLASS_NO_COPY(CMyComBSTR)193*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CMyComBSTR)
194*f6dc9357SAndroid Build Coastguard Worker public:
195*f6dc9357SAndroid Build Coastguard Worker   CMyComBSTR(): m_str(NULL) {}
~CMyComBSTR()196*f6dc9357SAndroid Build Coastguard Worker   ~CMyComBSTR() { ::SysFreeString(m_str); }
197*f6dc9357SAndroid Build Coastguard Worker   BSTR* operator&() { return &m_str; }
LPCOLESTR()198*f6dc9357SAndroid Build Coastguard Worker   operator LPCOLESTR() const { return m_str; }
199*f6dc9357SAndroid Build Coastguard Worker   // operator bool() const { return m_str != NULL; }
200*f6dc9357SAndroid Build Coastguard Worker   // bool operator!() const { return m_str == NULL; }
201*f6dc9357SAndroid Build Coastguard Worker 
Wipe_and_Free()202*f6dc9357SAndroid Build Coastguard Worker   void Wipe_and_Free()
203*f6dc9357SAndroid Build Coastguard Worker   {
204*f6dc9357SAndroid Build Coastguard Worker     if (m_str)
205*f6dc9357SAndroid Build Coastguard Worker     {
206*f6dc9357SAndroid Build Coastguard Worker       memset(m_str, 0, ::SysStringLen(m_str) * sizeof(*m_str));
207*f6dc9357SAndroid Build Coastguard Worker       Empty();
208*f6dc9357SAndroid Build Coastguard Worker     }
209*f6dc9357SAndroid Build Coastguard Worker   }
210*f6dc9357SAndroid Build Coastguard Worker 
211*f6dc9357SAndroid Build Coastguard Worker private:
212*f6dc9357SAndroid Build Coastguard Worker   // operator BSTR() const { return m_str; }
213*f6dc9357SAndroid Build Coastguard Worker 
CMyComBSTR(LPCOLESTR src)214*f6dc9357SAndroid Build Coastguard Worker   CMyComBSTR(LPCOLESTR src) { m_str = ::SysAllocString(src); }
215*f6dc9357SAndroid Build Coastguard Worker   // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }
216*f6dc9357SAndroid Build Coastguard Worker   // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize);  }
217*f6dc9357SAndroid Build Coastguard Worker   // CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }
218*f6dc9357SAndroid Build Coastguard Worker 
219*f6dc9357SAndroid Build Coastguard Worker   /*
220*f6dc9357SAndroid Build Coastguard Worker   CMyComBSTR(REFGUID src)
221*f6dc9357SAndroid Build Coastguard Worker   {
222*f6dc9357SAndroid Build Coastguard Worker     LPOLESTR szGuid;
223*f6dc9357SAndroid Build Coastguard Worker     StringFromCLSID(src, &szGuid);
224*f6dc9357SAndroid Build Coastguard Worker     m_str = ::SysAllocString(szGuid);
225*f6dc9357SAndroid Build Coastguard Worker     CoTaskMemFree(szGuid);
226*f6dc9357SAndroid Build Coastguard Worker   }
227*f6dc9357SAndroid Build Coastguard Worker   */
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker   /*
230*f6dc9357SAndroid Build Coastguard Worker   CMyComBSTR& operator=(const CMyComBSTR& src)
231*f6dc9357SAndroid Build Coastguard Worker   {
232*f6dc9357SAndroid Build Coastguard Worker     if (m_str != src.m_str)
233*f6dc9357SAndroid Build Coastguard Worker     {
234*f6dc9357SAndroid Build Coastguard Worker       if (m_str)
235*f6dc9357SAndroid Build Coastguard Worker         ::SysFreeString(m_str);
236*f6dc9357SAndroid Build Coastguard Worker       m_str = src.MyCopy();
237*f6dc9357SAndroid Build Coastguard Worker     }
238*f6dc9357SAndroid Build Coastguard Worker     return *this;
239*f6dc9357SAndroid Build Coastguard Worker   }
240*f6dc9357SAndroid Build Coastguard Worker   */
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker   CMyComBSTR& operator=(LPCOLESTR src)
243*f6dc9357SAndroid Build Coastguard Worker   {
244*f6dc9357SAndroid Build Coastguard Worker     ::SysFreeString(m_str);
245*f6dc9357SAndroid Build Coastguard Worker     m_str = ::SysAllocString(src);
246*f6dc9357SAndroid Build Coastguard Worker     return *this;
247*f6dc9357SAndroid Build Coastguard Worker   }
248*f6dc9357SAndroid Build Coastguard Worker 
Len()249*f6dc9357SAndroid Build Coastguard Worker   unsigned Len() const { return ::SysStringLen(m_str); }
250*f6dc9357SAndroid Build Coastguard Worker 
MyCopy()251*f6dc9357SAndroid Build Coastguard Worker   BSTR MyCopy() const
252*f6dc9357SAndroid Build Coastguard Worker   {
253*f6dc9357SAndroid Build Coastguard Worker     // We don't support Byte BSTRs here
254*f6dc9357SAndroid Build Coastguard Worker     return ::SysAllocStringLen(m_str, ::SysStringLen(m_str));
255*f6dc9357SAndroid Build Coastguard Worker     /*
256*f6dc9357SAndroid Build Coastguard Worker     UINT byteLen = ::SysStringByteLen(m_str);
257*f6dc9357SAndroid Build Coastguard Worker     BSTR res = ::SysAllocStringByteLen(NULL, byteLen);
258*f6dc9357SAndroid Build Coastguard Worker     if (res && byteLen != 0 && m_str)
259*f6dc9357SAndroid Build Coastguard Worker       memcpy(res, m_str, byteLen);
260*f6dc9357SAndroid Build Coastguard Worker     return res;
261*f6dc9357SAndroid Build Coastguard Worker     */
262*f6dc9357SAndroid Build Coastguard Worker   }
263*f6dc9357SAndroid Build Coastguard Worker 
264*f6dc9357SAndroid Build Coastguard Worker   /*
265*f6dc9357SAndroid Build Coastguard Worker   void Attach(BSTR src) { m_str = src; }
266*f6dc9357SAndroid Build Coastguard Worker   BSTR Detach()
267*f6dc9357SAndroid Build Coastguard Worker   {
268*f6dc9357SAndroid Build Coastguard Worker     BSTR s = m_str;
269*f6dc9357SAndroid Build Coastguard Worker     m_str = NULL;
270*f6dc9357SAndroid Build Coastguard Worker     return s;
271*f6dc9357SAndroid Build Coastguard Worker   }
272*f6dc9357SAndroid Build Coastguard Worker   */
273*f6dc9357SAndroid Build Coastguard Worker 
Empty()274*f6dc9357SAndroid Build Coastguard Worker   void Empty()
275*f6dc9357SAndroid Build Coastguard Worker   {
276*f6dc9357SAndroid Build Coastguard Worker     ::SysFreeString(m_str);
277*f6dc9357SAndroid Build Coastguard Worker     m_str = NULL;
278*f6dc9357SAndroid Build Coastguard Worker   }
279*f6dc9357SAndroid Build Coastguard Worker };
280*f6dc9357SAndroid Build Coastguard Worker 
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker class CMyComBSTR_Wipe: public CMyComBSTR
283*f6dc9357SAndroid Build Coastguard Worker {
Z7_CLASS_NO_COPY(CMyComBSTR_Wipe)284*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CMyComBSTR_Wipe)
285*f6dc9357SAndroid Build Coastguard Worker public:
286*f6dc9357SAndroid Build Coastguard Worker   CMyComBSTR_Wipe(): CMyComBSTR() {}
~CMyComBSTR_Wipe()287*f6dc9357SAndroid Build Coastguard Worker   ~CMyComBSTR_Wipe() { Wipe_and_Free(); }
288*f6dc9357SAndroid Build Coastguard Worker };
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker 
291*f6dc9357SAndroid Build Coastguard Worker 
292*f6dc9357SAndroid Build Coastguard Worker /*
293*f6dc9357SAndroid Build Coastguard Worker   If CMyUnknownImp doesn't use virtual destructor, the code size is smaller.
294*f6dc9357SAndroid Build Coastguard Worker   But if some class_1 derived from CMyUnknownImp
295*f6dc9357SAndroid Build Coastguard Worker     uses Z7_COM_ADDREF_RELEASE and IUnknown::Release()
296*f6dc9357SAndroid Build Coastguard Worker     and some another class_2 is derived from class_1,
297*f6dc9357SAndroid Build Coastguard Worker     then class_1 must use virtual destructor:
298*f6dc9357SAndroid Build Coastguard Worker       virtual ~class_1();
299*f6dc9357SAndroid Build Coastguard Worker     In that case, class_1::Release() calls correct destructor of class_2.
300*f6dc9357SAndroid Build Coastguard Worker   We can use virtual ~CMyUnknownImp() to disable warning
301*f6dc9357SAndroid Build Coastguard Worker     "class has virtual functions, but destructor is not virtual".
302*f6dc9357SAndroid Build Coastguard Worker   Also we can use virtual ~IUnknown() {} in MyWindows.h
303*f6dc9357SAndroid Build Coastguard Worker */
304*f6dc9357SAndroid Build Coastguard Worker 
305*f6dc9357SAndroid Build Coastguard Worker class CMyUnknownImp
306*f6dc9357SAndroid Build Coastguard Worker {
Z7_CLASS_NO_COPY(CMyUnknownImp)307*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CMyUnknownImp)
308*f6dc9357SAndroid Build Coastguard Worker protected:
309*f6dc9357SAndroid Build Coastguard Worker   ULONG _m_RefCount;
310*f6dc9357SAndroid Build Coastguard Worker   CMyUnknownImp(): _m_RefCount(0) {}
311*f6dc9357SAndroid Build Coastguard Worker 
312*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN32
313*f6dc9357SAndroid Build Coastguard Worker   #if defined(__GNUC__) || defined(__clang__)
314*f6dc9357SAndroid Build Coastguard Worker   // virtual ~CMyUnknownImp() {} // to disable GCC/CLANG varnings
315*f6dc9357SAndroid Build Coastguard Worker   #endif
316*f6dc9357SAndroid Build Coastguard Worker   #endif
317*f6dc9357SAndroid Build Coastguard Worker };
318*f6dc9357SAndroid Build Coastguard Worker 
319*f6dc9357SAndroid Build Coastguard Worker 
320*f6dc9357SAndroid Build Coastguard Worker 
321*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_BEGIN \
322*f6dc9357SAndroid Build Coastguard Worker   private: STDMETHOD(QueryInterface) (REFGUID iid, void **outObject) throw() Z7_override Z7_final \
323*f6dc9357SAndroid Build Coastguard Worker     { *outObject = NULL;
324*f6dc9357SAndroid Build Coastguard Worker 
325*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY(i) \
326*f6dc9357SAndroid Build Coastguard Worker   else if (iid == IID_ ## i) \
327*f6dc9357SAndroid Build Coastguard Worker     { i *ti = this;  *outObject = ti; }
328*f6dc9357SAndroid Build Coastguard Worker //   { *outObject = (void *)(i *)this; }
329*f6dc9357SAndroid Build Coastguard Worker 
330*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_UNKNOWN_0 \
331*f6dc9357SAndroid Build Coastguard Worker   if (iid == IID_IUnknown) \
332*f6dc9357SAndroid Build Coastguard Worker     { IUnknown *tu = this;  *outObject = tu; }
333*f6dc9357SAndroid Build Coastguard Worker 
334*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_ENTRY_UNKNOWN(i) \
335*f6dc9357SAndroid Build Coastguard Worker   if (iid == IID_IUnknown) \
336*f6dc9357SAndroid Build Coastguard Worker     { i *ti = this;  IUnknown *tu = ti;  *outObject = tu; }
337*f6dc9357SAndroid Build Coastguard Worker //    { *outObject = (void *)(IUnknown *)(i *)this; }
338*f6dc9357SAndroid Build Coastguard Worker 
339*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_BEGIN2(i) \
340*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_BEGIN \
341*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i) \
342*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i)
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker 
345*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_ADDREF_RELEASE_MT \
346*f6dc9357SAndroid Build Coastguard Worker   private: \
347*f6dc9357SAndroid Build Coastguard Worker   STDMETHOD_(ULONG, AddRef)() Z7_override Z7_final \
348*f6dc9357SAndroid Build Coastguard Worker     { return (ULONG)InterlockedIncrement((LONG *)&_m_RefCount); } \
349*f6dc9357SAndroid Build Coastguard Worker   STDMETHOD_(ULONG, Release)() Z7_override Z7_final \
350*f6dc9357SAndroid Build Coastguard Worker     { const LONG v = InterlockedDecrement((LONG *)&_m_RefCount); \
351*f6dc9357SAndroid Build Coastguard Worker       if (v != 0) return (ULONG)v; \
352*f6dc9357SAndroid Build Coastguard Worker       delete this;  return 0; }
353*f6dc9357SAndroid Build Coastguard Worker 
354*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_END_MT \
355*f6dc9357SAndroid Build Coastguard Worker   else return E_NOINTERFACE; \
356*f6dc9357SAndroid Build Coastguard Worker   InterlockedIncrement((LONG *)&_m_RefCount); /* AddRef(); */ return S_OK; }
357*f6dc9357SAndroid Build Coastguard Worker 
358*f6dc9357SAndroid Build Coastguard Worker // you can define Z7_COM_USE_ATOMIC,
359*f6dc9357SAndroid Build Coastguard Worker // if you want to call Release() from different threads (for example, for .NET code)
360*f6dc9357SAndroid Build Coastguard Worker // #define Z7_COM_USE_ATOMIC
361*f6dc9357SAndroid Build Coastguard Worker 
362*f6dc9357SAndroid Build Coastguard Worker #if defined(Z7_COM_USE_ATOMIC) && !defined(Z7_ST)
363*f6dc9357SAndroid Build Coastguard Worker 
364*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
365*f6dc9357SAndroid Build Coastguard Worker #if 0
366*f6dc9357SAndroid Build Coastguard Worker #include "../../C/Threads.h"
367*f6dc9357SAndroid Build Coastguard Worker #else
368*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
369*f6dc9357SAndroid Build Coastguard Worker LONG InterlockedIncrement(LONG volatile *addend);
370*f6dc9357SAndroid Build Coastguard Worker LONG InterlockedDecrement(LONG volatile *addend);
371*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
372*f6dc9357SAndroid Build Coastguard Worker #endif
373*f6dc9357SAndroid Build Coastguard Worker #endif // _WIN32
374*f6dc9357SAndroid Build Coastguard Worker 
375*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_ADDREF_RELEASE  Z7_COM_ADDREF_RELEASE_MT
376*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_END          Z7_COM_QI_END_MT
377*f6dc9357SAndroid Build Coastguard Worker 
378*f6dc9357SAndroid Build Coastguard Worker #else // !Z7_COM_USE_ATOMIC
379*f6dc9357SAndroid Build Coastguard Worker 
380*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_ADDREF_RELEASE \
381*f6dc9357SAndroid Build Coastguard Worker   private: \
382*f6dc9357SAndroid Build Coastguard Worker   STDMETHOD_(ULONG, AddRef)() throw() Z7_override Z7_final \
383*f6dc9357SAndroid Build Coastguard Worker     { return ++_m_RefCount; } \
384*f6dc9357SAndroid Build Coastguard Worker   STDMETHOD_(ULONG, Release)() throw() Z7_override Z7_final \
385*f6dc9357SAndroid Build Coastguard Worker     { if (--_m_RefCount != 0) return _m_RefCount; \
386*f6dc9357SAndroid Build Coastguard Worker       delete this;  return 0; }
387*f6dc9357SAndroid Build Coastguard Worker 
388*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_QI_END \
389*f6dc9357SAndroid Build Coastguard Worker   else return E_NOINTERFACE; \
390*f6dc9357SAndroid Build Coastguard Worker   ++_m_RefCount; /* AddRef(); */ return S_OK; }
391*f6dc9357SAndroid Build Coastguard Worker 
392*f6dc9357SAndroid Build Coastguard Worker #endif // !Z7_COM_USE_ATOMIC
393*f6dc9357SAndroid Build Coastguard Worker 
394*f6dc9357SAndroid Build Coastguard Worker 
395*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_SPEC(i) \
396*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_BEGIN \
397*f6dc9357SAndroid Build Coastguard Worker   i \
398*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_END \
399*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_ADDREF_RELEASE
400*f6dc9357SAndroid Build Coastguard Worker 
401*f6dc9357SAndroid Build Coastguard Worker 
402*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_0 \
403*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_BEGIN \
404*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN_0 \
405*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_END \
406*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_ADDREF_RELEASE
407*f6dc9357SAndroid Build Coastguard Worker 
408*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_1(i) \
409*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
410*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i) \
411*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i) \
412*f6dc9357SAndroid Build Coastguard Worker   )
413*f6dc9357SAndroid Build Coastguard Worker 
414*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_2(i1, i2) \
415*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
416*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i1) \
417*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i1) \
418*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i2) \
419*f6dc9357SAndroid Build Coastguard Worker   )
420*f6dc9357SAndroid Build Coastguard Worker 
421*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_3(i1, i2, i3) \
422*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
423*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i1) \
424*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i1) \
425*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i2) \
426*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i3) \
427*f6dc9357SAndroid Build Coastguard Worker   )
428*f6dc9357SAndroid Build Coastguard Worker 
429*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_4(i1, i2, i3, i4) \
430*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
431*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i1) \
432*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i1) \
433*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i2) \
434*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i3) \
435*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i4) \
436*f6dc9357SAndroid Build Coastguard Worker   )
437*f6dc9357SAndroid Build Coastguard Worker 
438*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_5(i1, i2, i3, i4, i5) \
439*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
440*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i1) \
441*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i1) \
442*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i2) \
443*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i3) \
444*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i4) \
445*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i5) \
446*f6dc9357SAndroid Build Coastguard Worker   )
447*f6dc9357SAndroid Build Coastguard Worker 
448*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_6(i1, i2, i3, i4, i5, i6) \
449*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
450*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i1) \
451*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i1) \
452*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i2) \
453*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i3) \
454*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i4) \
455*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i5) \
456*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i6) \
457*f6dc9357SAndroid Build Coastguard Worker   )
458*f6dc9357SAndroid Build Coastguard Worker 
459*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_7(i1, i2, i3, i4, i5, i6, i7) \
460*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
461*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i1) \
462*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i1) \
463*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i2) \
464*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i3) \
465*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i4) \
466*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i5) \
467*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i6) \
468*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i7) \
469*f6dc9357SAndroid Build Coastguard Worker   )
470*f6dc9357SAndroid Build Coastguard Worker 
471*f6dc9357SAndroid Build Coastguard Worker #define Z7_COM_UNKNOWN_IMP_8(i1, i2, i3, i4, i5, i6, i7, i8) \
472*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_SPEC( \
473*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_UNKNOWN(i1) \
474*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i1) \
475*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i2) \
476*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i3) \
477*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i4) \
478*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i5) \
479*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i6) \
480*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i7) \
481*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(i8) \
482*f6dc9357SAndroid Build Coastguard Worker   )
483*f6dc9357SAndroid Build Coastguard Worker 
484*f6dc9357SAndroid Build Coastguard Worker 
485*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_1(i1) \
486*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_1(i1) \
487*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
488*f6dc9357SAndroid Build Coastguard Worker 
489*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_2(i1, i2) \
490*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_2(i1, i2) \
491*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
492*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
493*f6dc9357SAndroid Build Coastguard Worker 
494*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_3(i1, i2, i3) \
495*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_3(i1, i2, i3) \
496*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
497*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
498*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
499*f6dc9357SAndroid Build Coastguard Worker 
500*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_4(i1, i2, i3, i4) \
501*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_4(i1, i2, i3, i4) \
502*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
503*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
504*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
505*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i4) \
506*f6dc9357SAndroid Build Coastguard Worker 
507*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_5(i1, i2, i3, i4, i5) \
508*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_5(i1, i2, i3, i4, i5) \
509*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
510*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
511*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
512*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i4) \
513*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i5) \
514*f6dc9357SAndroid Build Coastguard Worker 
515*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_6(i1, i2, i3, i4, i5, i6) \
516*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_6(i1, i2, i3, i4, i5, i6) \
517*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
518*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
519*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
520*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i4) \
521*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i5) \
522*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i6) \
523*f6dc9357SAndroid Build Coastguard Worker 
524*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACES_IMP_UNK_7(i1, i2, i3, i4, i5, i6, i7) \
525*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_7(i1, i2, i3, i4, i5, i6, i7) \
526*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
527*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
528*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
529*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i4) \
530*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i5) \
531*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i6) \
532*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i7) \
533*f6dc9357SAndroid Build Coastguard Worker 
534*f6dc9357SAndroid Build Coastguard Worker 
535*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_0(c) \
536*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
537*f6dc9357SAndroid Build Coastguard Worker   public IUnknown, \
538*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
539*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_0 \
540*f6dc9357SAndroid Build Coastguard Worker   private:
541*f6dc9357SAndroid Build Coastguard Worker 
542*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_1(c, i1) \
543*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
544*f6dc9357SAndroid Build Coastguard Worker   public i1, \
545*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
546*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_1(i1) \
547*f6dc9357SAndroid Build Coastguard Worker   private:
548*f6dc9357SAndroid Build Coastguard Worker 
549*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_2(c, i1, i2) \
550*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
551*f6dc9357SAndroid Build Coastguard Worker   public i1, \
552*f6dc9357SAndroid Build Coastguard Worker   public i2, \
553*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
554*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_2(i1, i2) \
555*f6dc9357SAndroid Build Coastguard Worker   private:
556*f6dc9357SAndroid Build Coastguard Worker 
557*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_3(c, i1, i2, i3) \
558*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
559*f6dc9357SAndroid Build Coastguard Worker   public i1, \
560*f6dc9357SAndroid Build Coastguard Worker   public i2, \
561*f6dc9357SAndroid Build Coastguard Worker   public i3, \
562*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
563*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_3(i1, i2, i3) \
564*f6dc9357SAndroid Build Coastguard Worker   private:
565*f6dc9357SAndroid Build Coastguard Worker 
566*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_4(c, i1, i2, i3, i4) \
567*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
568*f6dc9357SAndroid Build Coastguard Worker   public i1, \
569*f6dc9357SAndroid Build Coastguard Worker   public i2, \
570*f6dc9357SAndroid Build Coastguard Worker   public i3, \
571*f6dc9357SAndroid Build Coastguard Worker   public i4, \
572*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
573*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_4(i1, i2, i3, i4) \
574*f6dc9357SAndroid Build Coastguard Worker   private:
575*f6dc9357SAndroid Build Coastguard Worker 
576*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_5(c, i1, i2, i3, i4, i5) \
577*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
578*f6dc9357SAndroid Build Coastguard Worker   public i1, \
579*f6dc9357SAndroid Build Coastguard Worker   public i2, \
580*f6dc9357SAndroid Build Coastguard Worker   public i3, \
581*f6dc9357SAndroid Build Coastguard Worker   public i4, \
582*f6dc9357SAndroid Build Coastguard Worker   public i5, \
583*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
584*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_5(i1, i2, i3, i4, i5) \
585*f6dc9357SAndroid Build Coastguard Worker   private:
586*f6dc9357SAndroid Build Coastguard Worker 
587*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_6(c, i1, i2, i3, i4, i5, i6) \
588*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
589*f6dc9357SAndroid Build Coastguard Worker   public i1, \
590*f6dc9357SAndroid Build Coastguard Worker   public i2, \
591*f6dc9357SAndroid Build Coastguard Worker   public i3, \
592*f6dc9357SAndroid Build Coastguard Worker   public i4, \
593*f6dc9357SAndroid Build Coastguard Worker   public i5, \
594*f6dc9357SAndroid Build Coastguard Worker   public i6, \
595*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
596*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_6(i1, i2, i3, i4, i5, i6) \
597*f6dc9357SAndroid Build Coastguard Worker   private:
598*f6dc9357SAndroid Build Coastguard Worker 
599*f6dc9357SAndroid Build Coastguard Worker 
600*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_COM_7(c, i1, i2, i3, i4, i5, i6, i7) \
601*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
602*f6dc9357SAndroid Build Coastguard Worker   public i1, \
603*f6dc9357SAndroid Build Coastguard Worker   public i2, \
604*f6dc9357SAndroid Build Coastguard Worker   public i3, \
605*f6dc9357SAndroid Build Coastguard Worker   public i4, \
606*f6dc9357SAndroid Build Coastguard Worker   public i5, \
607*f6dc9357SAndroid Build Coastguard Worker   public i6, \
608*f6dc9357SAndroid Build Coastguard Worker   public i7, \
609*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
610*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_7(i1, i2, i3, i4, i5, i6, i7) \
611*f6dc9357SAndroid Build Coastguard Worker   private:
612*f6dc9357SAndroid Build Coastguard Worker 
613*f6dc9357SAndroid Build Coastguard Worker 
614*f6dc9357SAndroid Build Coastguard Worker /*
615*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_0(c) \
616*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
617*f6dc9357SAndroid Build Coastguard Worker   public IUnknown, \
618*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
619*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_0 \
620*f6dc9357SAndroid Build Coastguard Worker   private:
621*f6dc9357SAndroid Build Coastguard Worker */
622*f6dc9357SAndroid Build Coastguard Worker 
623*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_1(c, i1) \
624*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
625*f6dc9357SAndroid Build Coastguard Worker   public i1, \
626*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
627*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_0 \
628*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
629*f6dc9357SAndroid Build Coastguard Worker   private:
630*f6dc9357SAndroid Build Coastguard Worker 
631*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_2(c, i1, i2) \
632*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
633*f6dc9357SAndroid Build Coastguard Worker   public i1, \
634*f6dc9357SAndroid Build Coastguard Worker   public i2, \
635*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
636*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_1(i2) \
637*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
638*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
639*f6dc9357SAndroid Build Coastguard Worker   private:
640*f6dc9357SAndroid Build Coastguard Worker 
641*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_3(c, i1, i2, i3) \
642*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
643*f6dc9357SAndroid Build Coastguard Worker   public i1, \
644*f6dc9357SAndroid Build Coastguard Worker   public i2, \
645*f6dc9357SAndroid Build Coastguard Worker   public i3, \
646*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
647*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_2(i2, i3) \
648*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
649*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
650*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
651*f6dc9357SAndroid Build Coastguard Worker   private:
652*f6dc9357SAndroid Build Coastguard Worker 
653*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_4(c, i1, i2, i3, i4) \
654*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
655*f6dc9357SAndroid Build Coastguard Worker   public i1, \
656*f6dc9357SAndroid Build Coastguard Worker   public i2, \
657*f6dc9357SAndroid Build Coastguard Worker   public i3, \
658*f6dc9357SAndroid Build Coastguard Worker   public i4, \
659*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
660*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_3(i2, i3, i4) \
661*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
662*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
663*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
664*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i4) \
665*f6dc9357SAndroid Build Coastguard Worker 
666*f6dc9357SAndroid Build Coastguard Worker /*
667*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_NOQIB_5(c, i1, i2, i3, i4, i5) \
668*f6dc9357SAndroid Build Coastguard Worker   Z7_class_final(c) : \
669*f6dc9357SAndroid Build Coastguard Worker   public i1, \
670*f6dc9357SAndroid Build Coastguard Worker   public i2, \
671*f6dc9357SAndroid Build Coastguard Worker   public i3, \
672*f6dc9357SAndroid Build Coastguard Worker   public i4, \
673*f6dc9357SAndroid Build Coastguard Worker   public i5, \
674*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
675*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_UNKNOWN_IMP_4(i2, i3, i4, i5) \
676*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i1) \
677*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i2) \
678*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i3) \
679*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i4) \
680*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(i5) \
681*f6dc9357SAndroid Build Coastguard Worker */
682*f6dc9357SAndroid Build Coastguard Worker 
683*f6dc9357SAndroid Build Coastguard Worker 
684*f6dc9357SAndroid Build Coastguard Worker #define Z7_CLASS_IMP_IInStream(c) \
685*f6dc9357SAndroid Build Coastguard Worker   class c Z7_final : \
686*f6dc9357SAndroid Build Coastguard Worker   public IInStream, \
687*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp { \
688*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACES_IMP_UNK_2(ISequentialInStream, IInStream) \
689*f6dc9357SAndroid Build Coastguard Worker 
690*f6dc9357SAndroid Build Coastguard Worker 
691*f6dc9357SAndroid Build Coastguard Worker #define k_My_HRESULT_WritingWasCut 0x20000010
692*f6dc9357SAndroid Build Coastguard Worker 
693*f6dc9357SAndroid Build Coastguard Worker #endif
694