aboutsummaryrefslogtreecommitdiffstats
path: root/java/direct_bt/tinyb/DBTAdapter.java
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2021-01-25 12:46:06 +0100
committerSven Gothel <[email protected]>2021-01-25 12:46:06 +0100
commit5e66be0a1c0509b0648a22a35f3cee3d38d6798c (patch)
tree2fd794a8132c030ccdc28aa9d83af9af88730fcc /java/direct_bt/tinyb/DBTAdapter.java
parentf52391f0b280c2a8b7ab5b1a4baab4991e0ddf89 (diff)
Bump GetGitRevisionDescription.cmake to 6a748896188fdf3f885820ccd686393ea5215dbf (from cmake-modules)
Diffstat (limited to 'java/direct_bt/tinyb/DBTAdapter.java')
-rw-r--r--java/direct_bt/tinyb/DBTAdapter.java729
1 files changed, 0 insertions, 729 deletions
diff --git a/java/direct_bt/tinyb/DBTAdapter.java b/java/direct_bt/tinyb/DBTAdapter.java
deleted file mode 100644
index 4a12cd27..00000000
--- a/java/direct_bt/tinyb/DBTAdapter.java
+++ /dev/null
@@ -1,729 +0,0 @@
-/**
- * Author: Sven Gothel <[email protected]>
- * Copyright (c) 2020 Gothel Software e.K.
- * Copyright (c) 2020 ZAFENA AB
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-package direct_bt.tinyb;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.tinyb.AdapterSettings;
-import org.tinyb.BluetoothAdapter;
-import org.tinyb.BluetoothDevice;
-import org.tinyb.BluetoothException;
-import org.tinyb.BluetoothGattCharacteristic;
-import org.tinyb.BluetoothGattDescriptor;
-import org.tinyb.BluetoothGattService;
-import org.tinyb.BluetoothManager;
-import org.tinyb.BluetoothNotification;
-import org.tinyb.BluetoothObject;
-import org.tinyb.BluetoothType;
-import org.tinyb.EIRDataTypeSet;
-import org.tinyb.EUI48;
-import org.tinyb.HCIStatusCode;
-import org.tinyb.HCIWhitelistConnectType;
-import org.tinyb.PairingMode;
-import org.tinyb.SMPPairingState;
-import org.tinyb.ScanType;
-import org.tinyb.AdapterStatusListener;
-import org.tinyb.BDAddressAndType;
-import org.tinyb.BDAddressType;
-import org.tinyb.TransportType;
-
-public class DBTAdapter extends DBTObject implements BluetoothAdapter
-{
- private static final boolean DEBUG = DBTManager.DEBUG;
-
- private static AtomicInteger globThreadID = new AtomicInteger(0);
- private static int discoverTimeoutMS = 100;
-
- private final int dev_id;
- private final EUI48 address;
- private final String name;
-
- private final Object discoveryLock = new Object();
- private final Object discoveredDevicesLock = new Object();
- private final Object userCallbackLock = new Object();
-
- private final AtomicBoolean isClosing = new AtomicBoolean(false);
-
- private final AtomicBoolean powered_state = new AtomicBoolean(false); // AdapterSettings
- private BluetoothNotification<Boolean> userPairableNotificationCB = null;
- private final AtomicBoolean isDiscoverable = new AtomicBoolean(false); // AdapterSettings
- private BluetoothNotification<Boolean> userDiscoverableNotificationCB = null;
- private final AtomicBoolean isPairable = new AtomicBoolean(false); // AdapterSettings
- private BluetoothNotification<Boolean> userPoweredNotificationCB = null;
-
- private final AtomicReference<ScanType> currentMetaScanType = new AtomicReference<ScanType>(ScanType.NONE); // AdapterStatusListener and powerdOff
- private BluetoothNotification<Boolean> userDiscoveringNotificationCB = null;
-
- private final List<BluetoothDevice> discoveredDevices = new ArrayList<BluetoothDevice>();
-
- /* pp */ DBTAdapter(final long nativeInstance, final byte byteAddress[/*6*/], final String name, final int dev_id)
- {
- super( nativeInstance, compHash( dev_id, java.util.Arrays.hashCode(byteAddress) ) );
- this.dev_id = dev_id;
- this.address = new EUI48(byteAddress);
- this.name = name;
- addStatusListener(this.statusListener, null);
- }
-
- @Override
- public final BluetoothManager getManager() { return DBTManager.getManager(); }
-
- @Override
- public void close() {
- final DBTManager mngr = (DBTManager)DBTManager.getManager();
- if( !isValid() ) {
- return;
- }
- if( !isClosing.compareAndSet(false, true) ) {
- return;
- }
- // mute all listener first
- removeAllStatusListener();
- disableDiscoverableNotifications();
- disableDiscoveringNotifications();
- disablePairableNotifications();
- disablePoweredNotifications();
-
- stopDiscovery();
-
- final List<BluetoothDevice> devices = getDiscoveredDevices();
- for(final Iterator<BluetoothDevice> id = devices.iterator(); id.hasNext(); ) {
- final DBTDevice d = (DBTDevice) id.next();
- d.close();
- }
-
- // done in native dtor: removeDevicesImpl();
-
- poweredOff();
-
- mngr.removeAdapter(this); // remove this instance from manager
-
- super.close();
- }
-
- private final void poweredOff() {
- powered_state.set(false);
- currentMetaScanType.set(ScanType.NONE);
- }
-
- @Override
- public boolean equals(final Object obj)
- {
- if(this == obj) {
- return true;
- }
- if (obj == null || !(obj instanceof DBTAdapter)) {
- return false;
- }
- final DBTAdapter other = (DBTAdapter)obj;
- return dev_id == other.dev_id && address.equals(other.address);
- }
-
- @Override
- public EUI48 getAddress() { return address; }
-
- @Override
- public String getAddressString() { return address.toString(); }
-
- @Override
- public String getName() { return name; }
-
- @Override
- public int getDevID() { return dev_id; }
-
- @Override
- public BluetoothType getBluetoothType() { return class_type(); }
-
- static BluetoothType class_type() { return BluetoothType.ADAPTER; }
-
- @Override
- public BluetoothDevice find(final String name, final BDAddressAndType addressAndType, final long timeoutMS) {
- return findDeviceInCache(name, addressAndType);
- }
-
- @Override
- public BluetoothDevice find(final String name, final BDAddressAndType addressAndType) {
- return find(name, addressAndType, 0);
- }
-
- @Override
- public final boolean isDeviceWhitelisted(final BDAddressAndType addressAndType) { return isDeviceWhitelistedImpl(addressAndType.address.b, addressAndType.type.value); }
- private final native boolean isDeviceWhitelistedImpl(final byte[] address, byte address_type);
-
- @Override
- public boolean addDeviceToWhitelist(final BDAddressAndType addressAndType,
- final HCIWhitelistConnectType ctype,
- final short conn_interval_min, final short conn_interval_max,
- final short conn_latency, final short timeout) {
- return addDeviceToWhitelistImpl1(addressAndType.address.b, addressAndType.type.value, ctype.value,
- conn_interval_min, conn_interval_max, conn_latency, timeout);
- }
- private native boolean addDeviceToWhitelistImpl1(final byte[] address, final byte address_type, final int ctype,
- final short conn_interval_min, final short conn_interval_max,
- final short conn_latency, final short timeout);
-
- @Override
- public boolean addDeviceToWhitelist(final BDAddressAndType addressAndType,
- final HCIWhitelistConnectType ctype) {
- return addDeviceToWhitelistImpl2(addressAndType.address.b, addressAndType.type.value, ctype.value);
- }
- private native boolean addDeviceToWhitelistImpl2(final byte[] address, final byte address_type, final int ctype);
-
- @Override
- public boolean removeDeviceFromWhitelist(final BDAddressAndType addressAndType) {
- return removeDeviceFromWhitelistImpl(addressAndType.address.b, addressAndType.type.value);
- }
- private native boolean removeDeviceFromWhitelistImpl(final byte[] address, final byte address_type);
-
- /* Unsupported */
-
- @Override
- public long getBluetoothClass() { throw new UnsupportedOperationException(); } // FIXME
-
- @Override
- public final BluetoothAdapter clone() { throw new UnsupportedOperationException(); } // FIXME
-
- @Override
- public String getInterfaceName() { throw new UnsupportedOperationException(); } // FIXME
-
- @Override
- public long getDiscoverableTimeout() { throw new UnsupportedOperationException(); } // FIXME
-
- @Override
- public boolean setDiscoverableTimout(final long value) { return false; } // FIXME
-
- @Override
- public long getPairableTimeout() { throw new UnsupportedOperationException(); } // FIXME
-
- @Override
- public boolean setPairableTimeout(final long value) { return false; } // FIXME
-
- @Override
- public String getModalias() { throw new UnsupportedOperationException(); } // FIXME
-
- @Override
- public String[] getUUIDs() { throw new UnsupportedOperationException(); } // FIXME
-
-
- /* Java callbacks */
-
- @Override
- public void enablePoweredNotifications(final BluetoothNotification<Boolean> callback) {
- synchronized(userCallbackLock) {
- userPoweredNotificationCB = callback;
- }
- }
-
- @Override
- public void disablePoweredNotifications() {
- synchronized(userCallbackLock) {
- userPoweredNotificationCB = null;
- }
- }
-
- @Override
- public boolean getDiscoverable() { return isDiscoverable.get(); }
-
- @Override
- public void enableDiscoverableNotifications(final BluetoothNotification<Boolean> callback) {
- synchronized(userCallbackLock) {
- userDiscoverableNotificationCB = callback;
- }
- }
-
- @Override
- public void disableDiscoverableNotifications() {
- synchronized(userCallbackLock) {
- userDiscoverableNotificationCB = null;
- }
- }
-
- @Override
- public final ScanType getCurrentScanType() {
- return currentMetaScanType.get();
- }
-
- @Override
- public final boolean getDiscovering() {
- return ScanType.NONE != currentMetaScanType.get();
- }
-
- @Override
- public final void enableDiscoveringNotifications(final BluetoothNotification<Boolean> callback) {
- synchronized(userCallbackLock) {
- userDiscoveringNotificationCB = callback;
- }
- }
-
- @Override
- public final void disableDiscoveringNotifications() {
- synchronized(userCallbackLock) {
- userDiscoveringNotificationCB = null;
- }
- }
-
- @Override
- public final boolean getPairable() { return isPairable.get(); }
-
- @Override
- public void enablePairableNotifications(final BluetoothNotification<Boolean> callback) {
- synchronized(userCallbackLock) {
- userPairableNotificationCB = callback;
- }
- }
-
- @Override
- public void disablePairableNotifications() {
- synchronized(userCallbackLock) {
- userPairableNotificationCB = null;
- }
- }
-
- @Override
- public String toString() {
- if( !isValid() ) {
- return "Adapter" + "\u271D" + "["+address+", '"+name+"', id "+dev_id+"]";
- }
- return toStringImpl();
- }
-
- /* Native callbacks */
-
- /* Native functionality / properties */
-
- private native String toStringImpl();
-
- @Override
- public native boolean setPowered(boolean value);
-
- @Override
- public final HCIStatusCode reset() {
- return HCIStatusCode.get( resetImpl() );
- }
- private native byte resetImpl();
-
- @Override
- public native String getAlias();
-
- @Override
- public native void setAlias(final String value);
-
- @Override
- public native boolean setDiscoverable(boolean value);
-
- @Override
- public final BluetoothDevice connectDevice(final BDAddressAndType addressAndType) {
- return connectDeviceImpl(addressAndType.address.b, addressAndType.type.value);
- }
- private native BluetoothDevice connectDeviceImpl(byte[] address, byte addressType);
-
- @Override
- public native boolean setPairable(boolean value);
-
- @Override
- public boolean getPoweredState() { return powered_state.get(); }
-
- @Override
- public final boolean isPowered() { return isValid() && isPoweredImpl(); }
- public native boolean isPoweredImpl();
-
- @Override
- public final boolean isSuspended() { return isValid() && isSuspendedImpl(); }
- public native boolean isSuspendedImpl();
-
- @Override
- public final boolean isValid() { return super.isValid() && isValidImpl(); }
- public native boolean isValidImpl();
-
- /* internal */
-
- @Override
- protected native void deleteImpl(long nativeInstance);
-
- /* discovery */
-
- @Override
- public boolean startDiscovery() throws BluetoothException {
- return HCIStatusCode.SUCCESS == startDiscovery(true);
- }
-
- @Override
- public HCIStatusCode startDiscovery(final boolean keepAlive) throws BluetoothException {
- synchronized( discoveryLock ) {
- // Ignoring 'isDiscovering', as native implementation also handles change of 'keepAlive'.
- // The discoveredDevices shall always get cleared.
- removeDiscoveredDevices();
- return HCIStatusCode.get( startDiscoveryImpl(keepAlive) ); // event callbacks will be generated by implementation
- }
- }
- private native byte startDiscoveryImpl(boolean keepAlive) throws BluetoothException;
-
- @Override
- public HCIStatusCode stopDiscovery() throws BluetoothException {
- synchronized( discoveryLock ) {
- // Ignoring 'isDiscovering', be consistent with startDiscovery
- return HCIStatusCode.get( stopDiscoveryImpl() ); // event callbacks will be generated by implementation
- }
- }
- private native byte stopDiscoveryImpl() throws BluetoothException;
-
- @Override
- public List<BluetoothDevice> getDiscoveredDevices() {
- synchronized(discoveredDevicesLock) {
- return new ArrayList<BluetoothDevice>(discoveredDevices);
- }
- }
- // std::vector<std::shared_ptr<direct_bt::HCIDevice>> discoveredDevices = adapter.getDiscoveredDevices();
- private native List<BluetoothDevice> getDiscoveredDevicesImpl();
-
- @Override
- public int removeDiscoveredDevices() throws BluetoothException {
- final int cj = removeDiscoveredDevicesImpl2j();
- final int cn = removeDiscoveredDevicesImpl1();
- if( cj != cn ) {
- if( DEBUG ) {
- System.err.println("DBTAdapter::removeDevices: Inconsistent discovered device count: Native "+cn+", callback "+cj);
- }
- }
- return cn;
- }
- private native int removeDiscoveredDevicesImpl1() throws BluetoothException;
- private int removeDiscoveredDevicesImpl2j() {
- synchronized(discoveredDevicesLock) {
- final int n = discoveredDevices.size();
- discoveredDevices.clear();
- return n;
- }
- }
- /* pp */ boolean removeDiscoveredDevice(final BluetoothDevice device) {
- synchronized(discoveredDevicesLock) {
- return discoveredDevices.remove(device);
- }
- }
-
- @Override
- public boolean removeDiscoveredDevice(final BDAddressAndType addressAndType) {
- final boolean cj = removeDiscoveredDeviceImpl2j(addressAndType);
- final boolean cn = removeDiscoveredDeviceImpl1(addressAndType.address.b, addressAndType.type.value);
- if( cj != cn ) {
- if( DEBUG ) {
- System.err.println("DBTAdapter::removeDevices("+addressAndType+"): Inconsistent discovered device count: Native "+cn+", callback "+cj);
- }
- }
- return cn;
- }
- private native boolean removeDiscoveredDeviceImpl1(final byte[] address, final byte addressType);
- private boolean removeDiscoveredDeviceImpl2j(final BDAddressAndType addressAndType) {
- synchronized(discoveredDevicesLock) {
- for( final Iterator<BluetoothDevice> iter = discoveredDevices.iterator(); iter.hasNext(); ) {
- final BluetoothDevice device = iter.next();
- if( device.getAddressAndType().equals(addressAndType) ) {
- iter.remove();
- return true;
- }
- }
- return false;
- }
- }
-
- @Override
- public native boolean addStatusListener(final AdapterStatusListener l, final BluetoothDevice deviceMatch);
-
- @Override
- public boolean removeStatusListener(final AdapterStatusListener l) {
- if( !isClosing.get() ) {
- return removeStatusListenerImpl(l);
- }
- return false;
- }
-
- private native boolean removeStatusListenerImpl(final AdapterStatusListener l);
-
- @Override
- public native int removeAllStatusListener();
-
- @Override
- public void setDiscoveryFilter(final List<UUID> uuids, final int rssi, final int pathloss, final TransportType transportType) {
- final List<String> uuidsFmt = new ArrayList<>(uuids.size());
- for (final UUID uuid : uuids) {
- uuidsFmt.add(uuid.toString());
- }
- setDiscoveryFilter(uuidsFmt, rssi, pathloss, transportType.ordinal());
- }
-
- @SuppressWarnings("unchecked")
- public void setRssiDiscoveryFilter(final int rssi) {
- setDiscoveryFilter(Collections.EMPTY_LIST, rssi, 0, TransportType.AUTO);
- }
-
- private native void setDiscoveryFilter(List<String> uuids, int rssi, int pathloss, int transportType);
-
- ////////////////////////////////////
-
- private final AdapterStatusListener statusListener = new AdapterStatusListener() {
- @Override
- public void adapterSettingsChanged(final BluetoothAdapter a, final AdapterSettings oldmask, final AdapterSettings newmask,
- final AdapterSettings changedmask, final long timestamp) {
- final boolean initialSetting = oldmask.isEmpty();
- if( DEBUG ) {
- if( initialSetting ) {
- System.err.println("Adapter.StatusListener.SETTINGS: "+oldmask+" -> "+newmask+", initial "+changedmask+" on "+a);
- } else {
- System.err.println("Adapter.StatusListener.SETTINGS: "+oldmask+" -> "+newmask+", changed "+changedmask+" on "+a);
- }
- }
- if( initialSetting ) {
- powered_state.set( newmask.isSet(AdapterSettings.SettingType.POWERED) );
- isDiscoverable.set( newmask.isSet(AdapterSettings.SettingType.DISCOVERABLE) );
- isPairable.set( newmask.isSet(AdapterSettings.SettingType.BONDABLE) );
- return;
- }
- if( changedmask.isSet(AdapterSettings.SettingType.POWERED) ) {
- final boolean _isPowered = newmask.isSet(AdapterSettings.SettingType.POWERED);
- if( powered_state.compareAndSet(!_isPowered, _isPowered) ) {
- if( !_isPowered ) {
- poweredOff();
- }
- synchronized(userCallbackLock) {
- if( null != userPoweredNotificationCB ) {
- userPoweredNotificationCB.run(_isPowered);
- }
- }
- }
- }
- if( changedmask.isSet(AdapterSettings.SettingType.DISCOVERABLE) ) {
- final boolean _isDiscoverable = newmask.isSet(AdapterSettings.SettingType.DISCOVERABLE);
- if( isDiscoverable.compareAndSet(!_isDiscoverable, _isDiscoverable) ) {
- synchronized(userCallbackLock) {
- if( null != userDiscoverableNotificationCB ) {
- userDiscoverableNotificationCB.run( _isDiscoverable );
- }
- }
- }
- }
- if( changedmask.isSet(AdapterSettings.SettingType.BONDABLE) ) {
- final boolean _isPairable = newmask.isSet(AdapterSettings.SettingType.BONDABLE);
- if( isPairable.compareAndSet(!_isPairable, _isPairable) ) {
- synchronized(userCallbackLock) {
- if( null != userPairableNotificationCB ) {
- userPairableNotificationCB.run( _isPairable );
- }
- }
- }
- }
- }
- @Override
- public void discoveringChanged(final BluetoothAdapter adapter, final ScanType currentMeta, final ScanType changedType, final boolean changedEnabled, final boolean keepAlive, final long timestamp) {
- if( DEBUG ) {
- System.err.println("Adapter.StatusListener.DISCOVERING: meta "+currentMeta+", changed["+changedType+", enabled "+changedEnabled+", keepAlive "+keepAlive+"] on "+adapter);
- }
- // meta ignores changes on temp disabled discovery
- final boolean has_le_changed = currentMetaScanType.get().hasScanType(ScanType.LE) != currentMeta.hasScanType(ScanType.LE);
- currentMetaScanType.set(currentMeta);
-
- if( changedType.hasScanType(ScanType.LE) && has_le_changed ) {
- synchronized(userCallbackLock) {
- if( null != userDiscoveringNotificationCB ) {
- userDiscoveringNotificationCB.run(changedEnabled);
- }
- }
- }
- }
- @Override
- public boolean deviceFound(final BluetoothDevice device, final long timestamp) {
- if( DEBUG ) {
- System.err.println("Adapter.FOUND: "+device+" on "+device.getAdapter());
- }
- synchronized(discoveredDevicesLock) {
- discoveredDevices.add(device);
- }
- return false;
- }
-
- @Override
- public void deviceUpdated(final BluetoothDevice device, final EIRDataTypeSet updateMask, final long timestamp) {
- final boolean rssiUpdated = updateMask.isSet( EIRDataTypeSet.DataType.RSSI );
- final boolean mdUpdated = updateMask.isSet( EIRDataTypeSet.DataType.MANUF_DATA );
- if( DEBUG && !rssiUpdated && !mdUpdated) {
- System.err.println("Adapter.UPDATED: "+updateMask+" of "+device+" on "+device.getAdapter());
- }
- // nop on discoveredDevices
- }
-
- @Override
- public void deviceConnected(final BluetoothDevice device, final short handle, final long timestamp) {
- if( DEBUG ) {
- System.err.println("Adapter.CONNECTED: "+device+" on "+device.getAdapter());
- }
- }
-
- @Override
- public void devicePairingState(final BluetoothDevice device, final SMPPairingState state, final PairingMode mode, final long timestamp) {
- if( DEBUG ) {
- System.err.println("Adapter.PAIRING_STATE: state "+state+", mode "+mode+": "+device);
- }
- }
-
- @Override
- public void deviceReady(final BluetoothDevice device, final long timestamp) {
- if( DEBUG ) {
- System.err.println("Adapter.READY: "+device);
- }
- }
-
- @Override
- public void deviceDisconnected(final BluetoothDevice device, final HCIStatusCode reason, final short handle, final long timestamp) {
- if( DEBUG ) {
- System.err.println("Adapter.DISCONNECTED: Reason "+reason+", old handle 0x"+Integer.toHexString(handle)+": "+device+" on "+device.getAdapter());
- }
- }
- };
-
- /**
- * Returns the matching {@link DBTObject} from the internal cache if found,
- * otherwise {@code null}.
- * <p>
- * The returned {@link DBTObject} may be of type
- * <ul>
- * <li>{@link DBTDevice}</li>
- * <li>{@link DBTGattService}</li>
- * <li>{@link DBTGattCharacteristic}</li>
- * <li>{@link DBTGattDescriptor}</li>
- * </ul>
- * or alternatively in {@link BluetoothObject} space
- * <ul>
- * <li>{@link BluetoothType#DEVICE} -> {@link BluetoothDevice}</li>
- * <li>{@link BluetoothType#GATT_SERVICE} -> {@link BluetoothGattService}</li>
- * <li>{@link BluetoothType#GATT_CHARACTERISTIC} -> {@link BluetoothGattCharacteristic}</li>
- * <li>{@link BluetoothType#GATT_DESCRIPTOR} -> {@link BluetoothGattDescriptor}</li>
- * </ul>
- * </p>
- * @param name name of the desired {@link BluetoothType#DEVICE device}.
- * Maybe {@code null}.
- * @param identifier EUI48 address of the desired {@link BluetoothType#DEVICE device}
- * or UUID of the desired {@link BluetoothType#GATT_SERVICE service},
- * {@link BluetoothType#GATT_CHARACTERISTIC characteristic} or {@link BluetoothType#GATT_DESCRIPTOR descriptor} to be found.
- * Maybe {@code null}, in which case the first object of the desired type is being returned - if existing.
- * @param type specify the type of the object to be found, either
- * {@link BluetoothType#DEVICE device},
- * {@link BluetoothType#GATT_SERVICE service}, {@link BluetoothType#GATT_CHARACTERISTIC characteristic}
- * or {@link BluetoothType#GATT_DESCRIPTOR descriptor}.
- * {@link BluetoothType#NONE none} means anything.
- */
- /* pp */ DBTObject findInCache(final String name, final String identifier, final BluetoothType type) {
- final boolean anyType = BluetoothType.NONE == type;
- final boolean deviceType = BluetoothType.DEVICE == type;
- final boolean serviceType = BluetoothType.GATT_SERVICE == type;
- final boolean charType = BluetoothType.GATT_CHARACTERISTIC== type;
- final boolean descType = BluetoothType.GATT_DESCRIPTOR == type;
-
- if( !anyType && !deviceType && !serviceType && !charType && !descType ) {
- return null;
- }
- synchronized(discoveredDevicesLock) {
- if( null == name && null == identifier && ( anyType || deviceType ) ) {
- // special case for 1st valid device
- if( discoveredDevices.size() > 0 ) {
- return (DBTDevice) discoveredDevices.get(0);
- }
- return null; // no device
- }
- for(int devIdx = discoveredDevices.size() - 1; devIdx >= 0; devIdx-- ) {
- final DBTDevice device = (DBTDevice) discoveredDevices.get(devIdx);
- if( ( anyType || deviceType ) ) {
- if( null != name && null != identifier &&
- device.getName().equals(name) &&
- device.getAddressString().equals(identifier)
- )
- {
- return device;
- }
- if( null != identifier &&
- device.getAddressString().equals(identifier)
- )
- {
- return device;
- }
- if( null != name &&
- device.getName().equals(name)
- )
- {
- return device;
- }
- }
- if( anyType || serviceType || charType || descType ) {
- final DBTObject dbtObj = device.findInCache(identifier, type);
- if( null != dbtObj ) {
- return dbtObj;
- }
- }
- }
- return null;
- }
- }
-
- /* pp */ DBTDevice findDeviceInCache(final String name, final BDAddressAndType addressAndType) {
- synchronized(discoveredDevicesLock) {
- if( null == name && null == addressAndType ) {
- // special case for 1st valid device
- if( discoveredDevices.size() > 0 ) {
- return (DBTDevice) discoveredDevices.get(0);
- }
- return null; // no device
- }
- for(int devIdx = discoveredDevices.size() - 1; devIdx >= 0; devIdx-- ) {
- final DBTDevice device = (DBTDevice) discoveredDevices.get(devIdx);
- if( null != name && null != addressAndType &&
- device.getName().equals(name) &&
- device.getAddressAndType().equals(addressAndType)
- )
- {
- return device;
- }
- if( null != addressAndType &&
- device.getAddressAndType().equals(addressAndType)
- )
- {
- return device;
- }
- if( null != name &&
- device.getName().equals(name)
- )
- {
- return device;
- }
- }
- return null;
- }
- }
-}