00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __DATABLOCK_FUNCTION_H__
00012 #define __DATABLOCK_FUNCTION_H__
00013 #include "RNPlatform/Inc/DLLExportAPI.h"
00014
00015 #include "RNReplicaNet/Inc/DataBlock.h"
00016 #include "RNPlatform/Inc/MessageHelper.h"
00017 #include "RNPlatform/Inc/RegistryManagerMap.h"
00018 #include <list>
00019
00020 namespace RNReplicaNet
00021 {
00022
00023 struct CombinedDataPacket;
00024 struct SessionBlock_Function;
00025
00052 class REPLICANETDLL_API DataBlock_Function : public DataBlock
00053 {
00054 public:
00055 typedef void (tDataBlock_Function_funcp)(void *classp,void *data);
00056
00060 DataBlock_Function();
00061
00065 virtual ~DataBlock_Function();
00066
00067 virtual void Poll(DataBlockReason *reason);
00068
00069 virtual void ParseMessage(MessageHelper *message);
00070
00077 static DataBlock_Function *Register(void *classp,tDataBlock_Function_funcp *funcp);
00078
00084 void RegisterInClassPointer(void *classp,tDataBlock_Function_funcp *funcp)
00085 {
00086 mClassp = classp;
00087 mData = funcp;
00088 }
00089
00096 static void SetSessionIDFilter(const int numSessionIDs = 0,const int *sessionIDs = 0);
00097
00098 void AddFunctionStateChange(void *data,int len,const char *debug = 0);
00099
00100 bool IsAttached(void *data);
00101
00102 protected:
00103 void *mClassp;
00104 tDataBlock_Function_funcp *mData;
00105
00106 RegistryManagerMap<int,SessionBlock_Function> mPerSessionFunction;
00107
00108 std::list<CombinedDataPacket *> mFunctionStateChanges;
00109
00110 static int mConfiguredNumSessions;
00111 static int *mConfiguredSessionIDs;
00112 };
00113
00114 }
00115
00116
00117
00118 #define _RO_DO_REGISTERBLOCK_FUNCTION_VAR(x) \
00119 {\
00120 RNReplicaNet::DataBlock_Function *datablock = 0; \
00121 datablock = RNReplicaNet::DataBlock_Function::Register((void *)this,&x); \
00122 mDataBlockFunction_##x = datablock; \
00123 _RO_DO_SETDATABLOCKVARIABLENAME(x);
00124
00125
00126
00127
00128 #define _RO_MAKE_MEMBERFUNC(x) Call_##x
00129
00130
00131
00132 #define _RO_DO_MEMBERFUNC_PRESTAGE_DEF(x,y) \
00133 void _MAKE_RO(x)::_RO_MAKE_MEMBERFUNC(y)(
00134
00135
00136
00137
00138 #ifdef REPLICANET_VISUALDEBUGGER
00139 #define _RO_DO_MEMBERFUNC_PRESTAGE(x) \
00140 ) \
00141 { \
00142 if (!mDataBlocksRegistered) \
00143 { \
00144 return; \
00145 } \
00146 RNReplicaNet::DynamicMessageHelper message; \
00147 message.SetBufferSize(256); \
00148 std::string debug;
00149 #else //ifdef REPLICANET_VISUALDEBUGGER
00150 #define _RO_DO_MEMBERFUNC_PRESTAGE(x) \
00151 ) \
00152 { \
00153 if (!mDataBlocksRegistered) \
00154 { \
00155 return; \
00156 } \
00157 RNReplicaNet::DynamicMessageHelper message; \
00158 message.SetBufferSize(256);
00159 #endif //ifdef REPLICANET_VISUALDEBUGGER
00160
00161
00162
00163 #define _RO_DO_MEMBERFUNC_ADDVAR(x) \
00164 message.AddVariable(&x,sizeof(x));
00165
00166 #ifdef REPLICANET_VISUALDEBUGGER
00167 #define _RO_DO_MEMBERFUNC_ADDVAR2(x,y) \
00168 message.AddVariable(&x,sizeof(x)); \
00169 if (RNReplicaNet::XPURL::GetDebugHandler()) \
00170 { \
00171 debug += #y; \
00172 debug += "\n"; \
00173 debug += RNReplicaNet::MessageHelper::DumpAsHex(&x,sizeof(x)); \
00174 debug += "\n"; \
00175 }
00176 #else // ifdef REPLICANET_VISUALDEBUGGER
00177 #define _RO_DO_MEMBERFUNC_ADDVAR2(x,y) \
00178 message.AddVariable(&x,sizeof(x));
00179 #endif // ifdef REPLICANET_VISUALDEBUGGER
00180
00181
00182
00183 #ifdef REPLICANET_VISUALDEBUGGER
00184 #define _RO_DO_MEMBERFUNC_POSTSTAGE(x) \
00185 RNReplicaNet::DataBlock_Function *datablock = (RNReplicaNet::DataBlock_Function *) mDataBlockFunction_##x; \
00186 datablock->AddFunctionStateChange(message.GetBuffer(),message.GetSize(),debug.c_str()); \
00187 }
00188 #else //ifdef REPLICANET_VISUALDEBUGGER
00189 #define _RO_DO_MEMBERFUNC_POSTSTAGE(x) \
00190 RNReplicaNet::DataBlock_Function *datablock = (RNReplicaNet::DataBlock_Function *) mDataBlockFunction_##x; \
00191 datablock->AddFunctionStateChange(message.GetBuffer(),message.GetSize()); \
00192 }
00193 #endif //ifdef REPLICANET_VISUALDEBUGGER
00194
00195
00196
00197
00198 #define _RO_DO_MEMBERFUNC_CRACK_START(x,y) \
00199 void _MAKE_RO(x)::y(void *classp,void *opaque_message) \
00200 { \
00201 _MAKE_RO(x) *thisclass = (_MAKE_RO(x) *) classp; \
00202 RNReplicaNet::MessageHelper *message = (RNReplicaNet::MessageHelper *) opaque_message; \
00203 message = message;
00204
00205
00206
00207 #define _RO_DO_MEMBERFUNC_MESSAGE_CRACK(x) \
00208 MESSAGEHELPER_GETVARIABLEp((*message),x);
00209
00210
00211
00212
00213 #define _RO_DO_MEMBERFUNC_CRACK_END(x,y) \
00214 ((x*)thisclass)->y(
00215
00216
00217
00218 #define _RO_DO_MEMBERFUNC_CRACK_END2() \
00219 ); \
00220 }
00221
00222
00223 #endif