00001
00002
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
00055
00056
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
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
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
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
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
00201
00202 #define __VMCF_INSTANCE_TYPE(klass) klass ## Instance
00203
00204 #define _VMCF_INSTANCE_TYPE(klass) __VMCF_INSTANCE_TYPE(klass)
00205
00206
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
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
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
00536