| 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 |
nothing calls this directly
no test coverage detected