package com.android.bluetooth.tests; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.concurrent.CountDownLatch; import javax.obex.HeaderSet; import javax.obex.Operation; import javax.obex.ResponseCodes; import javax.obex.ServerRequestHandler; import android.util.Log; public class ObexTestServer extends ServerRequestHandler { private static final String TAG = "ObexTestServer"; private static final boolean V = true; ArrayList mSequence; CountDownLatch mStopLatch; ObexTestDataHandler mDataHandler; int mOperationIndex = 0; public ObexTestServer(ArrayList sequence, CountDownLatch stopLatch) { super(); mSequence = sequence; mDataHandler = new ObexTestDataHandler("(Server)"); mStopLatch = stopLatch; } /* OBEX operation handlers */ @Override public int onConnect(HeaderSet request, HeaderSet reply) { Log.i(TAG,"onConnect()"); int index; int result = ResponseCodes.OBEX_HTTP_OK; try { index = ((Long)request.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue(); mOperationIndex = index; } catch (IOException e) { Log.e(TAG, "Exception in onConnect - aborting..."); result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; // A read from null will produce exception to end the test. } /* TODO: validate request headers, and set response headers */ return result; } @Override public void onDisconnect(HeaderSet request, HeaderSet reply) { Log.i(TAG,"onDisconnect()"); /* TODO: validate request headers, and set response headers */ int index; int result = ResponseCodes.OBEX_HTTP_OK; try { index = ((Long)request.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue(); mOperationIndex = index; } catch (IOException e) { Log.e(TAG, "Exception in onDisconnect..."); result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; // A read from null will produce exception to end the test. } if(mOperationIndex >= (mSequence.size()-1)) { /* End of test, signal test runner thread */ Log.i(TAG, "Sending latch close signal..."); mStopLatch.countDown(); } else { Log.i(TAG, "Got disconnect with mOperationCounter = " + mOperationIndex); } reply.responseCode = result; } @Override public int onPut(Operation operation) { Log.i(TAG,"onPut()"); /* TODO: validate request headers, and set response headers * Also handle pause/abort */ // 1) Validate request // 2) Open the output stream. // 3) Receive the data // 4) Send response OK InputStream inStream; int result = ResponseCodes.OBEX_HTTP_OK; try{ inStream = operation.openInputStream(); HeaderSet reqHeaders = operation.getReceivedHeader(); int index = ((Long)reqHeaders.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue(); mOperationIndex = index; mDataHandler.readData(inStream, mSequence.get(index).mParams); } catch (IOException e) { Log.e(TAG, "Exception in onPut - aborting..."); inStream = null; result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; // A read from null will produce exception to end the test. } finally { } if(result == ResponseCodes.OBEX_HTTP_OK) { Log.i(TAG, "OBEX-HANDLER: operation complete success"); } else { Log.e(TAG, "OBEX-HANDLER: operation complete FAILED!"); } return result; } @Override public int onGet(Operation operation) { Log.i(TAG,"onGet()"); /* TODO: validate request headers, and set response headers * Also handle pause/abort */ // 1) Validate request // 2) Open the output stream. // 3) Receive the data // 4) Send response OK OutputStream outStream; int result = ResponseCodes.OBEX_HTTP_OK; try{ outStream = operation.openOutputStream(); HeaderSet reqHeaders = operation.getReceivedHeader(); int index = ((Long)reqHeaders.getHeader(TestSequencer.STEP_INDEX_HEADER)).intValue(); mOperationIndex = index; mDataHandler.writeData(outStream, mSequence.get(index).mParams); } catch (IOException e) { Log.e(TAG, "Exception in onGet - aborting..."); outStream = null; result = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; // A read from null will produce exception to end the test. } finally { } if(result == ResponseCodes.OBEX_HTTP_OK) { Log.i(TAG, "OBEX-HANDLER: operation complete success"); } else { Log.e(TAG, "OBEX-HANDLER: operation complete FAILED!"); } return result; } }