VMCFClass.h

Go to the documentation of this file.
00001 /* **********************************************************
00002  * Copyright 2007 VMware, Inc.  All rights reserved. -- VMware Confidential
00003  * **********************************************************/
00004 
00031 #undef VMCF_EXTERN
00032 #if defined(VMCF_IMPL)
00033 #   if defined(_WIN32)
00034 #      define VMCF_EXTERN __declspec(dllexport)
00035 #   elif defined(GCC_EXPLICIT_EXPORT)
00036 #      define VMCF_EXTERN __attribute__((visibility("default")))
00037 #   else
00038 #      define VMCF_EXTERN
00039 #   endif
00040 #else
00041 #   define VMCF_EXTERN extern
00042 #endif
00043 
00044 
00045 #ifndef _VMCF_CLASS_H_
00046 #define _VMCF_CLASS_H_
00047 
00053 /*
00054  * The following macros (inside the INTERNAL section) are intended for internal
00055  * use only. They mostly handle the needed macro redirection to resolve all
00056  * the names passed as macro arguments.
00057  */
00058 
00059 
00060 #define __VMCF_PROTO_ALLOC(klass)                         \
00061 void                                                      \
00062 klass ## Impl_alloc(klass self,                           \
00063                     size_t extraInstanceDataSize,         \
00064                     CORBA_string name,                    \
00065                     void *server,                         \
00066                     VMCFCore_CFObject parent,             \
00067                     CORBA_Environment *env)
00068 
00069 #define _VMCF_PROTO_ALLOC(klass) __VMCF_PROTO_ALLOC(klass)
00070 
00071 
00094 #define VMCF_PROTO_ALLOC(klass) _VMCF_PROTO_ALLOC(klass)
00095 
00096 
00097 /* Finalizer helper macros. */
00098 
00099 #define __VMCF_PROTO_FINI(klass)                          \
00100 void                                                      \
00101 klass ## Impl_finalize(void *instData)
00102 
00103 #define _VMCF_PROTO_FINI(klass) __VMCF_PROTO_FINI(klass)
00104 
00121 #define VMCF_PROTO_FINI(klass) _VMCF_PROTO_FINI(klass)
00122 
00123 
00124 /* getSubinstanceData helper macros. */
00125 
00126 #define __VMCF_PROTO_SUBINST(klass)                       \
00127 void *                                                    \
00128 klass ## Impl_getSubinstanceData(void *instData)
00129 
00130 #define _VMCF_PROTO_SUBINST(klass) __VMCF_PROTO_SUBINST(klass)
00131 
00132 
00147 #define VMCF_PROTO_SUBINST(klass) _VMCF_PROTO_SUBINST(klass)
00148 
00149 
00150 /* Constructor helper macros. */
00151 
00152 #define __VMCF_PROTO_CTOR(klass)                          \
00153 klass                                                     \
00154 klass ## Impl_create(CORBA_string name,                   \
00155                      void *server,                        \
00156                      CORBA_boolean bind,                  \
00157                      VMCFCore_CFObject parent,            \
00158                      CORBA_Environment *env)
00159 
00160 #define _VMCF_PROTO_CTOR(klass) __VMCF_PROTO_CTOR(klass)
00161 
00162 
00185 #define VMCF_PROTO_CTOR(klass) _VMCF_PROTO_CTOR(klass)
00186 
00187 
00188 /* Initializer helper macros. */
00189 
00190 #define __VMCF_PROTO_INIT(klass, args) void klass ## Impl_init args
00191 
00192 #define _VMCF_PROTO_INIT(klass, args) __VMCF_PROTO_INIT(klass, args)
00193 
00194 
00195 #include <stdio.h>
00196 #include <string.h>
00197 
00198 #define _ILU_CORBA_OBJECT  "ilu--corba-native-object:"
00199 
00200 /* Instance type helper macros. */
00201 
00202 #define __VMCF_INSTANCE_TYPE(klass) klass ## Instance
00203 
00204 #define _VMCF_INSTANCE_TYPE(klass) __VMCF_INSTANCE_TYPE(klass)
00205 
00206 /* Helper macros for chaining calls. */
00207 
00208 #define __VMCF_CHAIN_TO_SUPER(prefix, super, function, args) \
00209    prefix ## super ## function args
00210 
00211 #define _VMCF_CHAIN_TO_SUPER(prefix, super, function, args) \
00212    __VMCF_CHAIN_TO_SUPER(prefix, super, function, args)
00213 
00214 #define VMCF_CHAIN_TO_SUPER(prefix, function, args) \
00215    _VMCF_CHAIN_TO_SUPER(prefix, VMCF_SUPERCLASS, function, args)
00216 
00217 
00218 /* Chaining macros for the base CFObject interface methods. */
00219 
00220 #define __VMCF_DEFINE_CHAINED_GET_NAME(klass)                   \
00221 CORBA_string                                                    \
00222 server_ ## klass ## __get_name(klass self,                      \
00223                                CORBA_Environment *env)          \
00224 {                                                               \
00225    return VMCF_CHAIN_TO_SUPER_SERVER(_get_name, (self, env));   \
00226 }
00227 
00228 #define _VMCF_DEFINE_CHAINED_GET_NAME(klass) \
00229    __VMCF_DEFINE_CHAINED_GET_NAME(klass)
00230 
00231 
00232 #define __VMCF_DEFINE_CHAINED_PROBE(klass)           \
00233 void                                                 \
00234 server_ ## klass ## _probe(klass self,               \
00235                            CORBA_Environment *env)   \
00236 {                                                    \
00237    VMCF_CHAIN_TO_SUPER_SERVER(probe, (self, env));   \
00238 }
00239 
00240 #define _VMCF_DEFINE_CHAINED_PROBE(klass) \
00241    __VMCF_DEFINE_CHAINED_PROBE(klass)
00242 
00243 
00244 /* Definition of auto-generated functions (create/alloc/subinstance). */
00245 
00246 #define __VMCF_DEFINE_CTOR_BODY(module, klass)                            \
00247 {                                                                         \
00248    CORBA_string corbalocName = NULL;                                      \
00249    klass self;                                                            \
00250                                                                           \
00251    VMCF_ASSERT_ARG(server, env, return NULL);                             \
00252                                                                           \
00253    module ## __InitializeServer();                                        \
00254    klass ##  __SetDefaultClassFinalization(klass ## Impl_finalize);       \
00255                                                                           \
00256    if (bind) {                                                            \
00257       size_t len;                                                         \
00258       VMCF_ASSERT_ARG(name != NULL, env, return NULL);                    \
00259       len = strlen(_ILU_CORBA_OBJECT) + strlen(name) + 1;                 \
00260       corbalocName = CORBA_string_alloc((CORBA_unsigned_long)len);        \
00261       VMCF_ASSERT_ALLOC(corbalocName, env, return NULL);                  \
00262       snprintf(corbalocName, len, _ILU_CORBA_OBJECT "%s", name);          \
00263    }                                                                      \
00264                                                                           \
00265    self = klass ## __CreateTrue(corbalocName,                             \
00266                                 (ILU_C_Server)server,                     \
00267                                 NULL);                                    \
00268    CORBA_free(corbalocName);                                              \
00269    VMCF_ASSERT_ALLOC(self, env, return NULL);                             \
00270    klass ## Impl_alloc(self, 0, (name), (server), (parent), env);         \
00271    return self;                                                           \
00272 }
00273 
00274 #define _VMCF_DEFINE_CTOR_BODY(module, klass) \
00275    __VMCF_DEFINE_CTOR_BODY(module, klass)
00276 
00278 #define VMCF_DEFINE_CTOR           \
00279    VMCF_PROTO_CTOR(VMCF_THISCLASS) \
00280    _VMCF_DEFINE_CTOR_BODY(VMCF_THISMODULE, VMCF_THISCLASS)
00281 
00282 
00283 #define __VMCF_DEFINE_ALLOC_BODY(instType)                                \
00284 {                                                                         \
00285    instType *inst;                                                        \
00286    VMCF_CHAIN_TO_SUPER_IMPL(alloc,                                        \
00287       (self, (extraInstanceDataSize + sizeof *inst),                      \
00288        name, server, parent, env));                                       \
00289    if (VMCF_EXCEPTION_RAISED(env)) {                                      \
00290       return;                                                             \
00291    }                                                                      \
00292 }
00293 
00294 #define _VMCF_DEFINE_ALLOC_BODY(instType) \
00295    __VMCF_DEFINE_ALLOC_BODY(instType)
00296 
00298 #define VMCF_DEFINE_ALLOC          \
00299   VMCF_PROTO_ALLOC(VMCF_THISCLASS) \
00300    _VMCF_DEFINE_ALLOC_BODY(VMCF_INSTANCE_TYPE)
00301 
00302 
00303 #define __VMCF_DEFINE_SUBINST_BODY(instType)                                  \
00304 {                                                                             \
00305    char *myData;                                                              \
00306    myData = (char *)VMCF_CHAIN_TO_SUPER_IMPL(getSubinstanceData, (instData)); \
00307    return myData + sizeof (instType);                                         \
00308 }
00309 
00310 #define _VMCF_DEFINE_SUBINST_BODY(instType) \
00311    __VMCF_DEFINE_SUBINST_BODY(instType)
00312 
00314 #define VMCF_DEFINE_SUBINST           \
00315    VMCF_PROTO_SUBINST(VMCF_THISCLASS) \
00316    _VMCF_DEFINE_SUBINST_BODY(VMCF_INSTANCE_TYPE)
00317 
00331 #define VMCF_DECLARE_CLASS(klass, initArgs)     \
00332 VMCF_EXTERN VMCF_PROTO_ALLOC(klass);            \
00333                                                 \
00334 VMCF_EXTERN VMCF_PROTO_FINI(klass);             \
00335                                                 \
00336 VMCF_EXTERN VMCF_PROTO_SUBINST(klass);          \
00337                                                 \
00338 VMCF_EXTERN VMCF_PROTO_CTOR(klass);             \
00339                                                 \
00340 VMCF_EXTERN _VMCF_PROTO_INIT(klass, initArgs);
00341 
00342 
00360 #define VMCF_DEFINE_FINI_BEGIN                                       \
00361 VMCF_PROTO_FINI(VMCF_THISCLASS)                                      \
00362 {                                                                    \
00363    VMCF_INSTANCE_TYPE *inst = VMCF_GET_SUBINSTANCE_DATA((instData)); \
00364    if (!inst) {                                                      \
00365       return;                                                        \
00366    }
00367 
00368 
00376 #define VMCF_DEFINE_FINI_END                       \
00377    VMCF_CHAIN_TO_SUPER_IMPL(finalize, (instData)); \
00378 }
00379 
00380 
00399 #define VMCF_PROTO_INIT(args) _VMCF_PROTO_INIT(VMCF_THISCLASS, args)
00400 
00401 
00424 #define VMCF_INIT_EPILOGUE(self, activate, env) {           \
00425    if (self) {                                              \
00426       if (VMCF_EXCEPTION_RAISED((env))) {                   \
00427          CORBA_Environment _lenv = { CORBA_NO_EXCEPTION };  \
00428          CORBA_Object_release((self), &_lenv);              \
00429          CORBA_exception_free(&_lenv);                      \
00430       } else if (activate) {                                \
00431          ilu_ActivateObject(self->iluco_ko);                \
00432       }                                                     \
00433    }                                                        \
00434 }
00435 
00436 
00445 #define VMCF_INSTANCE_TYPE _VMCF_INSTANCE_TYPE(VMCF_THISCLASS)
00446 
00447 
00456 #define VMCF_CHAIN_TO_SUPER_SERVER(function, args) \
00457    VMCF_CHAIN_TO_SUPER(server_, _ ## function, args)
00458 
00459 
00467 #define VMCF_CHAIN_TO_SUPER_IMPL(function, args) \
00468    VMCF_CHAIN_TO_SUPER(, Impl_ ## function, args)
00469 
00470 
00477 #define VMCF_USER_DATA(self) (((ILU_C_Object *)(self))->instanceData)
00478 
00479 
00487 #define VMCF_GET_SUBINSTANCE_DATA(data) \
00488    VMCF_CHAIN_TO_SUPER_IMPL(getSubinstanceData, (data))
00489 
00490 
00498 #define VMCF_GET_SELF_DATA(self) \
00499    VMCF_GET_SUBINSTANCE_DATA(VMCF_USER_DATA(self))
00500 
00501 
00509 #define VMCF_DEFINE_CHAINED_GET_NAME \
00510    _VMCF_DEFINE_CHAINED_GET_NAME(VMCF_THISCLASS)
00511 
00512 
00520 #define VMCF_DEFINE_CHAINED_PROBE \
00521    _VMCF_DEFINE_CHAINED_PROBE(VMCF_THISCLASS)
00522 
00523 
00529 #define VMCF_DEFINE_CLASS \
00530    VMCF_DEFINE_CTOR       \
00531    VMCF_DEFINE_ALLOC      \
00532    VMCF_DEFINE_SUBINST
00533 
00534 
00535 #endif /* _VMCF_CLASS_H_*/
00536 

Generated on Tue Dec 22 15:48:41 2009 for VMCF by  doxygen 1.5.3