package org.ripple.power.speed;
import java.io.IOException;
import java.io.InputStream;
public class SpeedOMeterInpotStream extends InputStream {
private InputStream mIs;
private int mSize;
private int mReaded;
private boolean started = false;
private long t1;
private long t2;
private SpeedListener mNetworkSpeedListener;
private int mStreamIndex;
public SpeedOMeterInpotStream(InputStream is, int size, int streamIndex,
SpeedListener networkSpeedListener) {
mIs = is;
mSize = size;
mStreamIndex = streamIndex;
mNetworkSpeedListener = networkSpeedListener;
}
@Override
public int read() throws IOException {
checkInit();
int aux = mIs.read();
if (!isEnd(aux)) {
mReaded++;
}
checkSize();
return aux;
}
@Override
public int read(byte[] buffer) throws IOException {
checkInit();
int aux = mIs.read(buffer);
if (!isEnd(aux)) {
mReaded += aux;
}
checkSize();
return aux;
}
@Override
public int read(byte[] buffer, int offset, int length) throws IOException {
checkInit();
int aux = mIs.read(buffer, offset, length);
if (!isEnd(aux)) {
mReaded += aux;
}
checkSize();
return aux;
}
private void checkInit() {
if (!started) {
started = true;
t1 = System.currentTimeMillis();
}
}
private boolean isEnd(int result) {
if (result == -1) {
return true;
} else {
return false;
}
}
private void checkSize() {
if (mReaded >= (mSize - 100)) {
t2 = System.currentTimeMillis();
long ms = t2 - t1;
float speed = (float) mReaded / ((float) ms / (float) 1000l);
mNetworkSpeedListener.networkSpeed(0, mStreamIndex, speed);
}
}
@Override
public long skip(long byteCount) throws IOException {
return mIs.skip(byteCount);
}
}