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