MCPcopy Create free account
hub / github.com/NazaraEngine/NazaraEngine / QueueIncomingCommand

Method QueueIncomingCommand

src/Nazara/Network/ENetPeer.cpp:1088–1247  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1086 }
1087
1088 ENetPeer::IncomingCommmand* ENetPeer::QueueIncomingCommand(const ENetProtocol& command, const void* data, std::size_t dataLength, UInt32 flags, UInt32 fragmentCount)
1089 {
1090 static IncomingCommmand dummyCommand;
1091
1092 UInt32 reliableSequenceNumber = 0;
1093 UInt32 unreliableSequenceNumber = 0;
1094 UInt16 reliableWindow;
1095 UInt16 currentWindow;
1096
1097 auto discardCommand = [&]() -> IncomingCommmand*
1098 {
1099 if (fragmentCount > 0)
1100 return nullptr; //< Error
1101
1102 return &dummyCommand;
1103 };
1104
1105 if (m_state == ENetPeerState::DisconnectLater)
1106 return discardCommand();
1107
1108 Channel& channel = m_channels[command.header.channelID];
1109
1110 if ((command.header.command & ENetProtocolCommand_Mask) != ENetProtocolCommand_SendUnsequenced)
1111 {
1112 reliableSequenceNumber = command.header.reliableSequenceNumber;
1113 reliableWindow = reliableSequenceNumber / ENetConstants::ENetPeer_ReliableWindowSize;
1114 currentWindow = channel.incomingReliableSequenceNumber / ENetConstants::ENetPeer_ReliableWindowSize;
1115
1116 if (reliableSequenceNumber < channel.incomingReliableSequenceNumber)
1117 reliableWindow += ENetConstants::ENetPeer_ReliableWindows;
1118
1119 if (reliableWindow < currentWindow || reliableWindow >= currentWindow + ENetConstants::ENetPeer_FreeReliableWindows - 1)
1120 return discardCommand();
1121 }
1122
1123 std::list<IncomingCommmand>* commandList = nullptr;
1124 std::list<IncomingCommmand>::reverse_iterator currentCommand;
1125
1126 switch (command.header.command & ENetProtocolCommand_Mask)
1127 {
1128 case ENetProtocolCommand_SendFragment:
1129 case ENetProtocolCommand_SendReliable:
1130 {
1131 if (reliableSequenceNumber == channel.incomingReliableSequenceNumber)
1132 return discardCommand();
1133
1134 commandList = &channel.incomingReliableCommands;
1135
1136 for (currentCommand = channel.incomingReliableCommands.rbegin(); currentCommand != channel.incomingReliableCommands.rend(); ++currentCommand)
1137 {
1138 IncomingCommmand& incomingCommand = *currentCommand;
1139
1140 if (reliableSequenceNumber >= channel.incomingReliableSequenceNumber)
1141 {
1142 if (incomingCommand.reliableSequenceNumber < channel.incomingReliableSequenceNumber)
1143 continue;
1144 }
1145 else

Callers

nothing calls this directly

Calls 3

AllocatePacketMethod · 0.80
ResetMethod · 0.45
ResizeMethod · 0.45

Tested by

no test coverage detected