Utils.java revision ede67c26e7b2564ea35db6d9b3027a269c150e13
1/*
2 * Copyright (C) 2012 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
17package com.android.bluetooth;
18
19import android.app.ActivityManager;
20import android.bluetooth.BluetoothAdapter;
21import android.bluetooth.BluetoothDevice;
22import android.os.Binder;
23import android.os.ParcelUuid;
24import android.os.UserHandle;
25import android.util.Log;
26
27import java.io.IOException;
28import java.io.InputStream;
29import java.io.OutputStream;
30import java.nio.ByteBuffer;
31import java.nio.ByteOrder;
32import java.util.UUID;
33
34/**
35 * @hide
36 */
37
38final public class Utils {
39    private static final String TAG = "BluetoothUtils";
40    static final int BD_ADDR_LEN = 6; // bytes
41    static final int BD_UUID_LEN = 16; // bytes
42
43    public static String getAddressStringFromByte(byte[] address) {
44        if (address == null || address.length !=6) {
45            return null;
46        }
47
48        return String.format("%02X:%02X:%02X:%02X:%02X:%02X",
49                address[0], address[1], address[2], address[3], address[4],
50                address[5]);
51    }
52
53    public static byte[] getByteAddress(BluetoothDevice device) {
54        return getBytesFromAddress(device.getAddress());
55    }
56
57    public static byte[] getBytesFromAddress(String address) {
58        int i, j = 0;
59        byte[] output = new byte[BD_ADDR_LEN];
60
61        for (i = 0; i < address.length();i++) {
62            if (address.charAt(i) != ':') {
63                output[j] = (byte) Integer.parseInt(address.substring(i, i+2), 16);
64                j++;
65                i++;
66            }
67        }
68
69        return output;
70    }
71
72    public static int byteArrayToInt(byte[] valueBuf) {
73        return byteArrayToInt(valueBuf, 0);
74    }
75
76    public static short byteArrayToShort(byte[] valueBuf) {
77        ByteBuffer converter = ByteBuffer.wrap(valueBuf);
78        converter.order(ByteOrder.nativeOrder());
79        return converter.getShort();
80    }
81
82    public static int byteArrayToInt(byte[] valueBuf, int offset) {
83        ByteBuffer converter = ByteBuffer.wrap(valueBuf);
84        converter.order(ByteOrder.nativeOrder());
85        return converter.getInt(offset);
86    }
87
88    public static byte[] intToByteArray(int value) {
89        ByteBuffer converter = ByteBuffer.allocate(4);
90        converter.order(ByteOrder.nativeOrder());
91        converter.putInt(value);
92        return converter.array();
93    }
94
95    public static byte[] uuidToByteArray(ParcelUuid pUuid) {
96        int length = BD_UUID_LEN;
97        ByteBuffer converter = ByteBuffer.allocate(length);
98        converter.order(ByteOrder.BIG_ENDIAN);
99        long msb, lsb;
100        UUID uuid = pUuid.getUuid();
101        msb = uuid.getMostSignificantBits();
102        lsb = uuid.getLeastSignificantBits();
103        converter.putLong(msb);
104        converter.putLong(8, lsb);
105        return converter.array();
106    }
107
108    public static byte[] uuidsToByteArray(ParcelUuid[] uuids) {
109        int length = uuids.length * BD_UUID_LEN;
110        ByteBuffer converter = ByteBuffer.allocate(length);
111        converter.order(ByteOrder.BIG_ENDIAN);
112        UUID uuid;
113        long msb, lsb;
114        for (int i = 0; i < uuids.length; i++) {
115            uuid = uuids[i].getUuid();
116            msb = uuid.getMostSignificantBits();
117            lsb = uuid.getLeastSignificantBits();
118            converter.putLong(i * 16, msb);
119            converter.putLong(i * 16 + 8, lsb);
120        }
121        return converter.array();
122    }
123
124    public static ParcelUuid[] byteArrayToUuid(byte[] val) {
125        int numUuids = val.length/BD_UUID_LEN;
126        ParcelUuid[] puuids = new ParcelUuid[numUuids];
127        UUID uuid;
128        int offset = 0;
129
130        ByteBuffer converter = ByteBuffer.wrap(val);
131        converter.order(ByteOrder.BIG_ENDIAN);
132
133        for (int i = 0; i < numUuids; i++) {
134            puuids[i] = new ParcelUuid(new UUID(converter.getLong(offset),
135                    converter.getLong(offset + 8)));
136            offset += 16;
137        }
138        return puuids;
139    }
140
141    public static String debugGetAdapterStateString(int state) {
142        switch (state) {
143            case BluetoothAdapter.STATE_OFF : return "STATE_OFF";
144            case BluetoothAdapter.STATE_ON : return "STATE_ON";
145            case BluetoothAdapter.STATE_TURNING_ON : return "STATE_TURNING_ON";
146            case BluetoothAdapter.STATE_TURNING_OFF : return "STATE_TURNING_OFF";
147            default : return "UNKNOWN";
148        }
149    }
150
151    public static void copyStream(InputStream is, OutputStream os, int bufferSize) throws IOException {
152        if (is != null && os!=null) {
153            byte[] buffer = new byte[bufferSize];
154            int bytesRead=0;
155            while ( (bytesRead = is.read(buffer))>=0) {
156                os.write(buffer,0,bytesRead);
157            }
158        }
159    }
160
161    public static void safeCloseStream(InputStream is) {
162        if (is != null) {
163            try {
164                is.close();
165            } catch (Throwable t) {
166                Log.d(TAG,"Error closing stream",t);
167            }
168        }
169    }
170
171    public static void safeCloseStream(OutputStream os) {
172        if (os != null) {
173            try {
174                os.close();
175            } catch (Throwable t) {
176                Log.d(TAG,"Error closing stream",t);
177            }
178        }
179    }
180
181    public static boolean checkCaller() {
182        boolean ok;
183        // Get the caller's user id then clear the calling identity
184        // which will be restored in the finally clause.
185        int callingUser = UserHandle.getCallingUserId();
186        long ident = Binder.clearCallingIdentity();
187
188        try {
189            // With calling identity cleared the current user is the foreground user.
190            int foregroundUser = ActivityManager.getCurrentUser();
191            ok = (foregroundUser == callingUser);
192        } catch (Exception ex) {
193            Log.e(TAG,"checkIfCallerIsSelfOrForegroundUser: Exception ex=" + ex);
194            ok = false;
195        } finally {
196            Binder.restoreCallingIdentity(ident);
197        }
198        return ok;
199    }
200}
201