00001
00002
00003
00004
00005
00006
00007
00008 #include "NativeFeatureIncludes.h"
00009 #if _RAKNET_SUPPORT_AutoRPC==1
00010
00011 #ifndef __AUTO_RPC_H
00012 #define __AUTO_RPC_H
00013
00014 class RakPeerInterface;
00015 class NetworkIDManager;
00016 #include "PluginInterface2.h"
00017 #include "DS_Map.h"
00018 #include "PacketPriority.h"
00019 #include "RakNetTypes.h"
00020 #include "BitStream.h"
00021 #include "Gen_RPC8.h"
00022 #include "RakString.h"
00023
00024 #ifdef _MSC_VER
00025 #pragma warning( push )
00026 #endif
00027
00033
00034 namespace RakNet
00035 {
00036
00038 #define ARPC_MAX_STACK_SIZE 65536
00039
00040 #if defined (_WIN32)
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #define ARPC_REGISTER_CPP_FUNCTION(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS_) \
00051 { \
00052 union \
00053 { \
00054 _RETURN_ (AUTO_RPC_CALLSPEC _CLASS_::*__memberFunctionPtr)_PARAMS_; \
00055 void* __voidFunc; \
00056 }; \
00057 __memberFunctionPtr=&_CLASS_::_FUNCTION_; \
00058 (autoRPCInstance)->RegisterFunction(_IDENTIFIER_, __voidFunc, true, -1); \
00059 }
00060
00062 #define ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS_, _PARAM_COUNT_) \
00063 { \
00064 union \
00065 { \
00066 _RETURN_ (AUTO_RPC_CALLSPEC _CLASS_::*__memberFunctionPtr)_PARAMS_; \
00067 void* __voidFunc; \
00068 }; \
00069 __memberFunctionPtr=&_CLASS_::_FUNCTION_; \
00070 (autoRPCInstance)->RegisterFunction(_IDENTIFIER_, __voidFunc, true, _PARAM_COUNT_); \
00071 }
00072
00074 #define ARPC_REGISTER_CPP_FUNCTION0(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_) (autoRPCInstance)->RegisterFunction(_IDENTIFIER_, __voidFunc, true, 0);
00075 #define ARPC_REGISTER_CPP_FUNCTION1(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_), 0)
00076 #define ARPC_REGISTER_CPP_FUNCTION2(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_) ARPC_REGISTER_CPP_FUNCTIONX(autoRPCInstance,_IDENTIFIER_,_RETURN_,_CLASS_,_FUNCTION_,(_PARAMS1_,_PARAMS2_), 1)
00077 #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)
00078 #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)
00079 #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)
00080 #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)
00081 #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)
00082 #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)
00083 #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)
00084
00085 #else
00086
00087 #define ARPC_REGISTER_CPP_FUNCTION0(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_) \
00088 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*)) &_CLASS_::_FUNCTION_, true, 0 );
00089
00090 #define ARPC_REGISTER_CPP_FUNCTION1(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_) \
00091 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_ )) &_CLASS_::_FUNCTION_, true, 0 );
00092
00093 #define ARPC_REGISTER_CPP_FUNCTION2(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_) \
00094 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_ )) &_CLASS_::_FUNCTION_, true, 1 );
00095
00096 #define ARPC_REGISTER_CPP_FUNCTION3(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_) \
00097 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_ )) &_CLASS_::_FUNCTION_, true, 2 );
00098
00099 #define ARPC_REGISTER_CPP_FUNCTION4(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_) \
00100 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_ )) &_CLASS_::_FUNCTION_, true, 3 );
00101
00102 #define ARPC_REGISTER_CPP_FUNCTION5(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_) \
00103 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_ )) &_CLASS_::_FUNCTION_, true, 4 );
00104
00105 #define ARPC_REGISTER_CPP_FUNCTION6(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_) \
00106 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_ )) &_CLASS_::_FUNCTION_, true, 5 );
00107
00108 #define ARPC_REGISTER_CPP_FUNCTION7(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_) \
00109 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_ )) &_CLASS_::_FUNCTION_, true, 6 );
00110
00111 #define ARPC_REGISTER_CPP_FUNCTION8(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_) \
00112 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_ )) &_CLASS_::_FUNCTION_, true, 7 );
00113
00114 #define ARPC_REGISTER_CPP_FUNCTION9(autoRPCInstance, _IDENTIFIER_, _RETURN_, _CLASS_, _FUNCTION_, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_, _PARAMS9_) \
00115 (autoRPCInstance)->RegisterFunction((_IDENTIFIER_), (void*)(_RETURN_ (*) (_CLASS_*, _PARAMS1_, _PARAMS2_, _PARAMS3_, _PARAMS4_, _PARAMS5_, _PARAMS6_, _PARAMS7_, _PARAMS8_, _PARAMS9_ )) &_CLASS_::_FUNCTION_, true, 8 );
00116
00117 #endif
00118
00125 enum RPCErrorCodes
00126 {
00128 RPC_ERROR_NETWORK_ID_MANAGER_UNAVAILABLE,
00129
00131 RPC_ERROR_OBJECT_DOES_NOT_EXIST,
00132
00134 RPC_ERROR_FUNCTION_INDEX_OUT_OF_RANGE,
00135
00137 RPC_ERROR_FUNCTION_NOT_REGISTERED,
00138
00140 RPC_ERROR_FUNCTION_NO_LONGER_REGISTERED,
00141
00144 RPC_ERROR_CALLING_CPP_AS_C,
00145
00148 RPC_ERROR_CALLING_C_AS_CPP,
00149
00151 RPC_ERROR_STACK_TOO_SMALL,
00152
00154 RPC_ERROR_STACK_DESERIALIZATION_FAILED,
00155
00157 RPC_ERROR_INCORRECT_NUMBER_OF_PARAMETERS,
00158 };
00159
00161
00169 class AutoRPC : public PluginInterface2
00170 {
00171 public:
00172
00173 AutoRPC();
00174
00175
00176 virtual ~AutoRPC();
00177
00181 void SetNetworkIDManager(NetworkIDManager *idMan);
00182
00189 bool RegisterFunction(const char *uniqueIdentifier, void *functionPtr, bool isObjectMember, char parameterCount=-1);
00190
00196 bool UnregisterFunction(const char *uniqueIdentifier, bool isObjectMember);
00197
00201 void SetTimestamp(RakNetTime timeStamp);
00202
00208 void SetSendParams(PacketPriority priority, PacketReliability reliability, char orderingChannel);
00209
00214 void SetRecipientAddress(AddressOrGUID systemIdentifier, bool broadcast);
00215
00223 void SetRecipientObject(NetworkID networkID);
00224
00228 RakNet::BitStream *SetOutgoingExtraData(void);
00229
00232 RakNetTime GetLastSenderTimestamp(void) const;
00233
00237 SystemAddress GetLastSenderAddress(void) const;
00238
00240 RakPeerInterface *GetRakPeer(void) const;
00241
00245 const char *GetCurrentExecution(void) const;
00246
00250 RakNet::BitStream *GetIncomingExtraData(void);
00251
00258 bool Call(const char *uniqueIdentifier){
00259 char stack[ARPC_MAX_STACK_SIZE];
00260 unsigned int bytesOnStack = GenRPC::BuildStack(stack);
00261 return SendCall(uniqueIdentifier, stack, bytesOnStack, 0);
00262 }
00263
00270 template <class P1>
00271 bool Call(const char *uniqueIdentifier, P1 p1) {
00272 char stack[ARPC_MAX_STACK_SIZE];
00273 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, true);
00274 return SendCall(uniqueIdentifier, stack, bytesOnStack, 1);
00275 }
00276
00283 template <class P1, class P2>
00284 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2) {
00285 char stack[ARPC_MAX_STACK_SIZE];
00286 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, true, true);
00287 return SendCall(uniqueIdentifier, stack, bytesOnStack, 2);
00288 }
00289
00296 template <class P1, class P2, class P3>
00297 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3 ) {
00298 char stack[ARPC_MAX_STACK_SIZE];
00299 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, true, true, true);
00300 return SendCall(uniqueIdentifier, stack, bytesOnStack, 3);
00301 }
00302
00309 template <class P1, class P2, class P3, class P4>
00310 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4 ) {
00311 char stack[ARPC_MAX_STACK_SIZE];
00312 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, true, true, true, true);
00313 return SendCall(uniqueIdentifier, stack, bytesOnStack, 4);
00314 }
00315
00322 template <class P1, class P2, class P3, class P4, class P5>
00323 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5 ) {
00324 char stack[ARPC_MAX_STACK_SIZE];
00325 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, true, true, true, true, true);
00326 return SendCall(uniqueIdentifier, stack, bytesOnStack, 5);
00327 }
00328
00335 template <class P1, class P2, class P3, class P4, class P5, class P6>
00336 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6 ) {
00337 char stack[ARPC_MAX_STACK_SIZE];
00338 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, true, true, true, true, true, true);
00339 return SendCall(uniqueIdentifier, stack, bytesOnStack, 6);
00340 }
00341
00348 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7>
00349 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7 ) {
00350 char stack[ARPC_MAX_STACK_SIZE];
00351 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, true, true, true, true, true, true, true);
00352 return SendCall(uniqueIdentifier, stack, bytesOnStack, 7);
00353 }
00354
00361 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
00362 bool Call(const char *uniqueIdentifier, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8 ) {
00363 char stack[ARPC_MAX_STACK_SIZE];
00364 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, p8, true, true, true, true, true, true, true, true);
00365 return SendCall(uniqueIdentifier, stack, bytesOnStack, 8);
00366 }
00367
00381 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID){
00382 SetTimestamp(timeStamp);
00383 SetSendParams(priority, reliability, orderingChannel);
00384 SetRecipientAddress(systemIdentifier, broadcast);
00385 SetRecipientObject(networkID);
00386 char stack[ARPC_MAX_STACK_SIZE];
00387 unsigned int bytesOnStack = GenRPC::BuildStack(stack);
00388 return SendCall(uniqueIdentifier, stack, bytesOnStack, 0);
00389 }
00390
00404 template <class P1>
00405 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1) {
00406 SetTimestamp(timeStamp);
00407 SetSendParams(priority, reliability, orderingChannel);
00408 SetRecipientAddress(systemIdentifier, broadcast);
00409 SetRecipientObject(networkID);
00410 char stack[ARPC_MAX_STACK_SIZE];
00411 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, true);
00412 return SendCall(uniqueIdentifier, stack, bytesOnStack, 1);
00413 }
00414
00428 template <class P1, class P2>
00429 bool CallExplicit(const char *uniqueIdentifier, RakNetTime timeStamp, PacketPriority priority, PacketReliability reliability, char orderingChannel, const AddressOrGUID systemIdentifier, bool broadcast, NetworkID networkID, P1 p1, P2 p2) {
00430 SetTimestamp(timeStamp);
00431 SetSendParams(priority, reliability, orderingChannel);
00432 SetRecipientAddress(systemIdentifier, broadcast);
00433 SetRecipientObject(networkID);
00434 char stack[ARPC_MAX_STACK_SIZE];
00435 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, true, true);
00436 return SendCall(uniqueIdentifier, stack, bytesOnStack, 2);
00437 }
00438
00452 template <class P1, class P2, class P3>
00453 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 ) {
00454 SetTimestamp(timeStamp);
00455 SetSendParams(priority, reliability, orderingChannel);
00456 SetRecipientAddress(systemIdentifier, broadcast);
00457 SetRecipientObject(networkID);
00458 char stack[ARPC_MAX_STACK_SIZE];
00459 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, true, true, true);
00460 return SendCall(uniqueIdentifier, stack, bytesOnStack, 3);
00461 }
00462
00476 template <class P1, class P2, class P3, class P4>
00477 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 ) {
00478 SetTimestamp(timeStamp);
00479 SetSendParams(priority, reliability, orderingChannel);
00480 SetRecipientAddress(systemIdentifier, broadcast);
00481 SetRecipientObject(networkID);
00482 char stack[ARPC_MAX_STACK_SIZE];
00483 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, true, true, true, true);
00484 return SendCall(uniqueIdentifier, stack, bytesOnStack, 4);
00485 }
00486
00500 template <class P1, class P2, class P3, class P4, class P5>
00501 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 ) {
00502 SetTimestamp(timeStamp);
00503 SetSendParams(priority, reliability, orderingChannel);
00504 SetRecipientAddress(systemIdentifier, broadcast);
00505 SetRecipientObject(networkID);
00506 char stack[ARPC_MAX_STACK_SIZE];
00507 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, true, true, true, true, true);
00508 return SendCall(uniqueIdentifier, stack, bytesOnStack, 5);
00509 }
00510
00524 template <class P1, class P2, class P3, class P4, class P5, class P6>
00525 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 ) {
00526 SetTimestamp(timeStamp);
00527 SetSendParams(priority, reliability, orderingChannel);
00528 SetRecipientAddress(systemIdentifier, broadcast);
00529 SetRecipientObject(networkID);
00530 char stack[ARPC_MAX_STACK_SIZE];
00531 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, true, true, true, true, true, true);
00532 return SendCall(uniqueIdentifier, stack, bytesOnStack, 6);
00533 }
00534
00548 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7>
00549 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 ) {
00550 SetTimestamp(timeStamp);
00551 SetSendParams(priority, reliability, orderingChannel);
00552 SetRecipientAddress(systemIdentifier, broadcast);
00553 SetRecipientObject(networkID);
00554 char stack[ARPC_MAX_STACK_SIZE];
00555 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, true, true, true, true, true, true, true);
00556 return SendCall(uniqueIdentifier, stack, bytesOnStack, 7);
00557 }
00558
00572 template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
00573 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 ) {
00574 SetTimestamp(timeStamp);
00575 SetSendParams(priority, reliability, orderingChannel);
00576 SetRecipientAddress(systemIdentifier, broadcast);
00577 SetRecipientObject(networkID);
00578 char stack[ARPC_MAX_STACK_SIZE];
00579 unsigned int bytesOnStack = GenRPC::BuildStack(stack, p1, p2, p3, p4, p5, p6, p7, p8, true, true, true, true, true, true, true, true);
00580 return SendCall(uniqueIdentifier, stack, bytesOnStack, 8);
00581 }
00582
00583
00584
00585
00586
00587
00590 struct RPCIdentifier
00591 {
00592 char *uniqueIdentifier;
00593 bool isObjectMember;
00594 };
00595
00598 struct LocalRPCFunction
00599 {
00600 RPCIdentifier identifier;
00601 void *functionPtr;
00602 char parameterCount;
00603 };
00604
00607 struct RemoteRPCFunction
00608 {
00609 RPCIdentifier identifier;
00610 unsigned int functionIndex;
00611 };
00612
00614 static int RemoteRPCFunctionComp( const RPCIdentifier &key, const RemoteRPCFunction &data );
00615
00618 bool SendCall(const char *uniqueIdentifier, const char *stack, unsigned int bytesOnStack, char parameterCount);
00619
00620 protected:
00621
00622
00623
00624
00625 void OnAttach(void);
00626 virtual PluginReceiveResult OnReceive(Packet *packet);
00627 virtual void OnAutoRPCCall(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes);
00628 virtual void OnRPCRemoteIndex(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes);
00629 virtual void OnRPCUnknownRemoteIndex(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes, RakNetTime timestamp);
00630 virtual void OnClosedConnection(SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason );
00631 virtual void OnRakPeerShutdown(void);
00632
00633 void Clear(void);
00634
00635 void SendError(SystemAddress target, unsigned char errorCode, const char *functionName);
00636 unsigned GetLocalFunctionIndex(RPCIdentifier identifier);
00637 bool GetRemoteFunctionIndex(SystemAddress systemAddress, RPCIdentifier identifier, unsigned int *outerIndex, unsigned int *innerIndex);
00638
00639
00640 DataStructures::List<LocalRPCFunction> localFunctions;
00641 DataStructures::Map<SystemAddress, DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *> remoteFunctions;
00642
00643 RakNetTime outgoingTimestamp;
00644 PacketPriority outgoingPriority;
00645 PacketReliability outgoingReliability;
00646 char outgoingOrderingChannel;
00647 AddressOrGUID outgoingSystemIdentifier;
00648 bool outgoingBroadcast;
00649 NetworkID outgoingNetworkID;
00650 RakNet::BitStream outgoingExtraData;
00651
00652 RakNetTime incomingTimeStamp;
00653 SystemAddress incomingSystemAddress;
00654 RakNet::BitStream incomingExtraData;
00655
00656 NetworkIDManager *networkIdManager;
00657 char currentExecution[512];
00658 };
00659
00660 }
00661
00662 #endif
00663
00664 #ifdef _MSC_VER
00665 #pragma warning( pop )
00666 #endif
00667
00668 #endif // _RAKNET_SUPPORT_*