• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

AutoRPC.h

Go to the documentation of this file.
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         // Constructor
00173         AutoRPC();
00174 
00175         // Destructor
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         // If you need more than 8 parameters, just add it here...
00585 
00586         // ---------------------------- ALL INTERNAL AFTER HERE ----------------------------
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         // Packet handling functions
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 } // End namespace
00661 
00662 #endif
00663 
00664 #ifdef _MSC_VER
00665 #pragma warning( pop )
00666 #endif
00667 
00668 #endif // _RAKNET_SUPPORT_*

Generated on Thu Sep 30 2010 01:27:21 for RakNet by  doxygen 1.7.1