p6comhlpr.h

Go to the documentation of this file.
00001 
00010 #ifndef P6COMHLPR_H__
00011 #define P6COMHLPR_H__ 1
00012 
00013 #ifdef DOX_IGNORE
00014 #include "p6com.h"   
00015 #endif
00016 
00017 #ifdef  __cplusplus
00018 extern "C" {
00019 #endif
00020             
00030 #define VALIDATEIF(type,ptr) IID_##type, reinterpret_cast<P6R::P6VOID**>(static_cast<type**>(ptr))
00031 
00032 #define P6_DECL_ICOM                                                                \
00033    P6COMMETHOD                   queryInterface(const P6R::IID &iid,P6R::P6VOID **ppIface);\
00034    P6COMMETHOD_(P6R::P6INT32)    addref();                                          \
00035    P6COMMETHOD_(P6R::P6INT32)    release();                                         \
00036    static P6R::P6ERR             createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent); \
00037    P6R::P6INT32                  m_cRef;                                            \
00038    P6R::P6UINT32                 m_p6SerialNumberp6;
00039 
00040 
00041 #define P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)                      \
00042 P6R::P6ERR  classname::createInstance(P6R::p6ICom *pOuter,const P6R::IID &iid,P6R::P6VOID **ppNewComponent) \
00043 {                                                                          \
00044    P6R::P6ERR err;                                                         \
00045    classname *pObj = NULL;                                                 \
00046    if(NULL != pOuter)                                                      \
00047       return P6R::eNoAgregation;                                           \
00048    if(NULL == ppNewComponent)                                              \
00049       return P6R::eAccessFault;                                            \
00050    *ppNewComponent = NULL;                                                 \
00051    if(NULL == (pObj = new classname())) {                                  \
00052       *ppNewComponent = NULL;                                              \
00053       return P6R::eNoMemory;                                               \
00054    }                                                                       \
00055    pObj->addref();                                                         \
00056    if(1 == pObj->m_cRef) {                                                 \
00057       err = pObj->queryInterface(iid,ppNewComponent);                      \
00058    }                                                                       \
00059    else {                                                                  \
00060       err = eInvalidRefcount;                                              \
00061    }                                                                       \
00062    pObj->release();                                                        \
00063    return err;                                                             \
00064 }
00065 
00066 #define P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                          \
00067 P6R::P6INT32 classname::addref() {                                         \
00068    P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef);                              \
00069    p6TraceAddref(#classname,sizeof(*this),this,tmp,&m_p6SerialNumberp6);   \
00070    return tmp;                                                             \
00071 }                                                                          \
00072 
00073 #define P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                         \
00074 P6R::P6INT32 classname::release() {                                        \
00075    P6ASSERT(0 != m_cRef);                                                  \
00076    P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef);                              \
00077    p6TraceRelease(#classname,this,tmp,&m_p6SerialNumberp6);                \
00078    if(0 == tmp) { delete this; }                                           \
00079    return tmp;                                                             \
00080 }
00081 
00082 #define P6_IMPLEMENT_ICOM1(classname,interface1)                           \
00083 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv)      \
00084 {                                                                          \
00085    if(!ppv)                                                                \
00086       return P6R::eAccessFault;                                            \
00087    *ppv = NULL;                                                            \
00088    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00089    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00090    else                             return P6R::eNoInterface;              \
00091    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00092    return P6R::eOk;                                                        \
00093 }                                                                          \
00094 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00095 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00096 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00097 
00098 #define P6_IMPLEMENT_ICOM2(classname,interface1,interface2)                \
00099 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {      \
00100    if(!ppv)                                                                \
00101       return P6R::eAccessFault;                                            \
00102    *ppv = NULL;                                                            \
00103    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00104    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00105    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00106    else                             return P6R::eNoInterface;              \
00107    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00108    return P6R::eOk;                                                        \
00109 }                                                                          \
00110 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00111 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00112 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00113 
00114 #define P6_IMPLEMENT_ICOM3(classname,interface1,interface2,interface3)     \
00115 P6R::P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {      \
00116    if(!ppv)                                                                \
00117       return P6R::eAccessFault;                                            \
00118    *ppv = NULL;                                                            \
00119    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00120    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00121    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00122    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00123    else                             return P6R::eNoInterface;              \
00124    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00125    return P6R::eOk;                                                        \
00126 }                                                                          \
00127 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00128 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00129 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00130 
00131 #define P6_IMPLEMENT_ICOM4(classname,interface1,interface2,interface3,interface4) \
00132 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00133    if(!ppv)                                                                \
00134       return P6R::eAccessFault;                                            \
00135    *ppv = NULL;                                                            \
00136    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00137    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00138    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00139    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00140    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00141    else                             return P6R::eNoInterface;              \
00142    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00143    return P6R::eOk;                                                        \
00144 }                                                                          \
00145 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00146 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00147 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00148 
00149 #define P6_IMPLEMENT_ICOM5(classname,interface1,interface2,interface3,interface4,interface5) \
00150 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00151    if(!ppv)                                                                \
00152       return P6R::eAccessFault;                                            \
00153    *ppv = NULL;                                                            \
00154    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00155    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00156    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00157    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00158    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00159    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00160    else                             return P6R::eNoInterface;              \
00161    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00162    return P6R::eOk;                                                        \
00163 }                                                                          \
00164 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00165 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00166 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00167 
00168 #define P6_IMPLEMENT_ICOM6(classname,interface1,interface2,interface3,interface4,interface5,interface6) \
00169 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00170    if(!ppv)                                                                \
00171       return P6R::eAccessFault;                                            \
00172    *ppv = NULL;                                                            \
00173    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00174    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00175    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00176    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00177    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00178    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00179    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00180    else                             return P6R::eNoInterface;              \
00181    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00182    return P6R::eOk;                                                        \
00183 }                                                                          \
00184 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00185 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00186 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00187 
00188 #define P6_IMPLEMENT_ICOM7(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7) \
00189 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00190    if(!ppv)                                                                \
00191       return P6R::eAccessFault;                                            \
00192    *ppv = NULL;                                                            \
00193    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00194    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00195    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00196    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00197    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00198    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00199    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00200    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00201    else                             return P6R::eNoInterface;              \
00202    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00203    return P6R::eOk;                                                        \
00204 }                                                                          \
00205 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00206 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00207 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00208 
00209 #define P6_IMPLEMENT_ICOM8(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8) \
00210 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00211    if(!ppv)                                                                \
00212       return P6R::eAccessFault;                                            \
00213    *ppv = NULL;                                                            \
00214    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00215    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00216    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00217    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00218    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00219    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00220    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00221    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00222    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00223    else                             return P6R::eNoInterface;              \
00224    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00225    return P6R::eOk;                                                        \
00226 }                                                                          \
00227 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00228 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00229 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00230 
00231 #define P6_IMPLEMENT_ICOM9(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9) \
00232 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00233    if(!ppv)                                                                \
00234       return P6R::eAccessFault;                                            \
00235    *ppv = NULL;                                                            \
00236    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00237    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00238    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00239    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00240    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00241    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00242    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00243    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00244    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00245    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00246    else                             return P6R::eNoInterface;              \
00247    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00248    return P6R::eOk;                                                        \
00249 }                                                                          \
00250 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00251 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00252 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00253 
00254 #define P6_IMPLEMENT_ICOM10(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10) \
00255 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00256    if(!ppv)                                                                \
00257       return P6R::eAccessFault;                                            \
00258    *ppv = NULL;                                                            \
00259    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00260    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00261    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00262    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00263    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00264    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00265    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00266    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00267    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00268    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00269    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00270    else                             return P6R::eNoInterface;              \
00271    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00272    return P6R::eOk;                                                        \
00273 }                                                                          \
00274 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00275 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00276 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00277 
00278 #define P6_IMPLEMENT_ICOM11(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11) \
00279 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00280    if(!ppv)                                                                \
00281       return P6R::eAccessFault;                                            \
00282    *ppv = NULL;                                                            \
00283    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00284    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00285    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00286    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00287    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00288    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00289    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00290    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00291    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00292    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00293    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00294    else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00295    else                             return P6R::eNoInterface;              \
00296    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00297    return P6R::eOk;                                                        \
00298 }                                                                          \
00299 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00300 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00301 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00302 
00303 #define P6_IMPLEMENT_ICOM12(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12) \
00304 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00305    if(!ppv)                                                                \
00306       return P6R::eAccessFault;                                            \
00307    *ppv = NULL;                                                            \
00308    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00309    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00310    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00311    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00312    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00313    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00314    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00315    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00316    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00317    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00318    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00319    else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00320    else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00321    else                             return P6R::eNoInterface;              \
00322    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00323    return P6R::eOk;                                                        \
00324 }                                                                          \
00325 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00326 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00327 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00328 
00329 #define P6_IMPLEMENT_ICOM13(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13) \
00330 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00331    if(!ppv)                                                                \
00332       return P6R::eAccessFault;                                            \
00333    *ppv = NULL;                                                            \
00334    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00335    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00336    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00337    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00338    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00339    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00340    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00341    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00342    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00343    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00344    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00345    else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00346    else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00347    else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00348    else                             return P6R::eNoInterface;              \
00349    reinterpret_cast<p6ICom*>(*ppv)->addref();                                \
00350    return P6R::eOk;                                                        \
00351 }                                                                          \
00352 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00353 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00354 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00355 
00356 #define P6_IMPLEMENT_ICOM14(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14) \
00357 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00358    if(!ppv)                                                                \
00359       return P6R::eAccessFault;                                            \
00360    *ppv = NULL;                                                            \
00361    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00362    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00363    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00364    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00365    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00366    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00367    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00368    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00369    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00370    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00371    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00372    else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00373    else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00374    else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00375    else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00376    else                             return P6R::eNoInterface;              \
00377    reinterpret_cast<p6ICom*>(*ppv)->addref();                              \
00378    return P6R::eOk;                                                        \
00379 }                                                                          \
00380 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00381 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00382 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00383 
00384 #define P6_IMPLEMENT_ICOM15(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15) \
00385 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00386    if(!ppv)                                                                \
00387       return P6R::eAccessFault;                                            \
00388    *ppv = NULL;                                                            \
00389    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00390    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00391    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00392    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00393    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00394    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00395    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00396    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00397    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00398    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00399    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00400    else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00401    else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00402    else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00403    else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00404    else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
00405    else                             return P6R::eNoInterface;              \
00406    reinterpret_cast<p6ICom*>(*ppv)->addref();                              \
00407    return P6R::eOk;                                                        \
00408 }                                                                          \
00409 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00410 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00411 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00412 
00413 #define P6_IMPLEMENT_ICOM16(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16) \
00414 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00415    if(!ppv)                                                                \
00416       return P6R::eAccessFault;                                            \
00417    *ppv = NULL;                                                            \
00418    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00419    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00420    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00421    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00422    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00423    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00424    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00425    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00426    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00427    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00428    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00429    else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00430    else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00431    else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00432    else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00433    else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
00434    else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
00435    else                             return P6R::eNoInterface;              \
00436    reinterpret_cast<p6ICom*>(*ppv)->addref();                              \
00437    return P6R::eOk;                                                        \
00438 }                                                                          \
00439 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00440 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00441 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00442 
00443 #define P6_IMPLEMENT_ICOM17(classname,interface1,interface2,interface3,interface4,interface5,interface6,interface7,interface8,interface9,interface10,interface11,interface12,interface13,interface14,interface15,interface16,interface17) \
00444 P6ERR classname::queryInterface(const P6R::IID &iid, P6R::P6VOID** ppv) {           \
00445    if(!ppv)                                                                \
00446       return P6R::eAccessFault;                                            \
00447    *ppv = NULL;                                                            \
00448    if(iid == IID_p6ICom)            *ppv = static_cast<interface1*>(this); \
00449    else if(iid == IID_##interface1) *ppv = static_cast<interface1*>(this); \
00450    else if(iid == IID_##interface2) *ppv = static_cast<interface2*>(this); \
00451    else if(iid == IID_##interface3) *ppv = static_cast<interface3*>(this); \
00452    else if(iid == IID_##interface4) *ppv = static_cast<interface4*>(this); \
00453    else if(iid == IID_##interface5) *ppv = static_cast<interface5*>(this); \
00454    else if(iid == IID_##interface6) *ppv = static_cast<interface6*>(this); \
00455    else if(iid == IID_##interface7) *ppv = static_cast<interface7*>(this); \
00456    else if(iid == IID_##interface8) *ppv = static_cast<interface8*>(this); \
00457    else if(iid == IID_##interface9) *ppv = static_cast<interface9*>(this); \
00458    else if(iid == IID_##interface10) *ppv = static_cast<interface10*>(this); \
00459    else if(iid == IID_##interface11) *ppv = static_cast<interface11*>(this); \
00460    else if(iid == IID_##interface12) *ppv = static_cast<interface12*>(this); \
00461    else if(iid == IID_##interface13) *ppv = static_cast<interface13*>(this); \
00462    else if(iid == IID_##interface14) *ppv = static_cast<interface14*>(this); \
00463    else if(iid == IID_##interface15) *ppv = static_cast<interface15*>(this); \
00464    else if(iid == IID_##interface16) *ppv = static_cast<interface16*>(this); \
00465    else if(iid == IID_##interface17) *ppv = static_cast<interface17*>(this); \
00466    else                             return P6R::eNoInterface;              \
00467    reinterpret_cast<p6ICom*>(*ppv)->addref();                              \
00468    return P6R::eOk;                                                        \
00469 }                                                                          \
00470 P6_IMPLEMENT_THREADSAFE_ADDREF(classname)                                  \
00471 P6_IMPLEMENT_THREADSAFE_RELEASE(classname)                                 \
00472 P6_IMPLEMENT_CREATEINSTANCE_NO_AGG(classname)
00473 
00474 
00475 #define P6REFCOUNTEDCLASS                                                  \
00476 public:                                                                    \
00477    P6COMMETHOD_(P6R::P6INT32) addref()                                     \
00478    { P6R::P6INT32 tmp = p6AtomicInc32(&m_cRef.value); return tmp; }        \
00479    P6COMMETHOD_(P6R::P6INT32) release()                                    \
00480    { P6R::P6INT32 tmp = p6AtomicDec32(&m_cRef.value); if(0 == tmp) { delete this; } return tmp; } \
00481 protected:                                                                 \
00482    P6R::P6AUTO_INT32                   m_cRef;                             \
00483    P6R::P6UINT32                       m_p6SerialNumberp6;                 \
00484 public:
00485 
00486 
00490 #define P6BEGIN_COMPONENT_TABLE() static P6COMPONENTDATA  g_sComponentDataArray[] = { 
00491 
00492 #define P6END_COMPONENT_TABLE() };                                                                    \
00493 static P6R::P6INT32 g_cComponentDataEntries = sizeof(g_sComponentDataArray) / sizeof(P6COMPONENTDATA)
00494 
00495 #define P6IMPLEMENT_GETIMODULE(verInfo,dllStart,dllEnd)                    \
00496 static P6R::P6INT32 g_cActiveComponents = 0;                               \
00497 extern "C" P6EXPORT P6R::P6ERR p6GetIModule(P6R::p6IModule **ppModule)     \
00498 {                                                                          \
00499    return p6GlueGetIModule(&g_sComponentDataArray[0],                      \
00500                         g_cComponentDataEntries,                           \
00501                         &g_cActiveComponents,                              \
00502                         ppModule,(verInfo),(dllStart),(dllEnd));           \
00503 }
00504 
00505 #define P6ADD_COMPONENT(cid,createInst,name,categories,catcnt) \
00506    {                                                           \
00507       &(cid),                                                  \
00508       (P6CREATEINST) (createInst),                             \
00509       (name),                                                  \
00510       (categories),                                            \
00511       (catcnt)                                                 \
00512    }
00513 
00518 
00519 
00520 #define P6ENABLECLASSTRACE    P6R::P6UINT32 m_p6SerialNumberp6
00521 #define P6TRACECTOR(c)        p6TraceCTOR(#c,sizeof(*this),this,&m_p6SerialNumberp6)
00522 #define P6TRACEDTOR(c)        p6TraceDTOR(#c,this,&m_p6SerialNumberp6)
00523 
00527 #ifdef  __cplusplus
00528 }
00529 #endif
00530 
00531 #endif
00532 
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines
Copyright © 2004 - 2010 P6R Inc. - All Rights Reserved.