1192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta/* 2192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Copyright (C) 2014 The Android Open Source Project 3192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 4192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 5192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * you may not use this file except in compliance with the License. 6192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * You may obtain a copy of the License at 7192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 8192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 9192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * 10192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * Unless required by applicable law or agreed to in writing, software 11192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 12192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * See the License for the specific language governing permissions and 14192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * limitations under the License. 15192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 16192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 17192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapackage android.bluetooth.client.pbap; 18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.util.Log; 20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.IOException; 22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.InputStream; 23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ClientOperation; 25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ClientSession; 26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.HeaderSet; 27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ResponseCodes; 28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaabstract class BluetoothPbapRequest { 30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private static final String TAG = "BluetoothPbapRequest"; 32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_ORDER = 0x01; 34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_SEARCH_VALUE = 0x02; 35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_SEARCH_ATTRIBUTE = 0x03; 36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_MAX_LIST_COUNT = 0x04; 37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_LIST_START_OFFSET = 0x05; 38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER = 0x06; 39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FORMAT = 0x07; 40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_PHONEBOOK_SIZE = 0x08; 41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_NEW_MISSED_CALLS = 0x09; 42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected HeaderSet mHeaderSet; 44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected int mResponseCode; 46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private boolean mAborted = false; 48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private ClientOperation mOp = null; 50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public BluetoothPbapRequest() { 52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mHeaderSet = new HeaderSet(); 53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta final public boolean isSuccess() { 56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return (mResponseCode == ResponseCodes.OBEX_HTTP_OK); 57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void execute(ClientSession session) throws IOException { 60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "execute"); 61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* in case request is aborted before can be executed */ 63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mAborted) { 64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; 65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return; 66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mOp = (ClientOperation) session.get(mHeaderSet); 70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* make sure final flag for GET is used (PBAP spec 6.2.2) */ 72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mOp.setGetFinalFlag(true); 73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* 75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * this will trigger ClientOperation to use non-buffered stream so 76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * we can abort operation 77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mOp.continueOperation(true, false); 79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta readResponseHeaders(mOp.getReceivedHeader()); 81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta InputStream is = mOp.openInputStream(); 83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta readResponse(is); 84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta is.close(); 85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mOp.close(); 87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mResponseCode = mOp.getResponseCode(); 89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.d(TAG, "mResponseCode=" + mResponseCode); 91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta checkResponseCode(mResponseCode); 93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.e(TAG, "IOException occured when processing request", e); 95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; 96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta throw e; 98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void abort() { 102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mAborted = true; 103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mOp != null) { 105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mOp.abort(); 107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.e(TAG, "Exception occured when trying to abort", e); 109192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 110192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 111192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 112192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 113192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected void readResponse(InputStream stream) throws IOException { 114192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "readResponse"); 115192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 116192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* nothing here by default */ 117192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 118192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 119192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected void readResponseHeaders(HeaderSet headerset) { 120192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "readResponseHeaders"); 121192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 122192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* nothing here by dafault */ 123192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 124192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 125192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected void checkResponseCode(int responseCode) throws IOException { 126192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "checkResponseCode"); 127192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 128192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* nothing here by dafault */ 129192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 130192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta} 131