diff options
author | Sven Gothel <[email protected]> | 2020-07-26 05:35:58 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2020-07-26 05:35:58 +0200 |
commit | 083df38df99a0f771388867a8c03b856813ce854 (patch) | |
tree | fbe53a1c70151e5d09aa57ce67ea838a85e1db9c | |
parent | 9feddbb1dee50fcb8c90c2a257cbe0498849b567 (diff) |
Have GATT[Service,Characteristic,Descriptor] derived from DBTObject for valid check; Use new JNI getInstance() -> getDBTObject() w/ valid check
-rw-r--r-- | api/direct_bt/DBTAdapter.hpp | 4 | ||||
-rw-r--r-- | api/direct_bt/DBTTypes.hpp | 13 | ||||
-rw-r--r-- | api/direct_bt/GATTCharacteristic.hpp | 4 | ||||
-rw-r--r-- | api/direct_bt/GATTDescriptor.hpp | 4 | ||||
-rw-r--r-- | api/direct_bt/GATTService.hpp | 4 | ||||
-rw-r--r-- | java/jni/direct_bt/DBTAdapter.cxx | 38 | ||||
-rw-r--r-- | java/jni/direct_bt/DBTDevice.cxx | 61 | ||||
-rw-r--r-- | java/jni/direct_bt/DBTGattCharacteristic.cxx | 10 | ||||
-rw-r--r-- | java/jni/direct_bt/DBTGattDescriptor.cxx | 6 | ||||
-rw-r--r-- | java/jni/direct_bt/DBTGattService.cxx | 4 | ||||
-rw-r--r-- | java/jni/direct_bt/helper_dbt.hpp | 31 | ||||
-rw-r--r-- | src/direct_bt/DBTAdapter.cpp | 16 |
12 files changed, 118 insertions, 77 deletions
diff --git a/api/direct_bt/DBTAdapter.hpp b/api/direct_bt/DBTAdapter.hpp index 727f70f1..682c0e0b 100644 --- a/api/direct_bt/DBTAdapter.hpp +++ b/api/direct_bt/DBTAdapter.hpp @@ -247,9 +247,9 @@ namespace direct_bt { /** * Throws an IllegalStateException if isValid() == false */ - inline void checkValid() const { + inline void checkValidAdapter() const { if( !isValid() ) { - throw IllegalStateException("Adapter state invalid: "+toString(), E_FILE_LINE); + throw IllegalStateException("Adapter state invalid: "+aptrHexString(this)+", "+toString(), E_FILE_LINE); } } diff --git a/api/direct_bt/DBTTypes.hpp b/api/direct_bt/DBTTypes.hpp index c5efa3cd..c900e1d0 100644 --- a/api/direct_bt/DBTTypes.hpp +++ b/api/direct_bt/DBTTypes.hpp @@ -46,8 +46,8 @@ namespace direct_bt { class DBTObject : public JavaUplink { protected: - std::mutex lk; std::atomic_bool valid; + std::mutex lk; DBTObject() : valid(true) {} @@ -69,7 +69,16 @@ namespace direct_bt { valid = false; } - bool isValid() const { return valid; } + inline bool isValid() const { return valid.load(); } + + /** + * Throws an IllegalStateException if isValid() == false + */ + inline void checkValid() const { + if( !isValid() ) { + throw IllegalStateException("DBTObject state invalid: "+aptrHexString(this), E_FILE_LINE); + } + } }; /** diff --git a/api/direct_bt/GATTCharacteristic.hpp b/api/direct_bt/GATTCharacteristic.hpp index 67274a32..56d00f3b 100644 --- a/api/direct_bt/GATTCharacteristic.hpp +++ b/api/direct_bt/GATTCharacteristic.hpp @@ -40,6 +40,8 @@ #include "OctetTypes.hpp" #include "ATTPDUTypes.hpp" +#include "DBTTypes.hpp" + #include "GATTDescriptor.hpp" #include "JavaUplink.hpp" @@ -71,7 +73,7 @@ namespace direct_bt { * and the value the Characteristics Property, Characteristics Value Handle _and_ Characteristics UUID. * </p> */ - class GATTCharacteristic : public JavaUplink { + class GATTCharacteristic : public DBTObject { private: /** Characteristics's service weak back-reference */ std::weak_ptr<GATTService> wbr_service; diff --git a/api/direct_bt/GATTDescriptor.hpp b/api/direct_bt/GATTDescriptor.hpp index 97231526..0eaca70e 100644 --- a/api/direct_bt/GATTDescriptor.hpp +++ b/api/direct_bt/GATTDescriptor.hpp @@ -40,7 +40,7 @@ #include "OctetTypes.hpp" #include "ATTPDUTypes.hpp" -#include "JavaUplink.hpp" +#include "DBTTypes.hpp" /** * - - - - - - - - - - - - - - - @@ -59,7 +59,7 @@ namespace direct_bt { /** * BT Core Spec v5.2: Vol 3, Part G GATT: 3.3.3 Characteristic Descriptor */ - class GATTDescriptor : public JavaUplink { + class GATTDescriptor : public DBTObject { private: /** Descriptor's characteristic weak back-reference */ std::weak_ptr<GATTCharacteristic> wbr_characteristic; diff --git a/api/direct_bt/GATTService.hpp b/api/direct_bt/GATTService.hpp index 6f0bc71c..763298bc 100644 --- a/api/direct_bt/GATTService.hpp +++ b/api/direct_bt/GATTService.hpp @@ -40,6 +40,8 @@ #include "OctetTypes.hpp" #include "ATTPDUTypes.hpp" +#include "DBTTypes.hpp" + #include "GATTCharacteristic.hpp" #include "JavaUplink.hpp" @@ -61,7 +63,7 @@ namespace direct_bt { * including its list of Characteristic Declarations, * which also may include its client config if available. */ - class GATTService : public JavaUplink { + class GATTService : public DBTObject { private: /** Service's device weak back-reference */ std::weak_ptr<DBTDevice> wbr_device; diff --git a/java/jni/direct_bt/DBTAdapter.cxx b/java/jni/direct_bt/DBTAdapter.cxx index 26b3fbcb..c05c997a 100644 --- a/java/jni/direct_bt/DBTAdapter.cxx +++ b/java/jni/direct_bt/DBTAdapter.cxx @@ -373,12 +373,12 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_addStatusListener(JNIEnv *env, jobject return false; } } - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); DBTDevice * deviceMatchRef = nullptr; if( nullptr != jdeviceMatch ) { - deviceMatchRef = getInstance<DBTDevice>(env, jdeviceMatch); + deviceMatchRef = getDBTObject<DBTDevice>(env, jdeviceMatch); JavaGlobalObj::check(deviceMatchRef->getJavaObject(), E_FILE_LINE); } @@ -412,7 +412,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_removeStatusListener(JNIEnv *env, jobj } setObjectRef<JNIAdapterStatusListener>(env, statusListener, nullptr, "nativeInstance"); - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); if( ! adapter->removeStatusListener( pre ) ) { @@ -428,7 +428,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_removeStatusListener(JNIEnv *env, jobj jint Java_direct_1bt_tinyb_DBTAdapter_removeAllStatusListener(JNIEnv *env, jobject obj) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); return adapter->removeAllStatusListener(); @@ -440,7 +440,7 @@ jint Java_direct_1bt_tinyb_DBTAdapter_removeAllStatusListener(JNIEnv *env, jobje jboolean Java_direct_1bt_tinyb_DBTAdapter_isDeviceWhitelisted(JNIEnv *env, jobject obj, jstring jaddress) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); std::string saddress = from_jstring_to_string(env, jaddress); @@ -456,7 +456,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_addDeviceToWhitelist__Ljava_lang_Strin jshort min_interval, jshort max_interval, jshort latency, jshort timeout) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); std::string saddress = from_jstring_to_string(env, jaddress); @@ -472,7 +472,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_addDeviceToWhitelist__Ljava_lang_Strin jboolean Java_direct_1bt_tinyb_DBTAdapter_addDeviceToWhitelist__Ljava_lang_String_2II(JNIEnv *env, jobject obj, jstring jaddress, int jaddressType, int jctype) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); std::string saddress = from_jstring_to_string(env, jaddress); @@ -487,7 +487,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_addDeviceToWhitelist__Ljava_lang_Strin } jboolean Java_direct_1bt_tinyb_DBTAdapter_removeDeviceFromWhitelist(JNIEnv *env, jobject obj, jstring jaddress, int jaddressType) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); std::string saddress = from_jstring_to_string(env, jaddress); @@ -502,7 +502,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_removeDeviceFromWhitelist(JNIEnv *env, jstring Java_direct_1bt_tinyb_DBTAdapter_toStringImpl(JNIEnv *env, jobject obj) { try { - DBTAdapter *nativePtr = getInstance<DBTAdapter>(env, obj); + DBTAdapter *nativePtr = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(nativePtr->getJavaObject(), E_FILE_LINE); return from_string_to_jstring(env, nativePtr->toString()); } catch(...) { @@ -526,7 +526,7 @@ void Java_direct_1bt_tinyb_DBTAdapter_deleteImpl(JNIEnv *env, jobject obj, jlong jboolean Java_direct_1bt_tinyb_DBTAdapter_startDiscoveryImpl(JNIEnv *env, jobject obj, jboolean keepAlive) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); return adapter->startDiscovery(keepAlive); } catch(...) { rethrow_and_raise_java_exception(env); @@ -537,7 +537,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_startDiscoveryImpl(JNIEnv *env, jobjec jboolean Java_direct_1bt_tinyb_DBTAdapter_stopDiscoveryImpl(JNIEnv *env, jobject obj) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); adapter->stopDiscovery(); return JNI_TRUE; } catch(...) { @@ -549,7 +549,7 @@ jboolean Java_direct_1bt_tinyb_DBTAdapter_stopDiscoveryImpl(JNIEnv *env, jobject jobject Java_direct_1bt_tinyb_DBTAdapter_getDiscoveredDevicesImpl(JNIEnv *env, jobject obj) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); std::vector<std::shared_ptr<DBTDevice>> array = adapter->getDiscoveredDevices(); return convert_vector_sharedptr_to_jarraylist(env, array); } catch(...) { @@ -561,7 +561,7 @@ jobject Java_direct_1bt_tinyb_DBTAdapter_getDiscoveredDevicesImpl(JNIEnv *env, j jint Java_direct_1bt_tinyb_DBTAdapter_removeDevicesImpl(JNIEnv *env, jobject obj) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); return adapter->removeDiscoveredDevices(); } catch(...) { rethrow_and_raise_java_exception(env); @@ -575,7 +575,7 @@ jint Java_direct_1bt_tinyb_DBTAdapter_removeDevicesImpl(JNIEnv *env, jobject obj void Java_direct_1bt_tinyb_DBTAdapter_setPowered(JNIEnv *env, jobject obj, jboolean value) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); adapter->setPowered(JNI_TRUE == value ? true : false); } catch(...) { @@ -585,7 +585,7 @@ void Java_direct_1bt_tinyb_DBTAdapter_setPowered(JNIEnv *env, jobject obj, jbool jstring Java_direct_1bt_tinyb_DBTAdapter_getAlias(JNIEnv *env, jobject obj) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); return from_string_to_jstring(env, adapter->getLocalName().getName()); } catch(...) { @@ -596,7 +596,7 @@ jstring Java_direct_1bt_tinyb_DBTAdapter_getAlias(JNIEnv *env, jobject obj) { void Java_direct_1bt_tinyb_DBTAdapter_setAlias(JNIEnv *env, jobject obj, jstring jnewalias) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); std::string newalias = from_jstring_to_string(env, jnewalias); adapter->setLocalName(newalias, std::string()); @@ -607,7 +607,7 @@ void Java_direct_1bt_tinyb_DBTAdapter_setAlias(JNIEnv *env, jobject obj, jstring void Java_direct_1bt_tinyb_DBTAdapter_setDiscoverable(JNIEnv *env, jobject obj, jboolean value) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); adapter->setDiscoverable(JNI_TRUE == value ? true : false); } catch(...) { @@ -617,7 +617,7 @@ void Java_direct_1bt_tinyb_DBTAdapter_setDiscoverable(JNIEnv *env, jobject obj, jobject Java_direct_1bt_tinyb_DBTAdapter_connectDevice(JNIEnv *env, jobject obj, jstring jaddress, jstring jaddressType) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); std::string saddress = from_jstring_to_string(env, jaddress); EUI48 address(saddress); @@ -642,7 +642,7 @@ jobject Java_direct_1bt_tinyb_DBTAdapter_connectDevice(JNIEnv *env, jobject obj, void Java_direct_1bt_tinyb_DBTAdapter_setPairable(JNIEnv *env, jobject obj, jboolean value) { try { - DBTAdapter *adapter = getInstance<DBTAdapter>(env, obj); + DBTAdapter *adapter = getDBTObject<DBTAdapter>(env, obj); JavaGlobalObj::check(adapter->getJavaObject(), E_FILE_LINE); adapter->setBondable(JNI_TRUE == value ? true : false); } catch(...) { diff --git a/java/jni/direct_bt/DBTDevice.cxx b/java/jni/direct_bt/DBTDevice.cxx index ae57644a..d28ac0c2 100644 --- a/java/jni/direct_bt/DBTDevice.cxx +++ b/java/jni/direct_bt/DBTDevice.cxx @@ -141,7 +141,7 @@ class JNICharacteristicListener : public GATTCharacteristicListener { void Java_direct_1bt_tinyb_DBTDevice_initImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); } catch(...) { rethrow_and_raise_java_exception(env); @@ -150,7 +150,7 @@ void Java_direct_1bt_tinyb_DBTDevice_initImpl(JNIEnv *env, jobject obj) jstring Java_direct_1bt_tinyb_DBTDevice_getNameImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *nativePtr = getInstance<DBTDevice>(env, obj); + DBTDevice *nativePtr = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(nativePtr->getJavaObject(), E_FILE_LINE); return from_string_to_jstring(env, nativePtr->getName()); } catch(...) { @@ -161,7 +161,7 @@ jstring Java_direct_1bt_tinyb_DBTDevice_getNameImpl(JNIEnv *env, jobject obj) { jstring Java_direct_1bt_tinyb_DBTDevice_toStringImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *nativePtr = getInstance<DBTDevice>(env, obj); + DBTDevice *nativePtr = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(nativePtr->getJavaObject(), E_FILE_LINE); return from_string_to_jstring(env, nativePtr->toString()); } catch(...) { @@ -183,7 +183,7 @@ jboolean Java_direct_1bt_tinyb_DBTDevice_addCharacteristicListener(JNIEnv *env, return false; } } - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); std::shared_ptr<GATTHandler> gatt = device->getGATTHandler(); if( nullptr == gatt ) { @@ -192,7 +192,7 @@ jboolean Java_direct_1bt_tinyb_DBTDevice_addCharacteristicListener(JNIEnv *env, GATTCharacteristic * associatedCharacteristicRef = nullptr; if( nullptr != jAssociatedCharacteristic ) { - associatedCharacteristicRef = getInstance<GATTCharacteristic>(env, jAssociatedCharacteristic); + associatedCharacteristicRef = getDBTObject<GATTCharacteristic>(env, jAssociatedCharacteristic); } std::shared_ptr<GATTCharacteristicListener> l = @@ -221,7 +221,7 @@ jboolean Java_direct_1bt_tinyb_DBTDevice_removeCharacteristicListener(JNIEnv *en } setObjectRef<JNICharacteristicListener>(env, jlistener, nullptr, "nativeInstance"); - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); std::shared_ptr<GATTHandler> gatt = device->getGATTHandler(); if( nullptr == gatt ) { @@ -246,7 +246,7 @@ jint Java_direct_1bt_tinyb_DBTDevice_removeAllAssociatedCharacteristicListener(J if( nullptr == jAssociatedCharacteristic ) { throw IllegalArgumentException("associatedCharacteristic argument is null", E_FILE_LINE); } - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); std::shared_ptr<GATTHandler> gatt = device->getGATTHandler(); if( nullptr == gatt ) { @@ -255,7 +255,7 @@ jint Java_direct_1bt_tinyb_DBTDevice_removeAllAssociatedCharacteristicListener(J return 0; } - GATTCharacteristic * associatedCharacteristicRef = getInstance<GATTCharacteristic>(env, jAssociatedCharacteristic); + GATTCharacteristic * associatedCharacteristicRef = getDBTObject<GATTCharacteristic>(env, jAssociatedCharacteristic); JavaGlobalObj::check(associatedCharacteristicRef->getJavaObject(), E_FILE_LINE); return gatt->removeAllAssociatedCharacteristicListener(associatedCharacteristicRef); @@ -267,7 +267,7 @@ jint Java_direct_1bt_tinyb_DBTDevice_removeAllAssociatedCharacteristicListener(J jint Java_direct_1bt_tinyb_DBTDevice_removeAllCharacteristicListener(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); std::shared_ptr<GATTHandler> gatt = device->getGATTHandler(); if( nullptr == gatt ) { @@ -298,7 +298,7 @@ void Java_direct_1bt_tinyb_DBTDevice_deleteImpl(JNIEnv *env, jobject obj, jlong jboolean Java_direct_1bt_tinyb_DBTDevice_disconnectImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return device->disconnect() ? JNI_TRUE : JNI_FALSE; } catch(...) { @@ -310,7 +310,7 @@ jboolean Java_direct_1bt_tinyb_DBTDevice_disconnectImpl(JNIEnv *env, jobject obj jboolean Java_direct_1bt_tinyb_DBTDevice_removeImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); device->remove(); } catch(...) { @@ -322,7 +322,7 @@ jboolean Java_direct_1bt_tinyb_DBTDevice_removeImpl(JNIEnv *env, jobject obj) jboolean Java_direct_1bt_tinyb_DBTDevice_connectImpl__(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); bool res = device->connectDefault(); return res ? JNI_TRUE : JNI_FALSE; @@ -338,7 +338,7 @@ jboolean Java_direct_1bt_tinyb_DBTDevice_connectImpl__SSSSSS(JNIEnv *env, jobjec jshort latency, jshort timeout) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); bool res; switch( device->addressType ) { @@ -366,7 +366,7 @@ static const std::string _serviceClazzCtorArgs("(JLdirect_bt/tinyb/DBTDevice;ZLj jobject Java_direct_1bt_tinyb_DBTDevice_getServicesImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); std::vector<GATTServiceRef> services = device->getGATTServices(); // implicit GATT connect and discovery if required incl GenericAccess retrieval @@ -387,10 +387,7 @@ jobject Java_direct_1bt_tinyb_DBTDevice_getServicesImpl(JNIEnv *env, jobject obj std::function<jobject(JNIEnv*, jclass, jmethodID, GATTService*)> ctor_service = [](JNIEnv *env, jclass clazz, jmethodID clazz_ctor, GATTService *service)->jobject { // prepare adapter ctor - std::shared_ptr<DBTDevice> device = service->getDevice(); - if( nullptr == device ) { - throw IllegalStateException("Service's DBTDevice destructed: "+service->toString(), E_FILE_LINE); - } + std::shared_ptr<DBTDevice> device = service->getDeviceChecked(); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); jobject jdevice = JavaGlobalObj::GetObject(device->getJavaObject()); const jboolean isPrimary = service->isPrimary; @@ -418,7 +415,7 @@ jobject Java_direct_1bt_tinyb_DBTDevice_getServicesImpl(JNIEnv *env, jobject obj jboolean Java_direct_1bt_tinyb_DBTDevice_pingGATTImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return device->pingGATT() ? JNI_TRUE : JNI_FALSE; @@ -431,7 +428,7 @@ jboolean Java_direct_1bt_tinyb_DBTDevice_pingGATTImpl(JNIEnv *env, jobject obj) jstring Java_direct_1bt_tinyb_DBTDevice_getIcon(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return nullptr; // FIXME } catch(...) { @@ -443,7 +440,7 @@ jstring Java_direct_1bt_tinyb_DBTDevice_getIcon(JNIEnv *env, jobject obj) void Java_direct_1bt_tinyb_DBTDevice_setTrustedImpl(JNIEnv *env, jobject obj, jboolean value) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); (void)value; // FIXME @@ -455,7 +452,7 @@ void Java_direct_1bt_tinyb_DBTDevice_setTrustedImpl(JNIEnv *env, jobject obj, jb void Java_direct_1bt_tinyb_DBTDevice_setBlockedImpl(JNIEnv *env, jobject obj, jboolean value) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); (void)value; // FIXME @@ -467,7 +464,7 @@ void Java_direct_1bt_tinyb_DBTDevice_setBlockedImpl(JNIEnv *env, jobject obj, jb jboolean JNICALL Java_direct_1bt_tinyb_DBTDevice_getLegacyPairing(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return JNI_FALSE; // FIXME } catch(...) { @@ -479,7 +476,7 @@ jboolean JNICALL Java_direct_1bt_tinyb_DBTDevice_getLegacyPairing(JNIEnv *env, j jshort Java_direct_1bt_tinyb_DBTDevice_getRSSI(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return (jshort) device->getRSSI(); } catch(...) { @@ -492,7 +489,7 @@ jshort Java_direct_1bt_tinyb_DBTDevice_getRSSI(JNIEnv *env, jobject obj) jobjectArray Java_direct_1bt_tinyb_DBTDevice_getUUIDs(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return nullptr; // FIXME } catch(...) { @@ -504,7 +501,7 @@ jobjectArray Java_direct_1bt_tinyb_DBTDevice_getUUIDs(JNIEnv *env, jobject obj) jstring Java_direct_1bt_tinyb_DBTDevice_getModalias(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return nullptr; // FIXME } catch(...) { @@ -516,7 +513,7 @@ jstring Java_direct_1bt_tinyb_DBTDevice_getModalias(JNIEnv *env, jobject obj) jobject Java_direct_1bt_tinyb_DBTDevice_getManufacturerData(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); std::shared_ptr<ManufactureSpecificData> mdata = device->getManufactureSpecificData(); @@ -553,7 +550,7 @@ jobject Java_direct_1bt_tinyb_DBTDevice_getManufacturerData(JNIEnv *env, jobject jshort Java_direct_1bt_tinyb_DBTDevice_getTxPower(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); return (jshort) device->getTxPower(); } catch(...) { @@ -613,7 +610,7 @@ static void disableBlockedNotifications(JNIEnv *env, jobject obj, DBTManager &mg void Java_direct_1bt_tinyb_DBTDevice_disableBlockedNotificationsImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); DBTManager & mgmt = device->getAdapter().getManager(); @@ -625,7 +622,7 @@ void Java_direct_1bt_tinyb_DBTDevice_disableBlockedNotificationsImpl(JNIEnv *env void Java_direct_1bt_tinyb_DBTDevice_enableBlockedNotificationsImpl(JNIEnv *env, jobject obj, jobject javaCallback) { try { - DBTDevice *device= getInstance<DBTDevice>(env, obj); + DBTDevice *device= getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); DBTAdapter & adapter = device->getAdapter(); DBTManager & mgmt = adapter.getManager(); @@ -700,7 +697,7 @@ static void disablePairedNotifications(JNIEnv *env, jobject obj, DBTManager &mgm void Java_direct_1bt_tinyb_DBTDevice_disablePairedNotificationsImpl(JNIEnv *env, jobject obj) { try { - DBTDevice *device = getInstance<DBTDevice>(env, obj); + DBTDevice *device = getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); DBTManager & mgmt = device->getAdapter().getManager(); @@ -712,7 +709,7 @@ void Java_direct_1bt_tinyb_DBTDevice_disablePairedNotificationsImpl(JNIEnv *env, void Java_direct_1bt_tinyb_DBTDevice_enablePairedNotificationsImpl(JNIEnv *env, jobject obj, jobject javaCallback) { try { - DBTDevice *device= getInstance<DBTDevice>(env, obj); + DBTDevice *device= getDBTObject<DBTDevice>(env, obj); JavaGlobalObj::check(device->getJavaObject(), E_FILE_LINE); DBTAdapter & adapter = device->getAdapter(); DBTManager & mgmt = adapter.getManager(); diff --git a/java/jni/direct_bt/DBTGattCharacteristic.cxx b/java/jni/direct_bt/DBTGattCharacteristic.cxx index 84483d6a..6260818a 100644 --- a/java/jni/direct_bt/DBTGattCharacteristic.cxx +++ b/java/jni/direct_bt/DBTGattCharacteristic.cxx @@ -39,7 +39,7 @@ using namespace direct_bt; jstring Java_direct_1bt_tinyb_DBTGattCharacteristic_toStringImpl(JNIEnv *env, jobject obj) { try { - GATTCharacteristic *nativePtr = getInstance<GATTCharacteristic>(env, obj); + GATTCharacteristic *nativePtr = getDBTObject<GATTCharacteristic>(env, obj); JavaGlobalObj::check(nativePtr->getJavaObject(), E_FILE_LINE); return from_string_to_jstring(env, nativePtr->toString()); } catch(...) { @@ -63,7 +63,7 @@ static const std::string _descriptorClazzCtorArgs("(JLdirect_bt/tinyb/DBTGattCha jobject Java_direct_1bt_tinyb_DBTGattCharacteristic_getDescriptorsImpl(JNIEnv *env, jobject obj) { try { - GATTCharacteristic *characteristic = getInstance<GATTCharacteristic>(env, obj); + GATTCharacteristic *characteristic = getDBTObject<GATTCharacteristic>(env, obj); JavaGlobalObj::check(characteristic->getJavaObject(), E_FILE_LINE); std::vector<GATTDescriptorRef> & descriptorList = characteristic->descriptorList; @@ -112,7 +112,7 @@ jobject Java_direct_1bt_tinyb_DBTGattCharacteristic_getDescriptorsImpl(JNIEnv *e jbyteArray Java_direct_1bt_tinyb_DBTGattCharacteristic_readValueImpl(JNIEnv *env, jobject obj) { try { - GATTCharacteristic *characteristic = getInstance<GATTCharacteristic>(env, obj); + GATTCharacteristic *characteristic = getDBTObject<GATTCharacteristic>(env, obj); JavaGlobalObj::check(characteristic->getJavaObject(), E_FILE_LINE); POctets res(GATTHandler::number(GATTHandler::Defaults::MAX_ATT_MTU), 0); @@ -142,7 +142,7 @@ jboolean Java_direct_1bt_tinyb_DBTGattCharacteristic_writeValueImpl(JNIEnv *env, if( 0 == value_size ) { return JNI_TRUE; } - GATTCharacteristic *characteristic = getInstance<GATTCharacteristic>(env, obj); + GATTCharacteristic *characteristic = getDBTObject<GATTCharacteristic>(env, obj); JavaGlobalObj::check(characteristic->getJavaObject(), E_FILE_LINE); JNICriticalArray<uint8_t, jbyteArray> criticalArray(env); // RAII - release @@ -165,7 +165,7 @@ jboolean Java_direct_1bt_tinyb_DBTGattCharacteristic_writeValueImpl(JNIEnv *env, jboolean Java_direct_1bt_tinyb_DBTGattCharacteristic_configNotificationIndicationImpl(JNIEnv *env, jobject obj, jboolean enableNotification, jboolean enableIndication, jbooleanArray jEnabledState) { try { - GATTCharacteristic *characteristic = getInstanceUnchecked<GATTCharacteristic>(env, obj); + GATTCharacteristic *characteristic = getDBTObjectUnchecked<GATTCharacteristic>(env, obj); if( nullptr == characteristic ) { if( !enableNotification && !enableIndication ) { // OK to have native characteristic being shutdown @ disable diff --git a/java/jni/direct_bt/DBTGattDescriptor.cxx b/java/jni/direct_bt/DBTGattDescriptor.cxx index 066e9f5f..d1462825 100644 --- a/java/jni/direct_bt/DBTGattDescriptor.cxx +++ b/java/jni/direct_bt/DBTGattDescriptor.cxx @@ -39,7 +39,7 @@ using namespace direct_bt; void Java_direct_1bt_tinyb_DBTGattDescriptor_deleteImpl(JNIEnv *env, jobject obj) { try { - GATTDescriptor *descriptor = getInstance<GATTDescriptor>(env, obj); + GATTDescriptor *descriptor = getDBTObject<GATTDescriptor>(env, obj); (void)descriptor; // No delete: Service instance owned by GATTService -> DBTDevice } catch(...) { @@ -61,7 +61,7 @@ jstring Java_direct_1bt_tinyb_DBTGattDescriptor_toStringImpl(JNIEnv *env, jobjec jbyteArray Java_direct_1bt_tinyb_DBTGattDescriptor_readValueImpl(JNIEnv *env, jobject obj) { try { - GATTDescriptor *descriptor = getInstance<GATTDescriptor>(env, obj); + GATTDescriptor *descriptor = getDBTObject<GATTDescriptor>(env, obj); JavaGlobalObj::check(descriptor->getJavaObject(), E_FILE_LINE); if( !descriptor->readValue() ) { @@ -89,7 +89,7 @@ jboolean Java_direct_1bt_tinyb_DBTGattDescriptor_writeValueImpl(JNIEnv *env, job if( 0 == value_size ) { return JNI_TRUE; } - GATTDescriptor *descriptor = getInstance<GATTDescriptor>(env, obj); + GATTDescriptor *descriptor = getDBTObject<GATTDescriptor>(env, obj); JavaGlobalObj::check(descriptor->getJavaObject(), E_FILE_LINE); JNICriticalArray<uint8_t, jbyteArray> criticalArray(env); // RAII - release diff --git a/java/jni/direct_bt/DBTGattService.cxx b/java/jni/direct_bt/DBTGattService.cxx index 7023d755..ef25f486 100644 --- a/java/jni/direct_bt/DBTGattService.cxx +++ b/java/jni/direct_bt/DBTGattService.cxx @@ -39,7 +39,7 @@ using namespace direct_bt; jstring Java_direct_1bt_tinyb_DBTGattService_toStringImpl(JNIEnv *env, jobject obj) { try { - GATTService *nativePtr = getInstance<GATTService>(env, obj); + GATTService *nativePtr = getDBTObject<GATTService>(env, obj); JavaGlobalObj::check(nativePtr->getJavaObject(), E_FILE_LINE); return from_string_to_jstring(env, nativePtr->toString()); } catch(...) { @@ -64,7 +64,7 @@ static const std::string _characteristicClazzCtorArgs("(JLdirect_bt/tinyb/DBTGat jobject Java_direct_1bt_tinyb_DBTGattService_getCharacteristicsImpl(JNIEnv *env, jobject obj) { try { - GATTService *service = getInstance<GATTService>(env, obj); + GATTService *service = getDBTObject<GATTService>(env, obj); JavaGlobalObj::check(service->getJavaObject(), E_FILE_LINE); std::vector<std::shared_ptr<GATTCharacteristic>> & characteristics = service->characteristicList; diff --git a/java/jni/direct_bt/helper_dbt.hpp b/java/jni/direct_bt/helper_dbt.hpp index abd78b50..f644d58c 100644 --- a/java/jni/direct_bt/helper_dbt.hpp +++ b/java/jni/direct_bt/helper_dbt.hpp @@ -149,6 +149,37 @@ namespace direct_bt { BDAddressType fromJavaAdressTypeToBDAddressType(JNIEnv *env, jstring jAddressType); jstring fromBDAddressTypeToJavaAddressType(JNIEnv *env, BDAddressType bdAddressType); + template <typename T> + T *getDBTObject(JNIEnv *env, jobject obj) + { + jlong instance = env->GetLongField(obj, getInstanceField(env, obj)); + T *t = reinterpret_cast<T *>(instance); + if (t == nullptr) { + throw std::runtime_error("Trying to acquire null DBTObject"); + } + t->checkValid(); + return t; + } + + template <typename T> + T *getDBTObjectUnchecked(JNIEnv *env, jobject obj) + { + jlong instance = env->GetLongField(obj, getInstanceField(env, obj)); + return reinterpret_cast<T *>(instance); + } + + template <typename T> + void setDBTObject(JNIEnv *env, jobject obj, T *t) + { + if (t == nullptr) { + throw std::runtime_error("Trying to create null DBTObject"); + } + jlong instance = reinterpret_cast<jlong>(t); + env->SetLongField(obj, getInstanceField(env, obj), instance); + } + + + } // namespace direct_bt #endif /* HELPER_DBT_HPP_ */ diff --git a/src/direct_bt/DBTAdapter.cpp b/src/direct_bt/DBTAdapter.cpp index 8e2b858e..ef64e2dc 100644 --- a/src/direct_bt/DBTAdapter.cpp +++ b/src/direct_bt/DBTAdapter.cpp @@ -32,7 +32,7 @@ #include <algorithm> -// #define VERBOSE_ON 1 +#define VERBOSE_ON 1 #include <dbt_debug.hpp> #include "BasicAlgos.hpp" @@ -262,7 +262,7 @@ bool DBTAdapter::isDeviceWhitelisted(const EUI48 &address) { bool DBTAdapter::addDeviceToWhitelist(const EUI48 &address, const BDAddressType address_type, const HCIWhitelistConnectType ctype, const uint16_t conn_interval_min, const uint16_t conn_interval_max, const uint16_t conn_latency, const uint16_t timeout) { - checkValid(); + checkValidAdapter(); if( mgmt.isDeviceWhitelisted(dev_id, address) ) { ERR_PRINT("DBTAdapter::addDeviceToWhitelist: device already listed: dev_id %d, address %s", dev_id, address.toString().c_str()); return true; @@ -276,12 +276,12 @@ bool DBTAdapter::addDeviceToWhitelist(const EUI48 &address, const BDAddressType } bool DBTAdapter::removeDeviceFromWhitelist(const EUI48 &address, const BDAddressType address_type) { - checkValid(); + checkValidAdapter(); return mgmt.removeDeviceFromWhitelist(dev_id, address, address_type); } bool DBTAdapter::addStatusListener(std::shared_ptr<AdapterStatusListener> l) { - checkValid(); + checkValidAdapter(); if( nullptr == l ) { throw IllegalArgumentException("DBTAdapterStatusListener ref is null", E_FILE_LINE); } @@ -298,7 +298,7 @@ bool DBTAdapter::addStatusListener(std::shared_ptr<AdapterStatusListener> l) { } bool DBTAdapter::removeStatusListener(std::shared_ptr<AdapterStatusListener> l) { - checkValid(); + checkValidAdapter(); if( nullptr == l ) { throw IllegalArgumentException("DBTAdapterStatusListener ref is null", E_FILE_LINE); } @@ -315,7 +315,7 @@ bool DBTAdapter::removeStatusListener(std::shared_ptr<AdapterStatusListener> l) } bool DBTAdapter::removeStatusListener(const AdapterStatusListener * l) { - checkValid(); + checkValidAdapter(); if( nullptr == l ) { throw IllegalArgumentException("DBTAdapterStatusListener ref is null", E_FILE_LINE); } @@ -332,7 +332,7 @@ bool DBTAdapter::removeStatusListener(const AdapterStatusListener * l) { } int DBTAdapter::removeAllStatusListener() { - checkValid(); + checkValidAdapter(); const std::lock_guard<std::recursive_mutex> lock(mtx_statusListenerList); // RAII-style acquire and relinquish via destructor int count = statusListenerList.size(); statusListenerList.clear(); @@ -342,7 +342,7 @@ int DBTAdapter::removeAllStatusListener() { bool DBTAdapter::startDiscovery(const bool keepAlive, const HCILEOwnAddressType own_mac_type, const uint16_t le_scan_interval, const uint16_t le_scan_window) { - checkValid(); + checkValidAdapter(); const std::lock_guard<std::recursive_mutex> lock(mtx_discovery); // RAII-style acquire and relinquish via destructor if( ScanType::SCAN_TYPE_NONE != currentScanType ) { removeDiscoveredDevices(); |