blob: 220698ac353b69ca42e4cf9653ee2b833930ada9 [file] [log] [blame]
package com.android.bluetooth.tests;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ObexTestDataHandler {
final String TAG;
String TAG_BASE = "ObexTestDataHandler";
static final boolean V = true;
private static final long PROGRESS_INTERVAL_MS = 1000;
int mBufferSize = 0;
int mThrottle = 0;
long mBytesToTransfer = 0;
long mBytesTransfered = 0;
long mStartTime = 0;
long mLastReport = 0;
IResultLogger mResults;
public ObexTestDataHandler(String tag) {
TAG = TAG_BASE + tag;
}
/**
* Call after a sleep to calculate the number of buffers to
* send to match the throttle value.
*
* @param bufferSize
* @param throttle
* @return the number of buffers to send, to match the throttle value
*/
private int getNumberOfBuffers() {
if(mThrottle == 0) {
return 1;
}
long deltaT = System.currentTimeMillis() - mStartTime;
long deltaB = deltaT*mThrottle/1000; // the amount of bytes we should have sent
long bytesMissing = deltaB-mBytesTransfered;
return (int)((bytesMissing+(mBufferSize>>1))/mBufferSize); // Round result
}
private void publishProgressIfNeeded() {
long now = System.currentTimeMillis();
if((now-mLastReport) > PROGRESS_INTERVAL_MS) {
mLastReport = now;
String result = "Avg: " + mResults.getAverageSpeed()/1024
+ " Avg(1s): " + mResults.getAverageSpeed(1000)/1024 +
" mBytesTransfered: " + mBytesTransfered + "\n";
if(V) Log.v(TAG,result);
}
}
public void readData(InputStream inStream, ObexTestParams params) {
/* TODO: parse in the step params
* Consider introducing a testStep prepare and wait for completion interface?
* in stead of using OBEX headers to carry the index... */
mBufferSize = params.packageSize;
mThrottle = params.throttle;
mBytesToTransfer = params.bytesToSend;
mBytesTransfered = 0;
mResults = TestResultLogger.createLogger();
mStartTime = System.currentTimeMillis();
byte[] buffer = new byte[params.packageSize];
if(V) Log.v(TAG, "readData() started data to read: " + params.bytesToSend);
try {
while(mBytesTransfered < mBytesToTransfer) {
int nRx = getNumberOfBuffers();
for(; nRx > 0 ; nRx--) {
if(V) Log.v(TAG, "Read()");
int count = inStream.read(buffer);
if(V) Log.v(TAG, "Read() done - count=" + count);
if(count == -1) {
throw new IOException("EOF reached too early mBytesTransfered=" + mBytesTransfered);
}
mBytesTransfered += count;
if(mBytesTransfered >= mBytesToTransfer) {
nRx=0; // break
}
mResults.addResult(mBytesTransfered);
publishProgressIfNeeded();
}
if(mThrottle != 0) {
// Sleep one package of time.
try {
long sleepTime = (1000*mBufferSize)/mThrottle;
if(V) Log.v(TAG, "Throttle Sleep():" + sleepTime);
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// Just ignore as the getNumberOfBuffersToSend will compensate
// TODO: Handle Abort
}
}
}
}
catch(IOException e) {
Log.e(TAG, "Error in readData():",e);
} finally {
}
}
public void writeData(OutputStream outStream, ObexTestParams params) {
mBufferSize = params.packageSize;
mThrottle = params.throttle;
mBytesToTransfer= params.bytesToSend;
mBytesTransfered = 0;
mResults = TestResultLogger.createLogger();
mStartTime = System.currentTimeMillis();
byte[] buffer = new byte[params.packageSize];
if(V) Log.v(TAG, "writeData() started data to write: " + params.bytesToSend);
try {
while(mBytesTransfered < mBytesToTransfer) {
int nTx = getNumberOfBuffers();
if(V) Log.v(TAG, "Write nTx " + nTx + " packets");
for(; nTx > 0 ; nTx--) {
if(V) Log.v(TAG, "Write()");
if((mBytesTransfered + mBufferSize) < mBytesToTransfer) {
outStream.write(buffer);
mBytesTransfered += mBufferSize;
} else {
outStream.write(buffer, 0, (int) (mBytesToTransfer-mBytesTransfered));
mBytesTransfered += mBytesToTransfer-mBytesTransfered;
nTx = 0;
}
mResults.addResult(mBytesTransfered);
publishProgressIfNeeded();
if(V) Log.v(TAG, "Write mBytesTransfered: " + mBytesTransfered);
}
if(mThrottle != 0) {
// Sleep one package of time.
try {
long sleepTime = (1000*mBufferSize)/mThrottle;
if(V) Log.v(TAG, "Throttle Sleep():" + sleepTime);
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// Just ignore as the getNumberOfBuffersToSend will compensate
// TODO: Handle Abort
}
}
}
}
catch(IOException e) {
Log.e(TAG, "Error in ListenTask:",e);
}
}
}