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 
520 #define P6_REFCOUNTED_CREATEINSTANCE(classname) \
521 static P6R::P6ERR createInstance(classname **ppNewComponent) \
522 { \
523  P6R::P6ERR err; \
524  classname *pObj = NULL; \
525  if(NULL == ppNewComponent) \
526  return P6R::eAccessFault; \
527  *ppNewComponent = NULL; \
528  if(NULL == (pObj = new (std::nothrow) classname())) { \
529  *ppNewComponent = NULL; \
530  return P6R::eNoMemory; \
531  } \
532  pObj->addref(); \
533  if(1 == pObj->m_cRef.value) { \
534  (*ppNewComponent) = pObj; \
535  (*ppNewComponent)->addref(); \
536  err = P6R::eOk; \
537  } \
538  else { \
539  err = P6R::eInvalidRefcount; \
540  } \
541  pObj->release(); \
542  return err; \
543 }
544 
557 #define P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
558 P6COMMETHOD_(P6R::P6INT32) addref() { \
559  P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
560  P6R::p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
561  return tmp; \
562 } \
563 
564 
576 #define P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
577 P6COMMETHOD_(P6R::P6INT32) release() { \
578  P6ASSERT(0 != m_cRef.value); \
579  P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
580  P6R::p6TraceRelease(#classname,this,tmp,NULL); \
581  if(0 == tmp) { delete this; } \
582  return tmp; \
583 }
584 
613 #define P6_REFCOUNTED(classname) \
614 P6_REFCOUNTED_THREADSAFE_ADDREF(classname) \
615 P6_REFCOUNTED_THREADSAFE_RELEASE(classname) \
616 P6_REFCOUNTED_CREATEINSTANCE(classname) \
617 P6R::P6AUTO_INT32 m_cRef
618 
619 
621 #define P6REFCOUNTEDCLASS(classname) \
622 public: \
623  P6COMMETHOD_(P6R::P6INT32) addref() \
624  { P6R::P6INT32 tmp = P6R::p6AtomicInc32(&m_cRef.value); \
625  P6R::p6TraceAddref(#classname,sizeof(*this),this,tmp,NULL); \
626  return tmp; } \
627  P6COMMETHOD_(P6R::P6INT32) release() \
628  { P6R::P6INT32 tmp = P6R::p6AtomicDec32(&m_cRef.value); \
629  P6R::p6TraceRelease(#classname,this,tmp,NULL); \
630  if(0 == tmp) { delete this; } \
631  return tmp; } \
632  P6R::P6AUTO_INT32 m_cRef
633 
634 
635 
636 
646 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA g_sComponentDataArray[] = {
647 
648 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
649  { \
650  &(cid), \
651  (P6CREATEINST) (createInst), \
652  (name), \
653  (const P6CATEGORYDATA*)(categories), \
654  (catcnt) \
655  }
656 
657 #define P6END_COMPONENT_TABLE() }; \
658 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
659 
660 
661 
662 
663 #define P6BEGIN_CATAGORY_TABLE(table_name) static const P6CATEGORYDATA table_name[] = {
664 
665 #define P6ADD_CATAGORY(catid,catagory_name) \
666  { \
667  ((const P6R::P6CATID*)&(CATID_##catid)), \
668  (catagory_name) \
669  }
670 
671 #define P6END_CATAGORY_TABLE(table_name) }; \
672 static P6R::P6UINT32 table_name##SZ = sizeof(table_name) / sizeof(P6CATEGORYDATA)
673 
674 
675 
676 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd) \
677 static P6R::P6INT32 g_cActiveComponents = 0; \
678 extern "C" P6EXPORT P6R::P6ERR P6CCALL p6GetIModule(P6R::p6IModule **ppModule) \
679 { \
680  return p6GlueGetIModule(&g_sComponentDataArray[0], \
681  g_cComponentDataEntries, \
682  &g_cActiveComponents, \
683  ppModule,(verInfo),(dllStart),(dllEnd)); \
684 }
685 
686 
691 
692 #define P6TRACECTOR(c) p6TraceCTOR(#c,sizeof(*this),this,NULL)
693 #define P6TRACEDTOR() p6TraceDTOR("",this,NULL)
694 
697 #endif // __cplusplus
698 #endif
699 
P6COM definitions and interfaces.