00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __DEFINE_RO_H__
00012 #define __DEFINE_RO_H__
00013 #include "RNPlatform/Inc/DLLExportAPI.h"
00014 #include "RNReplicaNet/Inc/DataBlock.h"
00015 #include "RNReplicaNet/Inc/ROConstants.h"
00016 #ifdef REPLICANET_VISUALDEBUGGER
00017 #include "RNXPURL/Inc/XPURL.h"
00018 #include "RNXPURL/Inc/DebugHandler.h"
00019 #include "RNReplicaNet/Inc/RO_RegistryBlock.h"
00020 #include "RNReplicaNet/Inc/ReplicaNet.h"
00021 #endif
00022
00023 #define _MAKE_BASE(x) x
00024 #define _MAKE_RO(x) _RO_##x
00025 #define _GET_RO(x) ::_RO_##x
00026 #define _MAKE_RO_ALLOCFUNC(x) _RO_AllocateFunc_##x
00027 #define _MAKE_RO_DELETEFUNC(x) _RO_DeleteFunc_##x
00028 #define _MAKE_RO_SETCLASSIDFUNC(x) _RO_SetClassIDFunc_##x
00029 #define _MAKE_RO_REGISTERFUNC(x) _RO_RegisterFunc_##x
00030
00031
00032
00033 #ifdef REPLICANET_VISUALDEBUGGER
00034 #define _RO_DODEBUGNAME() \
00035 if (RNReplicaNet::XPURL::GetDebugHandler() && GetRegistryBlock() && GetRegistryBlock()->GetName()) \
00036 { \
00037 _Internal_SetFullyQualifiedName(GetRegistryBlock()->GetName()); \
00038 }
00039 #else
00040 #define _RO_DODEBUGNAME()
00041 #endif
00042
00043
00044
00045 #define _RO_DO_STD_FRAMEWORK(x) \
00046 _RO_BEGINCTOR(x); \
00047 _Internal_GetUpdateType(); \
00048 _Internal_SetupLoadBalance(); \
00049 _Internal_SetupLoadBalanceScore(); \
00050 _Internal_SetupLoadBalanceDefault(); \
00051 _Internal_SetupLoadBalanceScoreDefault(); \
00052 _Internal_SetupPropagateDistance(); \
00053 _Internal_SetupPropagateDistanceDefault(); \
00054 _RO_DODEBUGNAME(); \
00055 _RO_ENDCTOR(x); \
00056 _RO_DTOR(x); \
00057 _RO_DO_ALLOCATE(x); \
00058 _RO_DO_ALLOCATEFUNC(x);
00059
00060
00061
00062
00063 #define _RO_STD_FRAMEWORK(x) \
00064 public: \
00065 _MAKE_RO(x)(); \
00066 virtual ~_MAKE_RO(x)(); \
00067 _RO_DEF_ALLOCATE(x); \
00068 _RO_DO_REGISTER(x); \
00069 _RO_DO_IDS(x); \
00070 _RO_DO_ALLOW_FRIEND(x); \
00071 private:
00072
00073
00074
00075 #define _RO_BEGINCTOR(x) \
00076 int _MAKE_RO(x)::mClassID = kReplicaObjectUnknownClassID; \
00077 RNReplicaNet::s_RO_RegistryBlock *_MAKE_RO(x)::mBoundRegistryBlock = 0; \
00078 bool _MAKE_RO(x)::mRegistered = false; \
00079 _MAKE_RO(x)::_MAKE_RO(x)() \
00080 {
00081
00082
00083
00084 #define _RO_ENDCTOR(x) \
00085 }
00086
00087
00088
00089 #define _RO_DTOR(x) \
00090 _MAKE_RO(x)::~_MAKE_RO(x)() \
00091 { \
00092 }
00093
00094
00095
00096
00097
00098 #define _RO_DO_REPLICAOBJECT_MAKERELIABLE() \
00099 protected: \
00100 virtual void _Internal_GetUpdateType(void) \
00101 { \
00102 UpdateSetReliable(); \
00103 } \
00104 public:
00105
00106
00107
00108 #define _RO_DO_REPLICAOBJECT_MAKECERTAIN() \
00109 protected: \
00110 virtual void _Internal_GetUpdateType(void) \
00111 { \
00112 UpdateSetCertain(); \
00113 } \
00114 public:
00115
00116
00117
00118 #define _RO_DO_REPLICAOBJECT_MAKEUNRELIABLE() \
00119 protected: \
00120 virtual void _Internal_GetUpdateType(void) \
00121 { \
00122 UpdateSetUnreliable(); \
00123 } \
00124 public:
00125
00126
00127
00128
00129
00130
00131 #define _RO_DEF_ALLOCATEFUNC(x) \
00132 extern RNReplicaNet::ReplicaObject * _MAKE_RO_ALLOCFUNC(x)(void); \
00133 extern void _MAKE_RO_DELETEFUNC(x)(RNReplicaNet::ReplicaObject *object); \
00134 extern void _MAKE_RO_SETCLASSIDFUNC(x)(int classid,RNReplicaNet::s_RO_RegistryBlock *theBlock); \
00135 extern void _MAKE_RO_REGISTERFUNC(x)(void);
00136
00137
00138
00139 #define _RO_DO_ALLOCATEFUNC(x) \
00140 RNReplicaNet::ReplicaObject * _MAKE_RO_ALLOCFUNC(x)(void) \
00141 { \
00142 return _MAKE_BASE(x)::AllocateForReplicaNet(); \
00143 } \
00144 void _MAKE_RO_DELETEFUNC(x)(RNReplicaNet::ReplicaObject *object) \
00145 { \
00146 _MAKE_BASE(x)::DeleteForReplicaNet(object); \
00147 } \
00148 void _MAKE_RO_SETCLASSIDFUNC(x)(int classid,RNReplicaNet::s_RO_RegistryBlock *theBlock) \
00149 { \
00150 _MAKE_RO(x)::StaticSetClassID(classid,theBlock); \
00151 } \
00152 void _MAKE_RO_REGISTERFUNC(x)(void) \
00153 { \
00154 _MAKE_RO(x)::StaticSetRegistered(true); \
00155 }
00156
00157
00158
00159 #define _RO_DEF_ALLOCATE(x) \
00160 static _MAKE_BASE(x)* _MAKE_RO(x)::AllocateForReplicaNet(); \
00161 static void _MAKE_RO(x)::DeleteForReplicaNet(RNReplicaNet::ReplicaObject *object);
00162
00163
00164
00165 #define _RO_DO_ALLOCATE(x) \
00166 _MAKE_BASE(x)* _MAKE_RO(x)::AllocateForReplicaNet() \
00167 { \
00168 return new _MAKE_BASE(x); \
00169 } \
00170 void _MAKE_RO(x)::DeleteForReplicaNet(RNReplicaNet::ReplicaObject *object) \
00171 { \
00172 delete object; \
00173 }
00174
00175
00176
00177 #define _RO_DO_REGISTER(x) \
00178 public: \
00179 virtual void SetRegistered(bool flag = true) \
00180 { \
00181 mRegistered = flag; \
00182 } \
00183 static void StaticSetRegistered(bool flag = true) \
00184 { \
00185 mRegistered = flag; \
00186 } \
00187 virtual bool GetRegistered(void) \
00188 { \
00189 return mRegistered; \
00190 } \
00191 private: \
00192 static bool mRegistered; \
00193 public:
00194
00195
00196
00197 #define _RO_DO_IDS(x) \
00198 static void StaticSetClassID(const int class_id,RNReplicaNet::s_RO_RegistryBlock *theBlock) \
00199 { \
00200 mClassID = class_id; \
00201 mBoundRegistryBlock = theBlock; \
00202 } \
00203 virtual const int GetClassID(void) \
00204 { \
00205 return mClassID; \
00206 } \
00207 RNReplicaNet::s_RO_RegistryBlock *GetRegistryBlock(void) const \
00208 { \
00209 return mBoundRegistryBlock; \
00210 } \
00211 static int StaticGetClassID(void) \
00212 { \
00213 return mClassID; \
00214 } \
00215 static RNReplicaNet::s_RO_RegistryBlock *StaticGetRegistryBlock(void) \
00216 { \
00217 return mBoundRegistryBlock; \
00218 } \
00219 private: \
00220 static int mClassID; \
00221 static RNReplicaNet::s_RO_RegistryBlock *mBoundRegistryBlock; \
00222 public:
00223
00224
00225
00226 #define _RO_DO_ALLOW_PUBLIC() \
00227 public:
00228
00229
00230
00231 #define _RO_DO_MAKE_PRIVATE() \
00232 private:
00233
00234
00235
00236 #define _RO_DO_ALLOW_FRIEND(x) \
00237 friend class _MAKE_BASE(x);
00238
00239
00240
00241 #define _RO_DO_ALLOW_FRIEND_RO(x) \
00242 friend class _MAKE_RO(x);
00243
00244
00245
00246 #define _RO_DO_PUBLIC_RO(x) \
00247 public _MAKE_RO(x)
00248
00249
00250
00251 #define _RO_DO_APPROVEFAULT() \
00252 public: \
00253 virtual bool ApproveFault(void) \
00254 { \
00255 return true; \
00256 } \
00257 private:
00258
00259
00260
00261 #define _RO_DO_APPROVEMIGRATION() \
00262 public: \
00263 virtual bool ApproveMigration(void) \
00264 { \
00265 return true; \
00266 } \
00267 private:
00268
00269
00270
00271
00272 #define _RO_DO_SETUPLOADBALANCE(x) \
00273 public: \
00274 virtual void _Internal_SetupLoadBalance(void) \
00275 { \
00276 SetLoadBalancing(x); \
00277 } \
00278 private:
00279
00280
00281
00282 #define _RO_DO_SETUPLOADBALANCEDEFAULT(x) \
00283 public: \
00284 virtual void _Internal_SetupLoadBalanceDefault(void) \
00285 { \
00286 SetLoadBalancingDefault(x); \
00287 } \
00288 private:
00289
00290
00291
00292 #define _RO_DO_SETUPLOADBALANCESCORE(x) \
00293 public: \
00294 virtual void _Internal_SetupLoadBalanceScore(void) \
00295 { \
00296 SetLoadScore(x); \
00297 } \
00298 private:
00299
00300
00301
00302 #define _RO_DO_SETUPLOADBALANCESCOREDEFAULT(x) \
00303 public: \
00304 virtual void _Internal_SetupLoadBalanceScoreDefault(void) \
00305 { \
00306 SetLoadScoreDefault(x); \
00307 } \
00308 private:
00309
00310
00311
00312
00313
00314
00315 #define _RO_DO_SETUPPROPAGATEDISTANCE(x) \
00316 public: \
00317 virtual void _Internal_SetupPropagateDistance(void) \
00318 { \
00319 SetPropagateToSessionDistance(x); \
00320 } \
00321 private:
00322
00323
00324
00325 #define _RO_DO_SETUPPROPAGATEDISTANCEDEFAULT(x) \
00326 public: \
00327 virtual void _Internal_SetupPropagateDistanceDefault(void) \
00328 { \
00329 SetPropagateToSessionDistanceDefault(x); \
00330 } \
00331 private:
00332
00333
00334
00335
00336
00337
00338 #define _RO_DEF_REGISTERDATABLOCKS(x) \
00339 void _MAKE_RO(x)::RegisterDataBlocks(void);
00340
00341
00342
00343 #define _RO_DO_BEGINREGISTERDATABLOCKS(x) \
00344 void _MAKE_RO(x)::RegisterDataBlocks(void) \
00345 { \
00346 _MAKE_BASE(x) *basepoint = (_MAKE_BASE(x) *)this; \
00347 basepoint = basepoint;
00348
00349
00350
00351
00352
00353 #ifdef REPLICANET_VISUALDEBUGGER
00354 #define _RO_DO_SETDATABLOCKVARIABLENAME(x) \
00355 datablock->SetVariableName(#x);
00356 #else
00357 #define _RO_DO_SETDATABLOCKVARIABLENAME(x)
00358 #endif
00359
00360
00361
00362
00363 #define _RO_DO_DATABLOCK_MAKERELIABLE() \
00364 datablock->SetReliableFlag(true); \
00365 datablock->SetCertainFlag(false);
00366
00367
00368
00369 #define _RO_DO_DATABLOCK_MAKECERTAIN() \
00370 datablock->SetReliableFlag(false); \
00371 datablock->SetCertainFlag(true);
00372
00373
00374
00375 #define _RO_DO_DATABLOCK_MAKEUNRELIABLE() \
00376 datablock->SetReliableFlag(false); \
00377 datablock->SetCertainFlag(false);
00378
00379
00380
00381 #define _RO_DO_DATABLOCK_MAKEAUTOMATIC() \
00382 datablock->SetAutomaticUpdatesFlag(true);
00383
00384
00385
00386 #define _RO_DO_DATABLOCK_MAKEMANUAL() \
00387 datablock->SetAutomaticUpdatesFlag(false);
00388
00389
00390
00391 #define _RO_DO_DATABLOCK_SETUPDATEDELAYMINIMUM(x) \
00392 datablock->SetUpdateDelayMinimum(x);
00393
00394
00395
00396 #define _RO_DO_DATABLOCK_SETFORCESENDMAXIMUMUPDATES(x) \
00397 datablock->SetForceSendMaximumUpdates(x);
00398
00399
00400
00401 #define _RO_DO_DATABLOCK_SETFORCESENDTIMEDELAY(x) \
00402 datablock->SetForceSendTimeDelay(x);
00403
00404
00405
00406
00407 #define _RO_DO_ENDREGISTERDATABLOCKS(x) \
00408 }
00409
00410
00411
00412
00413
00414 #define _RO_DO_DEFBLOCK_FUNCTION_VAR(x) \
00415 void *mDataBlockFunction_##x; \
00416 static void x(void *classp,void *opaque_message);
00417
00418
00419
00420 #define GLOBAL_FUNCTION_CALL(x) \
00421 {##x ;} \
00422 {Call_##x ;};
00423
00424
00425
00426 #define ALL_REPLICAS_FUNCTION_CALL(x) \
00427 {Call_##x ;};
00428
00429
00430
00431 #define MASTER_FUNCTION_CALL(x) \
00432 {Call_##x ;};
00433
00434
00435
00436 #define NOMINATED_REPLICAS_FUNCTION_CALL(a,b,x) \
00437 DataBlock_Function::SetSessionIDFilter(a,b); \
00438 {Call_##x ;};
00439
00440
00441
00442 #ifdef REPLICANET_VISUALDEBUGGER
00443 #define _RO_DEF_DO_PREDEFREGBLOCK(x) \
00444 theBlock = new RNReplicaNet::s_RO_RegistryBlock(ro_id,objectfuncp,objectfuncp_delete, #x );
00445 #else
00446 #define _RO_DEF_DO_PREDEFREGBLOCK(x) \
00447 theBlock = new RNReplicaNet::s_RO_RegistryBlock(ro_id,objectfuncp,objectfuncp_delete, 0 );
00448 #endif // ifdef REPLICANET_VISUALDEBUGGER
00449
00450 #define _RO_DEF_DO_PREDEF(x) \
00451 _RO_DEF_ALLOCATEFUNC(x); \
00452 objectfuncp = _MAKE_RO_ALLOCFUNC(x); \
00453 objectfuncp_delete = _MAKE_RO_DELETEFUNC(x); \
00454 _RO_DEF_DO_PREDEFREGBLOCK(x); \
00455 _MAKE_RO_SETCLASSIDFUNC(x)(ro_id,theBlock); \
00456 repNet->AddItem(theBlock); \
00457 _MAKE_RO_REGISTERFUNC(x)(); \
00458 ro_id++;
00459
00460
00461
00462
00463 #define _RO_DO_PREREGISTER_FUNC() \
00464 static bool doneregister = false; \
00465 void _ReplicaNetPreRegisterReplicasFunc(RNReplicaNet::ReplicaNet *repNet) \
00466 { \
00467 RNReplicaNet::ReplicaNetDLLRegister thing; \
00468 thing.Call(repNet); \
00469 } \
00470 void RNReplicaNet::ReplicaNetDLLRegister::Call(RNReplicaNet::ReplicaNet *repNet) \
00471 { \
00472 doneregister = true; \
00473 RNReplicaNet::s_RO_RegistryBlock *theBlock = 0; \
00474 RNReplicaNet::p_RO_Func *objectfuncp = 0; \
00475 RNReplicaNet::p_RO_FuncDelete *objectfuncp_delete = 0; \
00476 int ro_id = 0; \
00477 ro_id = ro_id; \
00478 objectfuncp_delete = objectfuncp_delete; \
00479 objectfuncp = objectfuncp; \
00480 theBlock = theBlock;
00481
00482
00483
00484 #define _RO_DO_PREREGISTER_FUNC_END() \
00485 }
00486
00487
00488
00490
00491
00492
00493
00494
00496
00498
00499
00501
00502
00503
00504
00505
00506 #define _RO_DEF_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER() \
00507 protected: \
00508 virtual void _Internal_SetupOpaquePointer(void); \
00509 public:
00510
00511
00512
00513 #define _RO_DO_REPLICAOBJECT_INTERNAL_SETUPOPAQUEPOINTER(x,y) \
00514 void _MAKE_RO(x)::_Internal_SetupOpaquePointer(void) \
00515 { \
00516 SetOpaquePointer((void *)((y *)((_MAKE_BASE(x) *)this))); \
00517 }
00518
00519
00520
00521 #endif