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.map; 18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.DataOutputStream; 20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.IOException; 21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.InputStream; 22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ClientOperation; 24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ClientSession; 25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.HeaderSet; 26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.Operation; 27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ResponseCodes; 28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaabstract class BluetoothMasRequest { 30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_MAX_LIST_COUNT = 0x01; 32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_START_OFFSET = 0x02; 33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER_MESSAGE_TYPE = 0x03; 34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER_PERIOD_BEGIN = 0x04; 35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER_PERIOD_END = 0x05; 36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER_READ_STATUS = 0x06; 37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER_RECIPIENT = 0x07; 38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER_ORIGINATOR = 0x08; 39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FILTER_PRIORITY = 0x09; 40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_ATTACHMENT = 0x0a; 41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_TRANSPARENT = 0xb; 42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_RETRY = 0xc; 43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_NEW_MESSAGE = 0x0d; 44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_NOTIFICATION_STATUS = 0x0e; 45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_MAS_INSTANCE_ID = 0x0f; 464231be1e03b7c5e563fea1fa7c56abfe2a1e61ddHemant Gupta protected static final byte OAP_TAGID_PARAMETER_MASK = 0x10; 47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_FOLDER_LISTING_SIZE = 0x11; 48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_MESSAGES_LISTING_SIZE = 0x12; 49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_SUBJECT_LENGTH = 0x13; 50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_CHARSET = 0x14; 51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_STATUS_INDICATOR = 0x17; 52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_STATUS_VALUE = 0x18; 53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte OAP_TAGID_MSE_TIME = 0x19; 54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte NOTIFICATION_ON = 0x01; 56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte NOTIFICATION_OFF = 0x00; 57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte ATTACHMENT_ON = 0x01; 59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte ATTACHMENT_OFF = 0x00; 60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte CHARSET_NATIVE = 0x00; 62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte CHARSET_UTF8 = 0x01; 63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte STATUS_INDICATOR_READ = 0x00; 65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte STATUS_INDICATOR_DELETED = 0x01; 66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte STATUS_NO = 0x00; 68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte STATUS_YES = 0x01; 69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte TRANSPARENT_OFF = 0x00; 71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte TRANSPARENT_ON = 0x01; 72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte RETRY_OFF = 0x00; 74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static byte RETRY_ON = 0x01; 75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* used for PUT requests which require filler byte */ 77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected static final byte[] FILLER_BYTE = { 78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 0x30 79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta }; 80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected HeaderSet mHeaderSet; 82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected int mResponseCode; 84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public BluetoothMasRequest() { 86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mHeaderSet = new HeaderSet(); 87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta abstract public void execute(ClientSession session) throws IOException; 90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected void executeGet(ClientSession session) throws IOException { 92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta ClientOperation op = null; 93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta op = (ClientOperation) session.get(mHeaderSet); 96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* 98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * MAP spec does not explicitly require that GET request should be 99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * sent in single packet but for some reason PTS complains when 100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * final GET packet with no headers follows non-final GET with all 101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * headers. So this is workaround, at least temporary. TODO: check 102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * with PTS 103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta op.setGetFinalFlag(true); 105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* 107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * this will trigger ClientOperation to use non-buffered stream so 108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta * we can abort operation 109192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta */ 110192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta op.continueOperation(true, false); 111192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 112192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta readResponseHeaders(op.getReceivedHeader()); 113192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 114192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta InputStream is = op.openInputStream(); 115192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta readResponse(is); 116192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta is.close(); 117192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 118192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta op.close(); 119192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 120192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mResponseCode = op.getResponseCode(); 121192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 122192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; 123192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 124192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta throw e; 125192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 126192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 127192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 128192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected void executePut(ClientSession session, byte[] body) throws IOException { 129192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Operation op = null; 130192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 131192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mHeaderSet.setHeader(HeaderSet.LENGTH, Long.valueOf(body.length)); 132192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 133192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 134192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta op = session.put(mHeaderSet); 135192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 136192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta DataOutputStream out = op.openDataOutputStream(); 137192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta out.write(body); 138192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta out.close(); 139192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 140192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta readResponseHeaders(op.getReceivedHeader()); 141192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 142192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta op.close(); 143192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mResponseCode = op.getResponseCode(); 144192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 145192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mResponseCode = ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; 146192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 147192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta throw e; 148192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 149192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 150192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 151192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta final public boolean isSuccess() { 152192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return (mResponseCode == ResponseCodes.OBEX_HTTP_OK); 153192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 154192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 155192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected void readResponse(InputStream stream) throws IOException { 156192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* nothing here by default */ 157192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 158192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 159192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta protected void readResponseHeaders(HeaderSet headerset) { 160192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta /* nothing here by default */ 161192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 162192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta} 163