103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta/*
203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Copyright (C) 2013 The Android Open Source Project
303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License");
503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * you may not use this file except in compliance with the License.
603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * You may obtain a copy of the License at
703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *      http://www.apache.org/licenses/LICENSE-2.0
903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta *
1003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software
1103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS,
1203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * See the License for the specific language governing permissions and
1403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta * limitations under the License.
1503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta */
1603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battapackage com.android.bluetooth.gatt;
1703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
1803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaimport android.util.Log;
1903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaimport java.util.ArrayList;
2003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaimport java.util.HashMap;
2103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaimport java.util.Iterator;
2203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaimport java.util.List;
2303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaimport java.util.Map;
2403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaimport java.util.UUID;
2503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
2603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battaclass HandleMap {
2703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    private static final boolean DBG = GattServiceConfig.DBG;
2803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    private static final String TAG = GattServiceConfig.TAG_PREFIX + "HandleMap";
2903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
3003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    public static final int TYPE_UNDEFINED = 0;
3103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    public static final int TYPE_SERVICE = 1;
3203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    public static final int TYPE_CHARACTERISTIC = 2;
3303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    public static final int TYPE_DESCRIPTOR = 3;
3403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
3503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    class Entry {
3603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        int serverIf = 0;
3703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        int type = TYPE_UNDEFINED;
3803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        int handle = 0;
3903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        UUID uuid = null;
4003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        int instance = 0;
4103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        int serviceType = 0;
4203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        int serviceHandle = 0;
4303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        int charHandle = 0;
4403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        boolean started = false;
45a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang        boolean advertisePreferred = false;
4603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
4703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        Entry(int serverIf, int handle, UUID uuid, int serviceType, int instance) {
4803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.serverIf = serverIf;
4903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.type = TYPE_SERVICE;
5003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.handle = handle;
5103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.uuid = uuid;
5203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.instance = instance;
5303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.serviceType = serviceType;
5403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
5503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
56a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang        Entry(int serverIf, int handle, UUID uuid, int serviceType, int instance,
57a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            boolean advertisePreferred) {
58a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            this.serverIf = serverIf;
59a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            this.type = TYPE_SERVICE;
60a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            this.handle = handle;
61a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            this.uuid = uuid;
62a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            this.instance = instance;
63a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            this.serviceType = serviceType;
64a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang            this.advertisePreferred = advertisePreferred;
65a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang        }
66a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang
6703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        Entry(int serverIf, int type, int handle, UUID uuid, int serviceHandle) {
6803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.serverIf = serverIf;
6903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.type = type;
7003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.handle = handle;
7103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.uuid = uuid;
7203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.instance = instance;
7303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.serviceHandle = serviceHandle;
7403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
7503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
7603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        Entry(int serverIf, int type, int handle, UUID uuid, int serviceHandle, int charHandle) {
7703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.serverIf = serverIf;
7803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.type = type;
7903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.handle = handle;
8003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.uuid = uuid;
8103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.instance = instance;
8203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.serviceHandle = serviceHandle;
8303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            this.charHandle = charHandle;
8403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
8503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
8603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
8703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    List<Entry> mEntries = null;
8803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    Map<Integer, Integer> mRequestMap = null;
8903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int mLastCharacteristic = 0;
9003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    HandleMap() {
9203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mEntries = new ArrayList<Entry>();
9303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mRequestMap = new HashMap<Integer, Integer>();
9403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
9503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
9603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    void clear() {
9703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mEntries.clear();
9803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mRequestMap.clear();
9903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
10003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
101a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang    void addService(int serverIf, int handle, UUID uuid, int serviceType, int instance,
102a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang        boolean advertisePreferred) {
103a08fff0ae81757bdab00ae8865a906c711d5572fWei Wang        mEntries.add(new Entry(serverIf, handle, uuid, serviceType, instance, advertisePreferred));
10403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
10503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
10603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    void addCharacteristic(int serverIf, int handle, UUID uuid, int serviceHandle) {
10703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mLastCharacteristic = handle;
10803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mEntries.add(new Entry(serverIf, TYPE_CHARACTERISTIC, handle, uuid, serviceHandle));
10903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
11003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    void addDescriptor(int serverIf, int handle, UUID uuid, int serviceHandle) {
11203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mEntries.add(new Entry(serverIf, TYPE_DESCRIPTOR, handle, uuid, serviceHandle, mLastCharacteristic));
11303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
11403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
11503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    void setStarted(int serverIf, int handle, boolean started) {
11603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for(Entry entry : mEntries) {
11703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (entry.type != TYPE_SERVICE ||
11803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.serverIf != serverIf ||
11903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.handle != handle)
12003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                continue;
12103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            entry.started = started;
12303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            return;
12403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
12503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
12603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
12703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    Entry getByHandle(int handle) {
12803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for(Entry entry : mEntries) {
12903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (entry.handle == handle)
13003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                return entry;
13103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
13203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        Log.e(TAG, "getByHandle() - Handle " + handle + " not found!");
13303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return null;
13403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
13503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
13603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int getServiceHandle(UUID uuid, int serviceType, int instance) {
13703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for(Entry entry : mEntries) {
13803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (entry.type == TYPE_SERVICE &&
13903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.serviceType == serviceType &&
14003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.instance == instance &&
14103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.uuid.equals(uuid)) {
14203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                return entry.handle;
14303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            }
14403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
14503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        Log.e(TAG, "getServiceHandle() - UUID " + uuid + " not found!");
14603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return 0;
14703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
14803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
14903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    int getCharacteristicHandle(int serviceHandle, UUID uuid, int instance) {
15003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for(Entry entry : mEntries) {
15103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (entry.type == TYPE_CHARACTERISTIC &&
15203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.serviceHandle == serviceHandle &&
15303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.instance == instance &&
15403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.uuid.equals(uuid)) {
15503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                return entry.handle;
15603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            }
15703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
15803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        Log.e(TAG, "getCharacteristicHandle() - Service " + serviceHandle
15903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                    + ", UUID " + uuid + " not found!");
16003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return 0;
16103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
16203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
16303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    void deleteService(int serverIf, int serviceHandle) {
16403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for(Iterator <Entry> it = mEntries.iterator(); it.hasNext();) {
16503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            Entry entry = it.next();
16603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (entry.serverIf != serverIf) continue;
16703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
16803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            if (entry.handle == serviceHandle ||
16903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                entry.serviceHandle == serviceHandle)
17003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                it.remove();
17103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
17203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
17303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
17403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    List<Entry> getEntries() {
17503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return mEntries;
17603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
17703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
17803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    void addRequest(int requestId, int handle) {
17903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mRequestMap.put(requestId, handle);
18003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
18103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    void deleteRequest(int requestId) {
18303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        mRequestMap.remove(requestId);
18403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
18503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
18603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    Entry getByRequestId(int requestId) {
18703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        Integer handle = mRequestMap.get(requestId);
18803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        if (handle == null) {
18903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            Log.e(TAG, "getByRequestId() - Request ID " + requestId + " not found!");
19003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            return null;
19103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        }
19203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        return getByHandle(handle);
19303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
19403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
19603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    /**
19703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta     * Logs debug information.
19803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta     */
199a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach    void dump(StringBuilder sb) {
200a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach        sb.append("  Entries: " + mEntries.size() + "\n");
201a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach        sb.append("  Requests: " + mRequestMap.size() + "\n");
20203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
20303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta        for (Entry entry : mEntries) {
204a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach            sb.append("  " + entry.serverIf + ": [" + entry.handle + "] ");
20503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            switch(entry.type) {
20603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                case TYPE_SERVICE:
207a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach                    sb.append("Service " + entry.uuid);
208a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach                    sb.append(", started " + entry.started);
20903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                    break;
21003b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21103b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                case TYPE_CHARACTERISTIC:
212a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach                    sb.append("  Characteristic " + entry.uuid);
21303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                    break;
21403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
21503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                case TYPE_DESCRIPTOR:
216a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach                    sb.append("    Descriptor " + entry.uuid);
21703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta                    break;
21803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta            }
21903b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
220a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach            sb.append("\n");
221a02de6484f9b6cac6b8c811edae11be55746b555Andre Eisenbach        }
22203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    }
22303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
224