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 android.os.Handler; 20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.util.Log; 21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport android.bluetooth.client.map.utils.ObexAppParameters; 23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.IOException; 25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.Arrays; 26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.HeaderSet; 28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.Operation; 29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ResponseCodes; 30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.ServerRequestHandler; 31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaclass BluetoothMnsObexServer extends ServerRequestHandler { 33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final static String TAG = "BluetoothMnsObexServer"; 35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private static final byte[] MNS_TARGET = new byte[] { 37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta (byte) 0xbb, 0x58, 0x2b, 0x41, 0x42, 0x0c, 0x11, (byte) 0xdb, (byte) 0xb0, (byte) 0xde, 38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 0x08, 0x00, 0x20, 0x0c, (byte) 0x9a, 0x66 39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta }; 40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final static String TYPE = "x-bt/MAP-event-report"; 42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final Handler mCallback; 44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public BluetoothMnsObexServer(Handler callback) { 46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta super(); 47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mCallback = callback; 49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public int onConnect(final HeaderSet request, HeaderSet reply) { 53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onConnect"); 54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] uuid = (byte[]) request.getHeader(HeaderSet.TARGET); 57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (!Arrays.equals(uuid, MNS_TARGET)) { 59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_NOT_ACCEPTABLE; 60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta // this should never happen since getHeader won't throw exception it 64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta // declares to throw 65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; 66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta reply.setHeader(HeaderSet.WHO, MNS_TARGET); 69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_OK; 70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void onDisconnect(final HeaderSet request, HeaderSet reply) { 74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onDisconnect"); 75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public int onGet(final Operation op) { 79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onGet"); 80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_BAD_REQUEST; 82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public int onPut(final Operation op) { 86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onPut"); 87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta HeaderSet headerset; 90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta headerset = op.getReceivedHeader(); 91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta String type = (String) headerset.getHeader(HeaderSet.TYPE); 93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta ObexAppParameters oap = ObexAppParameters.fromHeaderSet(headerset); 94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (!TYPE.equals(type) || !oap.exists(BluetoothMasRequest.OAP_TAGID_MAS_INSTANCE_ID)) { 96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_BAD_REQUEST; 97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Byte inst = oap.getByte(BluetoothMasRequest.OAP_TAGID_MAS_INSTANCE_ID); 100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta BluetoothMapEventReport ev = BluetoothMapEventReport.fromStream(op 102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta .openDataInputStream()); 103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta op.close(); 105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mCallback.obtainMessage(BluetoothMnsService.MSG_EVENT, inst, 0, ev).sendToTarget(); 107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.e(TAG, "I/O exception when handling PUT request", e); 109192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR; 110192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 111192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 112192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_OK; 113192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 114192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 115192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 116192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public int onAbort(final HeaderSet request, HeaderSet reply) { 117192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onAbort"); 118192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 119192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_NOT_IMPLEMENTED; 120192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 121192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 122192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 123192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public int onSetPath(final HeaderSet request, HeaderSet reply, 124192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta final boolean backup, final boolean create) { 125192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onSetPath"); 126192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 127192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ResponseCodes.OBEX_HTTP_BAD_REQUEST; 128192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 129192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 130192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 131192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void onClose() { 132192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta Log.v(TAG, "onClose"); 133192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 134192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta // TODO: call session handler so it can disconnect 135192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 136192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta} 137