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.utils; 18192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 19192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.io.IOException; 20192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.nio.ByteBuffer; 21192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.HashMap; 22192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport java.util.Map; 23192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 24192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptaimport javax.obex.HeaderSet; 25192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 26192d793d2586b620027edd5b45ff4c72a86cc7beHemant Guptapublic final class ObexAppParameters { 27192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 28192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta private final HashMap<Byte, byte[]> mParams; 29192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 30192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public ObexAppParameters() { 31192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams = new HashMap<Byte, byte[]>(); 32192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 33192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 34192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public ObexAppParameters(byte[] raw) { 35192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams = new HashMap<Byte, byte[]>(); 36192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 37192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (raw != null) { 38192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta for (int i = 0; i < raw.length;) { 39192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (raw.length - i < 2) { 40192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 41192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 42192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 43192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte tag = raw[i++]; 44192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte len = raw[i++]; 45192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 46192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (raw.length - i - len < 0) { 47192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta break; 48192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 49192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 50192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] val = new byte[len]; 51192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 52192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta System.arraycopy(raw, i, val, 0, len); 53192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta this.add(tag, val); 54192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 55192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta i += len; 56192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 57192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 58192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 59192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 60192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public static ObexAppParameters fromHeaderSet(HeaderSet headerset) { 61192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta try { 62192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] raw = (byte[]) headerset.getHeader(HeaderSet.APPLICATION_PARAMETER); 63192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return new ObexAppParameters(raw); 64192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } catch (IOException e) { 65192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta // won't happen 66192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 67192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 68192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return null; 69192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 70192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 71192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public byte[] getHeader() { 72192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int length = 0; 73192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 74192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta for (Map.Entry<Byte, byte[]> entry : mParams.entrySet()) { 75192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta length += (entry.getValue().length + 2); 76192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 77192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 78192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] ret = new byte[length]; 79192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 80192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta int idx = 0; 81192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta for (Map.Entry<Byte, byte[]> entry : mParams.entrySet()) { 82192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta length = entry.getValue().length; 83192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 84192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta ret[idx++] = entry.getKey(); 85192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta ret[idx++] = (byte) length; 86192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta System.arraycopy(entry.getValue(), 0, ret, idx, length); 87192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta idx += length; 88192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 89192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 90192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ret; 91192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 92192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 93192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void addToHeaderSet(HeaderSet headerset) { 94192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (mParams.size() > 0) { 95192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta headerset.setHeader(HeaderSet.APPLICATION_PARAMETER, getHeader()); 96192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 97192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 98192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 99192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public boolean exists(byte tag) { 100192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mParams.containsKey(tag); 101192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 102192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 103192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void add(byte tag, byte val) { 104192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = ByteBuffer.allocate(1).put(val).array(); 105192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams.put(tag, bval); 106192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 107192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 108192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void add(byte tag, short val) { 109192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = ByteBuffer.allocate(2).putShort(val).array(); 110192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams.put(tag, bval); 111192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 112192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 113192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void add(byte tag, int val) { 114192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = ByteBuffer.allocate(4).putInt(val).array(); 115192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams.put(tag, bval); 116192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 117192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 118192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void add(byte tag, long val) { 119192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = ByteBuffer.allocate(8).putLong(val).array(); 120192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams.put(tag, bval); 121192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 122192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 123192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void add(byte tag, String val) { 124192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = val.getBytes(); 125192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams.put(tag, bval); 126192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 127192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 128192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public void add(byte tag, byte[] bval) { 129192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta mParams.put(tag, bval); 130192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 131192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 132192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public byte getByte(byte tag) { 133192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = mParams.get(tag); 134192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 135192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (bval == null || bval.length < 1) { 136192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return 0; 137192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 138192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 139192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ByteBuffer.wrap(bval).get(); 140192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 141192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 142192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public short getShort(byte tag) { 143192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = mParams.get(tag); 144192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 145192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (bval == null || bval.length < 2) { 146192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return 0; 147192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 148192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 149192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ByteBuffer.wrap(bval).getShort(); 150192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 151192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 152192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public int getInt(byte tag) { 153192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = mParams.get(tag); 154192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 155192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (bval == null || bval.length < 4) { 156192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return 0; 157192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 158192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 159192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return ByteBuffer.wrap(bval).getInt(); 160192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 161192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 162192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public String getString(byte tag) { 163192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = mParams.get(tag); 164192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 165192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta if (bval == null) { 166192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return null; 167192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 168192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 169192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return new String(bval); 170192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 171192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 172192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public byte[] getByteArray(byte tag) { 173192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta byte[] bval = mParams.get(tag); 174192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 175192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return bval; 176192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 177192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta 178192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta @Override 179192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta public String toString() { 180192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta return mParams.toString(); 181192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta } 182192d793d2586b620027edd5b45ff4c72a86cc7beHemant Gupta} 183