
00001 00002 00003 00004 00005 00006 00007 00008 00009 #ifndef __AUTO_RPC_H 00010 #define __AUTO_RPC_H 00011 00012 class RakPeerInterface; 00013 class NetworkIDManager; 00014 #include "PluginInterface2.h" 00015 #include "DS_Map.h" 00016 #include "PacketPriority.h" 00017 #include "RakNetTypes.h" 00018 #include "BitStream.h" 00019 #include "Gen_RPC8.h" 00020 #include "RakString.h" 00021 00022 #ifdef _MSC_VER 00023 #pragma warning( push ) 00024 #endif 00025 00031 00032 namespace RakNet 00033 { 00034 00036 #define ARPC_MAX_STACK_SIZE 65536 00037 00038 #if defined (_WIN32) 00039 00040 00041 00042 00043 00044 00045 00046 00047 00048 #define ARPC_REGISTER_CPP_FUNCTION(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS_) \ 00049 { \ 00050 union \ 00051 { \ 00052 _RETURN_ (AUTO_RPC_CALLSPEC _CLASS_::*__memberFunctionPtr)_PARAMS_; \ 00053 void* __voidFunc; \ 00054 }; \ 00055 __memberFunctionPtr=&_CLASS_::_FUNCTION_; \ 00056 (autoRPCInstance)->RegisterFunction(_IDENTIFIER_, __voidFunc, true, -1); \ 00057 } 00058 00060 #define ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS_, _PARAM_COUNT_) \ 00061 { \ 00062 union \ 00063 { \ 00064 _RETURN_ (AUTO_RPC_CALLSPEC _CLASS_::*__memberFunctionPtr)_PARAMS_; \ 00065 void* __voidFunc; \ 00066 }; \ 00067 __memberFunctionPtr=&_CLASS_::_FUNCTION_; \ 00068 (autoRPCInstance)->RegisterFunction(_IDENTIFIER_, __voidFunc, true, _PARAM_COUNT_); \ 00069 } 00070 00072 #define ARPC_REGISTER_CPP_FUNCTION0(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_) (autoRPCInstance)->RegisterFunction(_IDENTIFIER_, __voidFunc, true, 0); 00073 #define ARPC_REGISTER_CPP_FUNCTION1(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_), 0) 00074 #define ARPC_REGISTER_CPP_FUNCTION2(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_), 1) 00075 #define ARPC_REGISTER_CPP_FUNCTION3(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_,_PARAMS3_), 2) 00076 #define ARPC_REGISTER_CPP_FUNCTION4(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_,_PARAMS3_,_PARAMS4_), 3) 00077 #define ARPC_REGISTER_CPP_FUNCTION5(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_,_PARAMS3_,_PARAMS4_,_PARAMS5_), 4) 00078 #define ARPC_REGISTER_CPP_FUNCTION6(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_,_PARAMS3_,_PARAMS4_,_PARAMS5_,_PARAMS6_), 5) 00079 #define ARPC_REGISTER_CPP_FUNCTION7(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_,_PARAMS3_,_PARAMS4_,_PARAMS5_,_PARAMS6_,_PARAMS7_), 6) 00080 #define ARPC_REGISTER_CPP_FUNCTION8(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_,_PARAMS3_,_PARAMS4_,_PARAMS5_,_PARAMS6_,_PARAMS7_,_PARAMS8_), 7) 00081 #define ARPC_REGISTER_CPP_FUNCTION9(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_, _PARAMS9_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_,_PARAMS3_,_PARAMS4_,_PARAMS5_,_PARAMS6_,_PARAMS7_,_PARAMS8_,_PARAMS9_), 8) 00082 00083 #else 00084 00085 #define ARPC_REGISTER_CPP_FUNCTION0(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_) \ 00086 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*)) &_CLASS_::_FUNCTION_, true, 0 ); 00087 00088 #define ARPC_REGISTER_CPP_FUNCTION1(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_) \ 00089 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_ )) &_CLASS_::_FUNCTION_, true, 0 ); 00090 00091 #define ARPC_REGISTER_CPP_FUNCTION2(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_) \ 00092 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_ )) &_CLASS_::_FUNCTION_, true, 1 ); 00093 00094 #define ARPC_REGISTER_CPP_FUNCTION3(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_) \ 00095 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_ )) &_CLASS_::_FUNCTION_, true, 2 ); 00096 00097 #define ARPC_REGISTER_CPP_FUNCTION4(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_) \ 00098 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_ )) &_CLASS_::_FUNCTION_, true, 3 ); 00099 00100 #define ARPC_REGISTER_CPP_FUNCTION5(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_) \ 00101 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_ )) &_CLASS_::_FUNCTION_, true, 4 ); 00102 00103 #define ARPC_REGISTER_CPP_FUNCTION6(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_) \ 00104 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_ )) &_CLASS_::_FUNCTION_, true, 5 ); 00105 00106 #define ARPC_REGISTER_CPP_FUNCTION7(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_) \ 00107 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_ )) &_CLASS_::_FUNCTION_, true, 6 ); 00108 00109 #define ARPC_REGISTER_CPP_FUNCTION8(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_) \ 00110 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_ )) &_CLASS_::_FUNCTION_, true, 7 ); 00111 00112 #define ARPC_REGISTER_CPP_FUNCTION9(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_, _PARAMS9_) \ 00113 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_, _PARAMS9_ )) &_CLASS_::_FUNCTION_, true, 8 ); 00114 00115 #endif 00116 00123 enum RPCErrorCodes 00124 { 00126 RPC_ERROR_NETWORK_ID_MANAGER_UNAVAILABLE, 00127 00129 RPC_ERROR_OBJECT_DOES_NOT_EXIST, 00130 00132 RPC_ERROR_FUNCTION_INDEX_OUT_OF_RANGE, 00133 00135 RPC_ERROR_FUNCTION_NOT_REGISTERED, 00136 00138 RPC_ERROR_FUNCTION_NO_LONGER_REGISTERED, 00139 00142 RPC_ERROR_CALLING_CPP_AS_C, 00143 00146 RPC_ERROR_CALLING_C_AS_CPP, 00147 00149 RPC_ERROR_STACK_TOO_SMALL, 00150 00152 RPC_ERROR_STACK_DESERIALIZATION_FAILED, 00153 00155 RPC_ERROR_INCORRECT_NUMBER_OF_PARAMETERS, 00156 }; 00157 00159 00167 class AutoRPC : public PluginInterface2 00168 { 00169 public: 00170 // Constructor 00171 AutoRPC(); 00172 00173 // Destructor 00174 virtual ~AutoRPC(); 00175 00179 void SetNetworkIDManager(NetworkIDManager *idMan); 00180 00187 bool RegisterFunction(const char *uniqueIdentifier, void *functionPtr, bool isObjectMember, char parameterCount=-1); 00188 00194 bool UnregisterFunction(const char *uniqueIdentifier, bool isObjectMember); 00195 00199 void SetTimestamp(RakNetTime timeStamp); 00200 00206 void SetSendParams(PacketPriority priority, PacketReliability reliability, char orderingChannel); 00207 00212 void SetRecipientAddress(AddressOrGUID systemIdentifier, bool broadcast); 00213 00221 void SetRecipientObject(NetworkID networkID); 00222 00226 RakNet::BitStream *SetOutgoingExtraData(void); 00227 00230 RakNetTime GetLastSenderTimestamp(void) const; 00231 00235 SystemAddress GetLastSenderAddress(void) const; 00236 00238 RakPeerInterface *GetRakPeer(void) const; 00239 00243 const char *GetCurrentExecution(void) const; 00244 00248 RakNet::BitStream *GetIncomingExtraData(void); 00249 00256 bool Call(const char *uniqueIdentifier){ 00257 char stack[ARPC_MAX_STACK_SIZE]; 00258 unsigned int bytesOnStack = GenRPC::BuildStack(stack); 00259 return SendCall(uniqueIdentifier, stack, bytesOnStack, 0); 00260 } 00261 00268 template <class P1> 00269 bool Call(const char *uniqueIdentifier, P1 p1) { 00270 char stack[ARPC_MAX_STACK_SIZE]; 00271 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, true); 00272 return SendCall(uniqueIdentifier, stack, bytesOnStack, 1); 00273 } 00274 00281 template <class P1, class P2> 00282 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2) { 00283 char stack[ARPC_MAX_STACK_SIZE]; 00284 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, true, true); 00285 return SendCall(uniqueIdentifier, stack, bytesOnStack, 2); 00286 } 00287 00294 template <class P1, class P2, class P3> 00295 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3 ) { 00296 char stack[ARPC_MAX_STACK_SIZE]; 00297 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, true, true, true); 00298 return SendCall(uniqueIdentifier, stack, bytesOnStack, 3); 00299 } 00300 00307 template <class P1, class P2, class P3, class P4> 00308 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4 ) { 00309 char stack[ARPC_MAX_STACK_SIZE]; 00310 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, true, true, true, true); 00311 return SendCall(uniqueIdentifier, stack, bytesOnStack, 4); 00312 } 00313 00320 template <class P1, class P2, class P3, class P4, class P5> 00321 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 ) { 00322 char stack[ARPC_MAX_STACK_SIZE]; 00323 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, true, true, true, true, true); 00324 return SendCall(uniqueIdentifier, stack, bytesOnStack, 5); 00325 } 00326 00333 template <class P1, class P2, class P3, class P4, class P5, class P6> 00334 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6 ) { 00335 char stack[ARPC_MAX_STACK_SIZE]; 00336 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, true, true, true, true, true, true); 00337 return SendCall(uniqueIdentifier, stack, bytesOnStack, 6); 00338 } 00339 00346 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7> 00347 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7 ) { 00348 char stack[ARPC_MAX_STACK_SIZE]; 00349 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, true, true, true, true, true, true, true); 00350 return SendCall(uniqueIdentifier, stack, bytesOnStack, 7); 00351 } 00352 00359 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> 00360 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8 ) { 00361 char stack[ARPC_MAX_STACK_SIZE]; 00362 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, p8, true, true, true, true, true, true, true, true); 00363 return SendCall(uniqueIdentifier, stack, bytesOnStack, 8); 00364 } 00365 00379 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID){ 00380 SetTimestamp(timeStamp); 00381 SetSendParams(priority, reliability, orderingChannel); 00382 SetRecipientAddress(systemIdentifier, broadcast); 00383 SetRecipientObject(networkID); 00384 char stack[ARPC_MAX_STACK_SIZE]; 00385 unsigned int bytesOnStack = GenRPC::BuildStack(stack); 00386 return SendCall(uniqueIdentifier, stack, bytesOnStack, 0); 00387 } 00388 00402 template <class P1> 00403 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1) { 00404 SetTimestamp(timeStamp); 00405 SetSendParams(priority, reliability, orderingChannel); 00406 SetRecipientAddress(systemIdentifier, broadcast); 00407 SetRecipientObject(networkID); 00408 char stack[ARPC_MAX_STACK_SIZE]; 00409 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, true); 00410 return SendCall(uniqueIdentifier, stack, bytesOnStack, 1); 00411 } 00412 00426 template <class P1, class P2> 00427 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2) { 00428 SetTimestamp(timeStamp); 00429 SetSendParams(priority, reliability, orderingChannel); 00430 SetRecipientAddress(systemIdentifier, broadcast); 00431 SetRecipientObject(networkID); 00432 char stack[ARPC_MAX_STACK_SIZE]; 00433 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, true, true); 00434 return SendCall(uniqueIdentifier, stack, bytesOnStack, 2); 00435 } 00436 00450 template <class P1, class P2, class P3> 00451 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2, P3 p3 ) { 00452 SetTimestamp(timeStamp); 00453 SetSendParams(priority, reliability, orderingChannel); 00454 SetRecipientAddress(systemIdentifier, broadcast); 00455 SetRecipientObject(networkID); 00456 char stack[ARPC_MAX_STACK_SIZE]; 00457 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, true, true, true); 00458 return SendCall(uniqueIdentifier, stack, bytesOnStack, 3); 00459 } 00460 00474 template <class P1, class P2, class P3, class P4> 00475 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2, P3 p3, P4 p4 ) { 00476 SetTimestamp(timeStamp); 00477 SetSendParams(priority, reliability, orderingChannel); 00478 SetRecipientAddress(systemIdentifier, broadcast); 00479 SetRecipientObject(networkID); 00480 char stack[ARPC_MAX_STACK_SIZE]; 00481 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, true, true, true, true); 00482 return SendCall(uniqueIdentifier, stack, bytesOnStack, 4); 00483 } 00484 00498 template <class P1, class P2, class P3, class P4, class P5> 00499 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 ) { 00500 SetTimestamp(timeStamp); 00501 SetSendParams(priority, reliability, orderingChannel); 00502 SetRecipientAddress(systemIdentifier, broadcast); 00503 SetRecipientObject(networkID); 00504 char stack[ARPC_MAX_STACK_SIZE]; 00505 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, true, true, true, true, true); 00506 return SendCall(uniqueIdentifier, stack, bytesOnStack, 5); 00507 } 00508 00522 template <class P1, class P2, class P3, class P4, class P5, class P6> 00523 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6 ) { 00524 SetTimestamp(timeStamp); 00525 SetSendParams(priority, reliability, orderingChannel); 00526 SetRecipientAddress(systemIdentifier, broadcast); 00527 SetRecipientObject(networkID); 00528 char stack[ARPC_MAX_STACK_SIZE]; 00529 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, true, true, true, true, true, true); 00530 return SendCall(uniqueIdentifier, stack, bytesOnStack, 6); 00531 } 00532 00546 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7> 00547 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7 ) { 00548 SetTimestamp(timeStamp); 00549 SetSendParams(priority, reliability, orderingChannel); 00550 SetRecipientAddress(systemIdentifier, broadcast); 00551 SetRecipientObject(networkID); 00552 char stack[ARPC_MAX_STACK_SIZE]; 00553 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, true, true, true, true, true, true, true); 00554 return SendCall(uniqueIdentifier, stack, bytesOnStack, 7); 00555 } 00556 00570 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> 00571 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8 ) { 00572 SetTimestamp(timeStamp); 00573 SetSendParams(priority, reliability, orderingChannel); 00574 SetRecipientAddress(systemIdentifier, broadcast); 00575 SetRecipientObject(networkID); 00576 char stack[ARPC_MAX_STACK_SIZE]; 00577 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, p8, true, true, true, true, true, true, true, true); 00578 return SendCall(uniqueIdentifier, stack, bytesOnStack, 8); 00579 } 00580 00581 00582 // If you need more than 8 parameters, just add it here... 00583 00584 // ---------------------------- ALL INTERNAL AFTER HERE ---------------------------- 00585 00588 struct RPCIdentifier 00589 { 00590 char *uniqueIdentifier; 00591 bool isObjectMember; 00592 }; 00593 00596 struct LocalRPCFunction 00597 { 00598 RPCIdentifier identifier; 00599 void *functionPtr; 00600 char parameterCount; 00601 }; 00602 00605 struct RemoteRPCFunction 00606 { 00607 RPCIdentifier identifier; 00608 unsigned int functionIndex; 00609 }; 00610 00612 static int RemoteRPCFunctionComp( const RPCIdentifier &key, const RemoteRPCFunction &data ); 00613 00616 bool SendCall(const char *uniqueIdentifier, const char *stack, unsigned int bytesOnStack, char parameterCount); 00617 00618 protected: 00619 00620 // -------------------------------------------------------------------------------------------- 00621 // Packet handling functions 00622 // -------------------------------------------------------------------------------------------- 00623 void OnAttach(void); 00624 virtual PluginReceiveResult OnReceive(Packet *packet); 00625 virtual void OnAutoRPCCall(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes); 00626 virtual void OnRPCRemoteIndex(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes); 00627 virtual void OnRPCUnknownRemoteIndex(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes, RakNetTime timestamp); 00628 virtual void OnClosedConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason ); 00629 virtual void OnRakPeerShutdown(void); 00630 00631 void Clear(void); 00632 00633 void SendError(SystemAddress target, unsigned char errorCode, const char *functionName); 00634 unsigned GetLocalFunctionIndex(RPCIdentifier identifier); 00635 bool GetRemoteFunctionIndex(SystemAddress systemAddress, RPCIdentifier identifier, unsigned int *outerIndex, unsigned int *innerIndex); 00636 00637 00638 DataStructures::List<LocalRPCFunction> localFunctions; 00639 DataStructures::Map<SystemAddress, DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *> remoteFunctions; 00640 00641 RakNetTime outgoingTimestamp; 00642 PacketPriority outgoingPriority; 00643 PacketReliability outgoingReliability; 00644 char outgoingOrderingChannel; 00645 AddressOrGUID outgoingSystemIdentifier; 00646 bool outgoingBroadcast; 00647 NetworkID outgoingNetworkID; 00648 RakNet::BitStream outgoingExtraData; 00649 00650 RakNetTime incomingTimeStamp; 00651 SystemAddress incomingSystemAddress; 00652 RakNet::BitStream incomingExtraData; 00653 00654 NetworkIDManager *networkIdManager; 00655 char currentExecution[512]; 00656 }; 00657 00658 } // End namespace 00659 00660 #endif 00661 00662 #ifdef _MSC_VER 00663 #pragma warning( pop ) 00664 #endif
Copyright © 2007-2010 by The Shadowrun: Awakened Team. This work is licensed under the GNU Lesser General Public License 3.