mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 05:33:00 +00:00 
			
		
		
		
	Remove compression from terminal/monitor packets
This commit is contained in:
		| @@ -5,18 +5,10 @@ | ||||
| package dan200.computercraft.shared.computer.terminal; | ||||
| 
 | ||||
| import io.netty.buffer.ByteBuf; | ||||
| import io.netty.buffer.ByteBufInputStream; | ||||
| import io.netty.buffer.ByteBufOutputStream; | ||||
| import io.netty.buffer.Unpooled; | ||||
| import net.minecraft.network.FriendlyByteBuf; | ||||
| 
 | ||||
| import javax.annotation.Nullable; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.OutputStream; | ||||
| import java.io.UncheckedIOException; | ||||
| import java.util.zip.GZIPInputStream; | ||||
| import java.util.zip.GZIPOutputStream; | ||||
| 
 | ||||
| /** | ||||
|  * A snapshot of a terminal's state. | ||||
| @@ -31,20 +23,10 @@ public class TerminalState { | ||||
|     public final int width; | ||||
|     public final int height; | ||||
| 
 | ||||
|     private final boolean compress; | ||||
| 
 | ||||
|     @Nullable | ||||
|     private final ByteBuf buffer; | ||||
| 
 | ||||
|     private @Nullable ByteBuf compressed; | ||||
| 
 | ||||
|     public TerminalState(@Nullable NetworkedTerminal terminal) { | ||||
|         this(terminal, true); | ||||
|     } | ||||
| 
 | ||||
|     public TerminalState(@Nullable NetworkedTerminal terminal, boolean compress) { | ||||
|         this.compress = compress; | ||||
| 
 | ||||
|         if (terminal == null) { | ||||
|             colour = false; | ||||
|             width = height = 0; | ||||
| @@ -61,14 +43,13 @@ public class TerminalState { | ||||
| 
 | ||||
|     public TerminalState(FriendlyByteBuf buf) { | ||||
|         colour = buf.readBoolean(); | ||||
|         compress = buf.readBoolean(); | ||||
| 
 | ||||
|         if (buf.readBoolean()) { | ||||
|             width = buf.readVarInt(); | ||||
|             height = buf.readVarInt(); | ||||
| 
 | ||||
|             var length = buf.readVarInt(); | ||||
|             buffer = readCompressed(buf, length, compress); | ||||
|             buffer = buf.readBytes(length); | ||||
|         } else { | ||||
|             width = height = 0; | ||||
|             buffer = null; | ||||
| @@ -77,16 +58,13 @@ public class TerminalState { | ||||
| 
 | ||||
|     public void write(FriendlyByteBuf buf) { | ||||
|         buf.writeBoolean(colour); | ||||
|         buf.writeBoolean(compress); | ||||
| 
 | ||||
|         buf.writeBoolean(buffer != null); | ||||
|         if (buffer != null) { | ||||
|             buf.writeVarInt(width); | ||||
|             buf.writeVarInt(height); | ||||
| 
 | ||||
|             var sendBuffer = getCompressed(); | ||||
|             buf.writeVarInt(sendBuffer.readableBytes()); | ||||
|             buf.writeBytes(sendBuffer, sendBuffer.readerIndex(), sendBuffer.readableBytes()); | ||||
|             buf.writeVarInt(buffer.readableBytes()); | ||||
|             buf.writeBytes(buffer, buffer.readerIndex(), buffer.readableBytes()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @@ -110,40 +88,4 @@ public class TerminalState { | ||||
|         terminal.read(new FriendlyByteBuf(buffer)); | ||||
|         return terminal; | ||||
|     } | ||||
| 
 | ||||
|     private ByteBuf getCompressed() { | ||||
|         if (buffer == null) throw new NullPointerException("buffer"); | ||||
|         if (!compress) return buffer; | ||||
|         if (compressed != null) return compressed; | ||||
| 
 | ||||
|         var compressed = Unpooled.buffer(); | ||||
|         try (OutputStream stream = new GZIPOutputStream(new ByteBufOutputStream(compressed))) { | ||||
|             stream.write(buffer.array(), buffer.arrayOffset(), buffer.readableBytes()); | ||||
|         } catch (IOException e) { | ||||
|             throw new UncheckedIOException(e); | ||||
|         } | ||||
| 
 | ||||
|         return this.compressed = compressed; | ||||
|     } | ||||
| 
 | ||||
|     private static ByteBuf readCompressed(ByteBuf buf, int length, boolean compress) { | ||||
|         if (compress) { | ||||
|             var buffer = Unpooled.buffer(); | ||||
|             try (InputStream stream = new GZIPInputStream(new ByteBufInputStream(buf, length))) { | ||||
|                 var swap = new byte[8192]; | ||||
|                 while (true) { | ||||
|                     var bytes = stream.read(swap); | ||||
|                     if (bytes == -1) break; | ||||
|                     buffer.writeBytes(swap, 0, bytes); | ||||
|                 } | ||||
|             } catch (IOException e) { | ||||
|                 throw new UncheckedIOException(e); | ||||
|             } | ||||
|             return buffer; | ||||
|         } else { | ||||
|             var buffer = Unpooled.buffer(length); | ||||
|             buf.readBytes(buffer, length); | ||||
|             return buffer; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -18,22 +18,11 @@ import static org.junit.jupiter.api.Assertions.*; | ||||
|  */ | ||||
| public class TerminalStateTest { | ||||
|     @RepeatedTest(5) | ||||
|     public void testCompressed() { | ||||
|     public void testRoundTrip() { | ||||
|         var terminal = randomTerminal(); | ||||
| 
 | ||||
|         var buffer = new FriendlyByteBuf(Unpooled.directBuffer()); | ||||
|         new TerminalState(terminal, true).write(buffer); | ||||
| 
 | ||||
|         checkEqual(terminal, read(buffer)); | ||||
|         assertEquals(0, buffer.readableBytes()); | ||||
|     } | ||||
| 
 | ||||
|     @RepeatedTest(5) | ||||
|     public void testUncompressed() { | ||||
|         var terminal = randomTerminal(); | ||||
| 
 | ||||
|         var buffer = new FriendlyByteBuf(Unpooled.directBuffer()); | ||||
|         new TerminalState(terminal, false).write(buffer); | ||||
|         new TerminalState(terminal).write(buffer); | ||||
| 
 | ||||
|         checkEqual(terminal, read(buffer)); | ||||
|         assertEquals(0, buffer.readableBytes()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jonathan Coates
					Jonathan Coates