| 170 | } |
| 171 | |
| 172 | void CNetBase::SendPacket(NETSOCKET Socket, NETADDR *pAddr, CNetPacketConstruct *pPacket, SECURITY_TOKEN SecurityToken, bool Sixup) |
| 173 | { |
| 174 | dbg_assert(IsValidConnectionOrientedPacket(pPacket), "Invalid packet to send. Flags=%d Ack=%d NumChunks=%d Size=%d", |
| 175 | pPacket->m_Flags, pPacket->m_Ack, pPacket->m_NumChunks, pPacket->m_DataSize); |
| 176 | dbg_assert((pPacket->m_Flags & NET_PACKETFLAG_COMPRESSION) == 0, "Do not set NET_PACKETFLAG_COMPRESSION, it will be set automatically when appropriate"); |
| 177 | |
| 178 | unsigned char aBuffer[NET_MAX_PACKETSIZE]; |
| 179 | |
| 180 | // log the data |
| 181 | if(ms_DataLogSent) |
| 182 | { |
| 183 | int Type = 1; |
| 184 | io_write(ms_DataLogSent, &Type, sizeof(Type)); |
| 185 | io_write(ms_DataLogSent, &pPacket->m_DataSize, sizeof(pPacket->m_DataSize)); |
| 186 | io_write(ms_DataLogSent, &pPacket->m_aChunkData, pPacket->m_DataSize); |
| 187 | io_flush(ms_DataLogSent); |
| 188 | } |
| 189 | |
| 190 | int HeaderSize = NET_PACKETHEADERSIZE; |
| 191 | if(Sixup) |
| 192 | { |
| 193 | HeaderSize += sizeof(SecurityToken); |
| 194 | WriteSecurityToken(aBuffer + 3, SecurityToken); |
| 195 | } |
| 196 | else if(SecurityToken != NET_SECURITY_TOKEN_UNSUPPORTED) |
| 197 | { |
| 198 | // append security token |
| 199 | // if SecurityToken is NET_SECURITY_TOKEN_UNKNOWN we will still append it hoping to negotiate it |
| 200 | WriteSecurityToken(pPacket->m_aChunkData + pPacket->m_DataSize, SecurityToken); |
| 201 | pPacket->m_DataSize += sizeof(SecurityToken); |
| 202 | } |
| 203 | |
| 204 | // only compress non-control packets |
| 205 | int CompressedSize = -1; |
| 206 | if((pPacket->m_Flags & NET_PACKETFLAG_CONTROL) == 0) |
| 207 | { |
| 208 | CompressedSize = ms_Huffman.Compress(pPacket->m_aChunkData, pPacket->m_DataSize, &aBuffer[HeaderSize], NET_MAX_PACKETSIZE - HeaderSize); |
| 209 | } |
| 210 | |
| 211 | // check if the compression was enabled, successful and good enough |
| 212 | int FinalSize; |
| 213 | if(CompressedSize > 0 && CompressedSize < pPacket->m_DataSize) |
| 214 | { |
| 215 | FinalSize = CompressedSize; |
| 216 | pPacket->m_Flags |= NET_PACKETFLAG_COMPRESSION; |
| 217 | } |
| 218 | else |
| 219 | { |
| 220 | // use uncompressed data |
| 221 | FinalSize = pPacket->m_DataSize; |
| 222 | mem_copy(&aBuffer[HeaderSize], pPacket->m_aChunkData, pPacket->m_DataSize); |
| 223 | } |
| 224 | |
| 225 | if(Sixup) |
| 226 | { |
| 227 | pPacket->m_Flags = PacketFlags_SixToSeven(pPacket->m_Flags); |
| 228 | } |
| 229 |
nothing calls this directly
no test coverage detected