1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.bluetooth.pbapclient; 18 19 import java.io.IOException; 20 import java.nio.ByteBuffer; 21 import java.util.HashMap; 22 import java.util.Map; 23 24 import javax.obex.HeaderSet; 25 26 public final class ObexAppParameters { 27 28 private final HashMap<Byte, byte[]> mParams; 29 ObexAppParameters()30 public ObexAppParameters() { 31 mParams = new HashMap<Byte, byte[]>(); 32 } 33 ObexAppParameters(byte[] raw)34 public ObexAppParameters(byte[] raw) { 35 mParams = new HashMap<Byte, byte[]>(); 36 37 if (raw != null) { 38 for (int i = 0; i < raw.length; ) { 39 if (raw.length - i < 2) { 40 break; 41 } 42 43 byte tag = raw[i++]; 44 byte len = raw[i++]; 45 46 if (raw.length - i - len < 0) { 47 break; 48 } 49 50 byte[] val = new byte[len]; 51 52 System.arraycopy(raw, i, val, 0, len); 53 this.add(tag, val); 54 55 i += len; 56 } 57 } 58 } 59 fromHeaderSet(HeaderSet headerset)60 public static ObexAppParameters fromHeaderSet(HeaderSet headerset) { 61 try { 62 byte[] raw = (byte[]) headerset.getHeader(HeaderSet.APPLICATION_PARAMETER); 63 return new ObexAppParameters(raw); 64 } catch (IOException e) { 65 // won't happen 66 } 67 68 return null; 69 } 70 getHeader()71 public byte[] getHeader() { 72 int length = 0; 73 74 for (Map.Entry<Byte, byte[]> entry : mParams.entrySet()) { 75 length += (entry.getValue().length + 2); 76 } 77 78 byte[] ret = new byte[length]; 79 80 int idx = 0; 81 for (Map.Entry<Byte, byte[]> entry : mParams.entrySet()) { 82 length = entry.getValue().length; 83 84 ret[idx++] = entry.getKey(); 85 ret[idx++] = (byte) length; 86 System.arraycopy(entry.getValue(), 0, ret, idx, length); 87 idx += length; 88 } 89 90 return ret; 91 } 92 addToHeaderSet(HeaderSet headerset)93 public void addToHeaderSet(HeaderSet headerset) { 94 if (mParams.size() > 0) { 95 headerset.setHeader(HeaderSet.APPLICATION_PARAMETER, getHeader()); 96 } 97 } 98 exists(byte tag)99 public boolean exists(byte tag) { 100 return mParams.containsKey(tag); 101 } 102 add(byte tag, byte val)103 public void add(byte tag, byte val) { 104 byte[] bval = ByteBuffer.allocate(1).put(val).array(); 105 mParams.put(tag, bval); 106 } 107 add(byte tag, short val)108 public void add(byte tag, short val) { 109 byte[] bval = ByteBuffer.allocate(2).putShort(val).array(); 110 mParams.put(tag, bval); 111 } 112 add(byte tag, int val)113 public void add(byte tag, int val) { 114 byte[] bval = ByteBuffer.allocate(4).putInt(val).array(); 115 mParams.put(tag, bval); 116 } 117 add(byte tag, long val)118 public void add(byte tag, long val) { 119 byte[] bval = ByteBuffer.allocate(8).putLong(val).array(); 120 mParams.put(tag, bval); 121 } 122 add(byte tag, String val)123 public void add(byte tag, String val) { 124 byte[] bval = val.getBytes(); 125 mParams.put(tag, bval); 126 } 127 add(byte tag, byte[] bval)128 public void add(byte tag, byte[] bval) { 129 mParams.put(tag, bval); 130 } 131 getByte(byte tag)132 public byte getByte(byte tag) { 133 byte[] bval = mParams.get(tag); 134 135 if (bval == null || bval.length < 1) { 136 return 0; 137 } 138 139 return ByteBuffer.wrap(bval).get(); 140 } 141 getShort(byte tag)142 public short getShort(byte tag) { 143 byte[] bval = mParams.get(tag); 144 145 if (bval == null || bval.length < 2) { 146 return 0; 147 } 148 149 return ByteBuffer.wrap(bval).getShort(); 150 } 151 getInt(byte tag)152 public int getInt(byte tag) { 153 byte[] bval = mParams.get(tag); 154 155 if (bval == null || bval.length < 4) { 156 return 0; 157 } 158 159 return ByteBuffer.wrap(bval).getInt(); 160 } 161 getString(byte tag)162 public String getString(byte tag) { 163 byte[] bval = mParams.get(tag); 164 165 if (bval == null) { 166 return null; 167 } 168 169 return new String(bval); 170 } 171 getByteArray(byte tag)172 public byte[] getByteArray(byte tag) { 173 byte[] bval = mParams.get(tag); 174 175 return bval; 176 } 177 178 @Override toString()179 public String toString() { 180 return mParams.toString(); 181 } 182 } 183