diff options
author | Alex Blasche <alexander.blasche@qt.io> | 2017-01-17 15:17:10 +0100 |
---|---|---|
committer | Alex Blasche <alexander.blasche@qt.io> | 2017-01-24 14:49:13 +0000 |
commit | 6b0595b64ea46554a8a63f026c15ab07ea804285 (patch) | |
tree | 97a469bd455cbe32ee7dfc23a79c05cb9b7e41dd /src/bluetooth/android | |
parent | a8604157818e21d7b70e2853258fc4569db770be (diff) |
Android: Implement QLEService::characteristicChanged() for peripheral mode
Emits the above signal when the remote client successfully updates
a characteristic.
Change-Id: I236b1f92b682028bc10be798192f46bffc981101
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/bluetooth/android')
-rw-r--r-- | src/bluetooth/android/jni_android.cpp | 2 | ||||
-rw-r--r-- | src/bluetooth/android/lowenergynotificationhub.cpp | 22 | ||||
-rw-r--r-- | src/bluetooth/android/lowenergynotificationhub_p.h | 3 |
3 files changed, 27 insertions, 0 deletions
diff --git a/src/bluetooth/android/jni_android.cpp b/src/bluetooth/android/jni_android.cpp index e63854bd..7f08ea85 100644 --- a/src/bluetooth/android/jni_android.cpp +++ b/src/bluetooth/android/jni_android.cpp @@ -232,6 +232,8 @@ static JNINativeMethod methods_leServer[] = { (void *) LowEnergyNotificationHub::lowEnergy_connectionChange}, {"leServerAdvertisementError", "(JI)V", (void *) LowEnergyNotificationHub::lowEnergy_advertisementError}, + {"leServerCharacteristicChanged", "(JLandroid/bluetooth/BluetoothGattCharacteristic;[B)V", + (void *) LowEnergyNotificationHub::lowEnergy_serverCharacteristicChanged}, }; static JNINativeMethod methods_server[] = { diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index d6e0a4f1..b0d8b0a2 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -294,6 +294,28 @@ void LowEnergyNotificationHub::lowEnergy_characteristicChanged( Q_ARG(int, charHandle), Q_ARG(QByteArray, payload)); } +void LowEnergyNotificationHub::lowEnergy_serverCharacteristicChanged( + JNIEnv *env, jobject, jlong qtObject, jobject characteristic, jbyteArray newValue) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + QByteArray payload; + if (newValue) { //empty Java byte array is 0x0 + jsize length = env->GetArrayLength(newValue); + payload.resize(length); + env->GetByteArrayRegion(newValue, 0, length, + reinterpret_cast<signed char*>(payload.data())); + } + + QMetaObject::invokeMethod(hub, "serverCharacteristicChanged", Qt::QueuedConnection, + Q_ARG(QAndroidJniObject, characteristic), + Q_ARG(QByteArray, payload)); +} + void LowEnergyNotificationHub::lowEnergy_serviceError( JNIEnv *, jobject, jlong qtObject, jint attributeHandle, int errorCode) { diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 4efbd6de..b3962190 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -93,6 +93,8 @@ public: jint errorCode); static void lowEnergy_characteristicChanged(JNIEnv *, jobject, jlong qtObject, jint charHandle, jbyteArray data); + static void lowEnergy_serverCharacteristicChanged(JNIEnv *, jobject, jlong qtObject, + jobject characteristic, jbyteArray newValue); static void lowEnergy_serviceError(JNIEnv *, jobject, jlong qtObject, jint attributeHandle, int errorCode); static void lowEnergy_advertisementError(JNIEnv *, jobject, jlong qtObject, @@ -119,6 +121,7 @@ signals: void descriptorWritten(int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode); void characteristicChanged(int charHandle, const QByteArray &data); + void serverCharacteristicChanged(const QAndroidJniObject& characteristic, const QByteArray& newValue); void serviceError(int attributeHandle, QLowEnergyService::ServiceError errorCode); void advertisementError(int status); |