package org.kne.cloud.network;

import java.io.*;
import java.util.Objects;
import java.util.UUID;

import org.kne.io.Task;

public class StreamBridge extends Task{
	private static final boolean debug =false;
	
	protected InputStream in;
	protected OutputStream out;
	protected int blocksize=65535;
	protected long delay=0;
	public StreamBridge(InputStream in, OutputStream out) {
		super();
		Objects.requireNonNull(in);
		Objects.requireNonNull(out);
		this.in = in;
		this.out = out;
	}
	
	@Override
	public void runTask() {
		//FileOutputStream fos=null;
		try {
			//fos=new FileOutputStream(UUID.randomUUID()+".txt");
		int v=-1;
		byte[]b=new byte[blocksize];
			while ((v=in.read(b))!=-1) {
			//	fos.write(b, 0, v);
				out.write(b,0,v);
				out.flush();
				if(delay>0) {
				try {
					Thread.sleep(delay);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				}else {
					Thread.yield();
				}
			}
		} catch (IOException e) {
			if(debug)
			e.printStackTrace();
		}finally {
			/*if(fos!=null)
				try {
					fos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}*/
			try {
				if(in!=null)
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(in!=null)
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	public int getBlocksize() {
		return blocksize;
	}

	public void setBlocksize(int blocksize) {
		this.blocksize = blocksize;
	}
	public long getDelay() {
		return delay;
	}

	public void setDelay(long delay) {
		this.delay = delay;
	}

	public void runAtNewThread() {
		runAtNewThread("StreamBridge thread");
	}
	public Thread runAtNewThread(String name) {
		Thread t=ThreadTool.makeVThreadIfSupport(name, this);
		t.start();
		return t;
	}
	
}
