summaryrefslogtreecommitdiff
path: root/main/client/src/ProxyStreamPumper.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/client/src/ProxyStreamPumper.java')
-rw-r--r--main/client/src/ProxyStreamPumper.java60
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);
+ }
+ }
+ }
+ }
+
+}