diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-31 20:22:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-31 20:22:09 +1000 |
commit | 0ef88075395cdf703b8fae6b729dd0a997b07423 (patch) | |
tree | bc2ec1f5d998190e286c07b2f3bb0e9b442f17ed /source/game/StarNetPacketSocket.cpp | |
parent | 2dc10fa5ad76784c7053d00887a7f878b58dfcf9 (diff) |
Changes to support modifying networking while maintaining legacy support
Diffstat (limited to 'source/game/StarNetPacketSocket.cpp')
-rw-r--r-- | source/game/StarNetPacketSocket.cpp | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/source/game/StarNetPacketSocket.cpp b/source/game/StarNetPacketSocket.cpp index f6ebce0..e2bd629 100644 --- a/source/game/StarNetPacketSocket.cpp +++ b/source/game/StarNetPacketSocket.cpp @@ -55,6 +55,9 @@ Maybe<PacketStats> PacketSocket::outgoingStats() const { return {}; } +void PacketSocket::setLegacy(bool legacy) { m_legacy = legacy; } +bool PacketSocket::legacy() const { return m_legacy; } + pair<LocalPacketSocketUPtr, LocalPacketSocketUPtr> LocalPacketSocket::openPair() { auto lhsIncomingPipe = make_shared<Pipe>(); auto rhsIncomingPipe = make_shared<Pipe>(); @@ -138,23 +141,32 @@ void TcpPacketSocket::sendPackets(List<PacketPtr> packets) { while (it.hasNext()) { PacketType currentType = it.peekNext()->type(); + PacketCompressionMode currentCompressionMode = it.peekNext()->compressionMode(); DataStreamBuffer packetBuffer; - while (it.hasNext() && it.peekNext()->type() == currentType) - it.next()->write(packetBuffer); + while (it.hasNext() + && it.peekNext()->type() == currentType + && it.peekNext()->compressionMode() == currentCompressionMode) { + if (legacy()) + it.next()->writeLegacy(packetBuffer); + else + it.next()->write(packetBuffer); + } // Packets must read and write actual data, because this is used to // determine packet count starAssert(!packetBuffer.empty()); ByteArray compressedPackets; - if (packetBuffer.size() > 64) + bool mustCompress = currentCompressionMode == PacketCompressionMode::Enabled; + bool perhapsCompress = currentCompressionMode == PacketCompressionMode::Automatic && packetBuffer.size() > 64; + if (mustCompress || perhapsCompress) compressedPackets = compressData(packetBuffer.data()); DataStreamBuffer outBuffer; outBuffer.write(currentType); - if (!compressedPackets.empty() && compressedPackets.size() < packetBuffer.size()) { + if (!compressedPackets.empty() && (mustCompress || compressedPackets.size() < packetBuffer.size())) { outBuffer.writeVlqI(-(int)(compressedPackets.size())); outBuffer.writeData(compressedPackets.ptr(), compressedPackets.size()); m_outgoingStats.mix(currentType, compressedPackets.size()); @@ -208,7 +220,11 @@ List<PacketPtr> TcpPacketSocket::receivePackets() { DataStreamBuffer packetStream(move(packetBytes)); do { PacketPtr packet = createPacket(packetType); - packet->read(packetStream); + packet->setCompressionMode(packetCompressed ? PacketCompressionMode::Enabled : PacketCompressionMode::Disabled); + if (legacy()) + packet->readLegacy(packetStream); + else + packet->read(packetStream); packets.append(move(packet)); } while (!packetStream.atEnd()); @@ -299,23 +315,32 @@ void P2PPacketSocket::sendPackets(List<PacketPtr> packets) { while (it.hasNext()) { PacketType currentType = it.peekNext()->type(); + PacketCompressionMode currentCompressionMode = it.peekNext()->compressionMode(); DataStreamBuffer packetBuffer; - while (it.hasNext() && it.peekNext()->type() == currentType) - it.next()->write(packetBuffer); + while (it.hasNext() + && it.peekNext()->type() == currentType + && it.peekNext()->compressionMode() == currentCompressionMode) { + if (legacy()) + it.next()->writeLegacy(packetBuffer); + else + it.next()->write(packetBuffer); + } // Packets must read and write actual data, because this is used to // determine packet count starAssert(!packetBuffer.empty()); ByteArray compressedPackets; - if (packetBuffer.size() > 64) + bool mustCompress = currentCompressionMode == PacketCompressionMode::Enabled; + bool perhapsCompress = currentCompressionMode == PacketCompressionMode::Automatic && packetBuffer.size() > 64; + if (mustCompress || perhapsCompress) compressedPackets = compressData(packetBuffer.data()); DataStreamBuffer outBuffer; outBuffer.write(currentType); - if (!compressedPackets.empty() && compressedPackets.size() < packetBuffer.size()) { + if (!compressedPackets.empty() && (mustCompress || compressedPackets.size() < packetBuffer.size())) { outBuffer.write<bool>(true); outBuffer.writeData(compressedPackets.ptr(), compressedPackets.size()); m_outgoingStats.mix(currentType, compressedPackets.size()); @@ -347,7 +372,11 @@ List<PacketPtr> P2PPacketSocket::receivePackets() { DataStreamBuffer packetStream(move(packetBytes)); do { PacketPtr packet = createPacket(packetType); - packet->read(packetStream); + packet->setCompressionMode(packetCompressed ? PacketCompressionMode::Enabled : PacketCompressionMode::Disabled); + if (legacy()) + packet->readLegacy(packetStream); + else + packet->read(packetStream); packets.append(move(packet)); } while (!packetStream.atEnd()); } |