Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
p6comhlpr.h
Go to the documentation of this file.
1 
10 #ifndef P6COMHLPR_H__
11 #define P6COMHLPR_H__ 1
12 
13 #ifdef __cplusplus
14 # ifndef P6_UEFI
15 # include <memory>
16 # endif
17 #endif
18 
19 #ifdef DOX_IGNORE
20 # include "p6com.h"
21 #endif
22 
23 #ifdef __cplusplus
24 
25 //namespace P6R {
26 //
27 // template<typename I, const P6REFIID iid>
28 // I* interface_cast(P6R::p6ICom *pIface)
29 // {
30 // P6ERR err = eOk;
31 // I* pNewIface= NULL;
32 //
33 // err = pIface->queryInterface(iid,(P6VOID**)*pNewIface);
34 // P6ASSERT(eOk == err);
35 // return pNewIface;
36 // }
37 //
38 //} // namespace
39 
55 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
56 
57 
58 #define P6_DECL_ICOM \
59  P6COMMETHOD queryInterface(const P6REFIID iid,P6R::P6VOID **ppIface);\
60  P6COMMETHOD_(P6R::P6INT32) addref(); \
61  P6COMMETHOD_(P6R::P6INT32) release(); \
62  static P6R::P6ERR createInstance(P6R::p6ICom *pOuter,const P6REFIID iid,P6R::P6VOID **ppNewComponent); \
63  P6R::P6AUTO_INT32 m_cRef
64 
65 
66 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname) \
67 P6R::P6ERR classname::createInstance(P6R::p6ICom *pOuter,const P6REFIID iid,P6R::P6VOID **ppNewComponent) \
68 { \
69  P6R::P6ERR err; \
70  classname *pObj = NULL; \
71  if(NULL != pOuter) \
72  return P6R::eNoAgregation; \
73  if(NULL == ppNewComponent) \
74  return P6R::eAccessFault; \
75  *ppNewComponent = NULL; \
76  if(NULL == (pObj = new (std::nothrow) classname())) { \
77  *ppNewComponent = NULL; \
78  return P6R::eNoMemory; \
79  } \
80  pObj->addref(); \
81  if(1 == pObj->m_cRef.value) { \
82  err = pObj->queryInterface(iid,ppNewComponent); \
83  } \
84  else { \
85  err = eInvalidRefcount; \
86  } \
87  pObj->release(); \
88  return err; \
89 }
90 
91 #define P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
92 P6R::P6INT32 classname::addref() { \
93  P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
94  P6R::p6TraceAddref((const P6R::P6CHAR*)#classname,sizeof(*this),this,tmp,NULL); \
95  return tmp; \
96 } \
97 
98 #define P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
99 P6R::P6INT32 classname::release() { \
100  P6ASSERT(0 != m_cRef.value); \
101  P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
102  P6R::p6TraceRelease((const P6R::P6CHAR*)#classname,this,tmp,NULL); \
103  if(0 == tmp) { delete this; } \
104  return tmp; \
105 }
106 
107 #define P6_IMPLEMENT_ICOM1(classname,interface1) \
108 P6R::P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) \
109 { \
110  if(!ppv) \
111  return P6R::eAccessFault; \
112  *ppv = NULL; \
113  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
114  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
115  else return P6R::eNoInterface; \
116  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
117  return P6R::eOk; \
118 } \
119 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
120 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
121 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
122 
123 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2) \
124 P6R::P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
125  if(!ppv) \
126  return P6R::eAccessFault; \
127  *ppv = NULL; \
128  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
129  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
130  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
131  else return P6R::eNoInterface; \
132  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
133  return P6R::eOk; \
134 } \
135 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
136 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
137 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
138 
139 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3) \
140 P6R::P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
141  if(!ppv) \
142  return P6R::eAccessFault; \
143  *ppv = NULL; \
144  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
145  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
146  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
147  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
148  else return P6R::eNoInterface; \
149  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
150  return P6R::eOk; \
151 } \
152 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
153 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
154 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
155 
156 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
157 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
158  if(!ppv) \
159  return P6R::eAccessFault; \
160  *ppv = NULL; \
161  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
162  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
163  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
164  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
165  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
166  else return P6R::eNoInterface; \
167  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
168  return P6R::eOk; \
169 } \
170 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
171 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
172 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
173 
174 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
175 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
176  if(!ppv) \
177  return P6R::eAccessFault; \
178  *ppv = NULL; \
179  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
180  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
181  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
182  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
183  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
184  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
185  else return P6R::eNoInterface; \
186  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
187  return P6R::eOk; \
188 } \
189 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
190 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
191 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
192 
193 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
194 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
195  if(!ppv) \
196  return P6R::eAccessFault; \
197  *ppv = NULL; \
198  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
199  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
200  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
201  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
202  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
203  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
204  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
205  else return P6R::eNoInterface; \
206  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
207  return P6R::eOk; \
208 } \
209 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
210 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
211 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
212 
213 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
214 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
215  if(!ppv) \
216  return P6R::eAccessFault; \
217  *ppv = NULL; \
218  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
219  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
220  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
221  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
222  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
223  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
224  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
225  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
226  else return P6R::eNoInterface; \
227  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
228  return P6R::eOk; \
229 } \
230 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
231 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
232 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
233 
234 #define P6_IMPLEMENT_ICOM8(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8) \
235 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
236  if(!ppv) \
237  return P6R::eAccessFault; \
238  *ppv = NULL; \
239  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
240  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
241  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
242  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
243  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
244  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
245  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
246  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
247  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
248  else return P6R::eNoInterface; \
249  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
250  return P6R::eOk; \
251 } \
252 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
253 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
254 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
255 
256 #define P6_IMPLEMENT_ICOM9(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9) \
257 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
258  if(!ppv) \
259  return P6R::eAccessFault; \
260  *ppv = NULL; \
261  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
262  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
263  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
264  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
265  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
266  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
267  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
268  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
269  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
270  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
271  else return P6R::eNoInterface; \
272  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
273  return P6R::eOk; \
274 } \
275 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
276 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
277 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
278 
279 #define P6_IMPLEMENT_ICOM10(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10) \
280 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
281  if(!ppv) \
282  return P6R::eAccessFault; \
283  *ppv = NULL; \
284  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
285  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
286  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
287  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
288  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
289  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
290  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
291  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
292  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
293  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
294  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
295  else return P6R::eNoInterface; \
296  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
297  return P6R::eOk; \
298 } \
299 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
300 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
301 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
302 
303 #define P6_IMPLEMENT_ICOM11(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11) \
304 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
305  if(!ppv) \
306  return P6R::eAccessFault; \
307  *ppv = NULL; \
308  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
309  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
310  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
311  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
312  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
313  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
314  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
315  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
316  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
317  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
318  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
319  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
320  else return P6R::eNoInterface; \
321  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
322  return P6R::eOk; \
323 } \
324 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
325 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
326 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
327 
328 #define P6_IMPLEMENT_ICOM12(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12) \
329 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
330  if(!ppv) \
331  return P6R::eAccessFault; \
332  *ppv = NULL; \
333  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
334  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
335  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
336  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
337  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
338  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
339  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
340  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
341  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
342  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
343  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
344  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
345  else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
346  else return P6R::eNoInterface; \
347  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
348  return P6R::eOk; \
349 } \
350 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
351 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
352 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
353 
354 #define P6_IMPLEMENT_ICOM13(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13) \
355 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
356  if(!ppv) \
357  return P6R::eAccessFault; \
358  *ppv = NULL; \
359  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
360  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
361  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
362  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
363  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
364  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
365  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
366  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
367  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
368  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
369  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
370  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
371  else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
372  else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
373  else return P6R::eNoInterface; \
374  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
375  return P6R::eOk; \
376 } \
377 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
378 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
379 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
380 
381 #define P6_IMPLEMENT_ICOM14(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14) \
382 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
383  if(!ppv) \
384  return P6R::eAccessFault; \
385  *ppv = NULL; \
386  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
387  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
388  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
389  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
390  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
391  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
392  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
393  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
394  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
395  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
396  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
397  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
398  else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
399  else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
400  else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
401  else return P6R::eNoInterface; \
402  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
403  return P6R::eOk; \
404 } \
405 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
406 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
407 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
408 
409 #define P6_IMPLEMENT_ICOM15(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15) \
410 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
411  if(!ppv) \
412  return P6R::eAccessFault; \
413  *ppv = NULL; \
414  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
415  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
416  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
417  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
418  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
419  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
420  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
421  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
422  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
423  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
424  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
425  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
426  else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
427  else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
428  else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
429  else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
430  else return P6R::eNoInterface; \
431  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
432  return P6R::eOk; \
433 } \
434 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
435 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
436 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
437 
438 #define P6_IMPLEMENT_ICOM16(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16) \
439 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
440  if(!ppv) \
441  return P6R::eAccessFault; \
442  *ppv = NULL; \
443  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
444  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
445  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
446  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
447  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
448  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
449  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
450  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
451  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
452  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
453  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
454  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
455  else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
456  else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
457  else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
458  else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
459  else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
460  else return P6R::eNoInterface; \
461  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
462  return P6R::eOk; \
463 } \
464 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
465 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
466 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
467 
468 #define P6_IMPLEMENT_ICOM17(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16,interface17) \
469 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
470  if(!ppv) \
471  return P6R::eAccessFault; \
472  *ppv = NULL; \
473  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
474  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
475  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
476  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
477  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
478  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
479  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
480  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
481  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
482  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
483  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
484  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
485  else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
486  else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
487  else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
488  else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
489  else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
490  else if(iid == IID_##interface17) *ppv = static_cast<interface17*>(this); \
491  else return P6R::eNoInterface; \
492  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
493  return P6R::eOk; \
494 } \
495 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
496 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
497 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
498 
499 
500 #define P6_IMPLEMENT_ICOM18(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16,interface17,interface18) \
501 P6ERR classname::queryInterface(const P6REFIID iid, P6R::P6VOID** ppv) { \
502  if(!ppv) \
503  return P6R::eAccessFault; \
504  *ppv = NULL; \
505  if(iid == IID_p6ICom) *ppv = static_cast<interface1*>(this); \
506  else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
507  else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
508  else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
509  else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
510  else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
511  else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
512  else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
513  else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
514  else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
515  else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
516  else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
517  else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
518  else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
519  else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
520  else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
521  else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
522  else if(iid == IID_##interface17) *ppv = static_cast<interface17*>(this); \
523  else if(iid == IID_##interface18) *ppv = static_cast<interface18*>(this); \
524  else return P6R::eNoInterface; \
525  reinterpret_cast<p6ICom*>(*ppv)->addref(); \
526  return P6R::eOk; \
527 } \
528 P6_IMPLEMENT_THREADSAFE_ADDREF(classname) \
529 P6_IMPLEMENT_THREADSAFE_RELEASE(classname) \
530 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
531 
532 
533 
555 #define P6_REFCOUNTED_CREATEINSTANCE(classname) \
556 static P6R::P6ERR createInstance(classname **ppNewComponent) \
557 { \
558  P6R::P6ERR err; \
559  classname *pObj = NULL; \
560  if(NULL == ppNewComponent) \
561  return P6R::eAccessFault; \
562  *ppNewComponent = NULL; \
563  if(NULL == (pObj = new (std::nothrow) classname())) { \
564  *ppNewComponent = NULL; \
565  return P6R::eNoMemory; \
566  } \
567  pObj->addref(); \
568  if(1 == pObj->m_cRef.value) { \
569  (*ppNewComponent) = pObj; \
570  (*ppNewComponent)->addref(); \
571  err = P6R::eOk; \
572  } \
573  else { \
574  err = P6R::eInvalidRefcount; \
575  } \
576  pObj->release(); \
577  return err; \
578 }
579 
592 #define P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
593 P6COMMETHOD_(P6R::P6INT32) addref() { \
594  P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
595  P6R::p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
596  return tmp; \
597 } \
598 
599 
611 #define P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
612 P6COMMETHOD_(P6R::P6INT32) release() { \
613  P6ASSERT(0 != m_cRef.value); \
614  P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
615  P6R::p6TraceRelease(#classname,this,tmp,NULL); \
616  if(0 == tmp) { delete this; } \
617  return tmp; \
618 }
619 
648 #define P6_REFCOUNTED(classname) \
649 P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
650 P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
651 P6_REFCOUNTED_CREATEINSTANCE(classname) \
652 P6R::P6AUTO_INT32 m_cRef
653 
654 
656 #define P6REFCOUNTEDCLASS(classname) \
657 public: \
658  P6COMMETHOD_(P6R::P6INT32) addref() \
659  { P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
660  P6R::p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
661  return tmp; } \
662  P6COMMETHOD_(P6R::P6INT32) release() \
663  { P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
664  P6R::p6TraceRelease(#classname,this,tmp,NULL); \
665  if(0 == tmp) { delete this; } \
666  return tmp; } \
667  P6R::P6AUTO_INT32 m_cRef
668 
669 
670 
671 
681 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
682 
683 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
684  { \
685  &(cid), \
686  (P6CREATEINST) (createInst), \
687  (name), \
688  (const P6CATEGORYDATA*)(categories), \
689  (catcnt) \
690  }
691 
692 #define P6END_COMPONENT_TABLE() }; \
693 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
694 
695 
696 
697 
698 #define P6BEGIN_CATAGORY_TABLE(table_name) static const P6CATEGORYDATA table_name[] = {
699 
700 #define P6ADD_CATAGORY(catid,catagory_name) \
701  { \
702  ((const P6R::P6CATID*)&(CATID_##catid)), \
703  (catagory_name) \
704  }
705 
706 #define P6END_CATAGORY_TABLE(table_name) }; \
707 static P6R::P6UINT32 table_name##SZ = sizeof(table_name) / sizeof(P6CATEGORYDATA)
708 
709 
710 
711 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
712 static P6R::P6INT32 g_cActiveComponents = 0; \
713 extern "C" P6EXPORT P6R::P6ERR P6CCALL p6GetIModule(P6R::p6IModule **ppModule) \
714 { \
715  return p6GlueGetIModule(&g_sComponentDataArray[0], \
716  g_cComponentDataEntries, \
717  &g_cActiveComponents, \
718  ppModule,(verInfo),(dllStart),(dllEnd)); \
719 }
720 
721 
726 
727 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,NULL)
728 #define P6TRACEDTOR() p6TraceDTOR("",this,NULL)
729 
732 #endif // __cplusplus
733 #endif
734 
P6COM definitions and interfaces.