blob: 39da95d6a21327a185b5b5de56f90074f17e6d31 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Michael Scharf (Wind River) - initial API and implementation
*******************************************************************************/
package org.eclipse.tm.internal.terminal.speedtest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tm.internal.terminal.provisional.api.ITerminalControl;
import org.eclipse.tm.internal.terminal.provisional.api.Logger;
import org.eclipse.tm.internal.terminal.provisional.api.TerminalState;
public class SpeedTestConnection extends Thread {
private static int fgNo;
private final ITerminalControl fControl;
private final InputStream fInputStream;
private final SpeedTestSettings fSettings;
protected SpeedTestConnection(InputStream inputStream, SpeedTestSettings settings,ITerminalControl control) {
super("SpeedTestConnection-"+fgNo++);
fControl = control;
fInputStream=inputStream;
fSettings=settings;
}
public void run() {
fControl.setState(TerminalState.CONNECTED);
try {
readDataForever(fInputStream,fControl.getRemoteToTerminalOutputStream());
} catch (IOException e) {
connectFailed(e.getMessage(),e.getMessage());
}
// when reading is done, we set the state to closed
fControl.setState(TerminalState.CLOSED);
}
private void connectFailed(String terminalText, String msg) {
Logger.log(terminalText);
fControl.displayTextInTerminal(terminalText);
fControl.setState(TerminalState.CLOSED);
fControl.setMsg(msg);
}
/**
* Read the data from the input file and display it in the terminal.
* @param in
* @throws IOException
*/
private void readDataForever(InputStream in, OutputStream os) throws IOException {
long N=0;
long T=0;
long tDisplay=0;
int NCalls=0;
int bufferSize=fSettings.getBufferSize();
int throttle=fSettings.getThrottle();
// read the data
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
// read until the thread gets interrupted....
String info="";
int n=0;
byte[] crnl="\r\n".getBytes("UTF-8");
long t0=System.currentTimeMillis();
String line=null;
do {
line=reader.readLine();
// read some bytes
if(line!=null) {
os.write(line.getBytes("UTF-8"));
os.write(crnl);
n+=line.length();
}
// process at least this number of characters to update the UI
if(line==null || n>bufferSize) {
if(throttle>0)
sleep(throttle);
// we assume we get ASCII UTF8 bytes
long t=System.currentTimeMillis();
T+=t-t0;
N+=n;
NCalls++;
if(t-tDisplay>1000 && T>0) {
long rate=(1000*N)/T;
info=rate+" byte/s = "+rate*8+" baud "+"bytes/call="+N/NCalls;
info=rate+" byte/s with buffer size "+fSettings.getBufferSize();
setTitle(info);
tDisplay=System.currentTimeMillis();
}
n=0;
t0=System.currentTimeMillis();
}
} while(line!=null);
}
private void sleep(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
private void setTitle(final String title) {
Display.getDefault().asyncExec(new Runnable(){
public void run() {
fControl.setTerminalTitle(title);
}});
}
}