diff options
Diffstat (limited to 'main/client/src/ProxyStreamPumper.java')
-rw-r--r-- | main/client/src/ProxyStreamPumper.java | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/main/client/src/ProxyStreamPumper.java b/main/client/src/ProxyStreamPumper.java new file mode 100644 index 00000000..977323f3 --- /dev/null +++ b/main/client/src/ProxyStreamPumper.java @@ -0,0 +1,60 @@ +package mill.main.client; + + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class ProxyStreamPumper implements Runnable{ + private InputStream src; + private OutputStream dest1; + private OutputStream dest2; + public ProxyStreamPumper(InputStream src, OutputStream dest1, OutputStream dest2){ + this.src = src; + this.dest1 = dest1; + this.dest2 = dest2; + } + + public void run() { + byte[] buffer = new byte[1024]; + boolean running = true; + boolean first = true; + while (running) { + try { + int quantity0 = (byte)src.read(); + int quantity = Math.abs(quantity0); + int offset = 0; + int delta = -1; + while(offset < quantity){ + delta = src.read(buffer, offset, quantity - offset); + if (delta == -1) { + running = false; + break; + }else{ + offset += delta; + } + } + + if (delta != -1){ + if (quantity0 > 0) dest1.write(buffer, 0, offset); + else dest2.write(buffer, 0, offset); + } + } catch (IOException e) { + // Win32NamedPipeSocket input stream somehow doesn't return -1, + // instead it throws an IOException whose message contains "ReadFile()". + // However, if it throws an IOException before ever reading some bytes, + // it could not connect to the server, so exit. + if (Util.isWindows && e.getMessage().contains("ReadFile()")) { + if (first) { + System.err.println("Failed to connect to server"); + System.exit(1); + } else running = false; + } else { + e.printStackTrace(); + System.exit(1); + } + } + } + } + +} |