bool AutoRPC::GetRemoteFunctionIndex(SystemAddress systemAddress, AutoRPC::RPCIdentifier identifier, unsigned int *outerIndex, unsigned int *innerIndex) { bool objectExists=false; if (remoteFunctions.Has(systemAddress)) { *outerIndex = remoteFunctions.GetIndexAtKey(systemAddress); DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList = remoteFunctions[*outerIndex]; *innerIndex = theList->GetIndexFromKey(identifier, &objectExists); } return objectExists; }
void AutoRPC::OnRPCRemoteIndex(SystemAddress systemAddress, unsigned char *data, unsigned int lengthInBytes) { // A remote system has given us their internal index for a particular function. // Store it and use it from now on, to save bandwidth and search time bool objectExists; char strIdentifier[512]; unsigned int insertionIndex; unsigned int remoteIndex; RemoteRPCFunction newRemoteFunction; RakNet::BitStream bs(data,lengthInBytes,false); RPCIdentifier identifier; bs.Read(identifier.isObjectMember); bs.ReadCompressed(remoteIndex); stringCompressor->DecodeString(strIdentifier,512,&bs,0); identifier.uniqueIdentifier=strIdentifier; if (strIdentifier[0]==0) return; DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> *theList; if (remoteFunctions.Has(systemAddress)) { theList = remoteFunctions.Get(systemAddress); insertionIndex=theList->GetIndexFromKey(identifier, &objectExists); if (objectExists==false) { newRemoteFunction.functionIndex=remoteIndex; newRemoteFunction.identifier.isObjectMember=identifier.isObjectMember; newRemoteFunction.identifier.uniqueIdentifier = (char*) rakMalloc_Ex(strlen(strIdentifier)+1, __FILE__, __LINE__); strcpy(newRemoteFunction.identifier.uniqueIdentifier, strIdentifier); theList->InsertAtIndex(newRemoteFunction, insertionIndex, __FILE__, __LINE__); } } else { theList = RakNet::OP_NEW<DataStructures::OrderedList<RPCIdentifier, RemoteRPCFunction, AutoRPC::RemoteRPCFunctionComp> >( __FILE__, __LINE__ ); newRemoteFunction.functionIndex=remoteIndex; newRemoteFunction.identifier.isObjectMember=identifier.isObjectMember; newRemoteFunction.identifier.uniqueIdentifier = (char*) rakMalloc_Ex(strlen(strIdentifier)+1, __FILE__, __LINE__); strcpy(newRemoteFunction.identifier.uniqueIdentifier, strIdentifier); theList->InsertAtEnd(newRemoteFunction, __FILE__, __LINE__); remoteFunctions.SetNew(systemAddress,theList); } }