diff options
Diffstat (limited to 'src/bluetooth/android/lowenergynotificationhub.cpp')
-rw-r--r-- | src/bluetooth/android/lowenergynotificationhub.cpp | 112 |
1 files changed, 91 insertions, 21 deletions
diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 9e95ece6..53f2d6cc 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -1,31 +1,37 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL21$ +** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 or version 3 as published by the Free -** Software Foundation and appearing in the file LICENSE.LGPLv21 and -** LICENSE.LGPLv3 included in the packaging of this file. Please review the -** following information to ensure the GNU Lesser General Public License -** requirements will be met: https://www.gnu.org/licenses/lgpl.html and -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ** -** As a special exception, The Qt Company gives you certain additional -** rights. These rights are described in The Qt Company LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** @@ -47,18 +53,25 @@ QReadWriteLock LowEnergyNotificationHub::lock; Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) -LowEnergyNotificationHub::LowEnergyNotificationHub( - const QBluetoothAddress &remote, QObject *parent) +LowEnergyNotificationHub::LowEnergyNotificationHub(const QBluetoothAddress &remote, + bool isPeripheral, QObject *parent) : QObject(parent), javaToCtoken(0) { QAndroidJniEnvironment env; - const QAndroidJniObject address = + + if (isPeripheral) { + qCDebug(QT_BT_ANDROID) << "Creating Android Peripheral/Server support for BTLE"; + jBluetoothLe = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer", + "(Landroid/content/Context;)V", QtAndroidPrivate::context()); + } else { + qCDebug(QT_BT_ANDROID) << "Creating Android Central/Client support for BTLE"; + const QAndroidJniObject address = QAndroidJniObject::fromString(remote.toString()); - jBluetoothLe = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothLE", - "(Ljava/lang/String;Landroid/app/Activity;)V", + jBluetoothLe = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothLE", + "(Ljava/lang/String;Landroid/content/Context;)V", address.object<jstring>(), - QtAndroidPrivate::activity()); - + QtAndroidPrivate::activity() ? QtAndroidPrivate::activity() : QtAndroidPrivate::service()); + } if (env->ExceptionCheck() || !jBluetoothLe.isValid()) { env->ExceptionDescribe(); @@ -260,6 +273,28 @@ void LowEnergyNotificationHub::lowEnergy_descriptorWritten( (QLowEnergyService::ServiceError)errorCode)); } +void LowEnergyNotificationHub::lowEnergy_serverDescriptorWritten( + JNIEnv *env, jobject, jlong qtObject, jobject descriptor, 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, "serverDescriptorWritten", Qt::QueuedConnection, + Q_ARG(QAndroidJniObject, descriptor), + Q_ARG(QByteArray, payload)); +} + void LowEnergyNotificationHub::lowEnergy_characteristicChanged( JNIEnv *env, jobject, jlong qtObject, jint charHandle, jbyteArray data) { @@ -281,6 +316,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) { @@ -296,4 +353,17 @@ void LowEnergyNotificationHub::lowEnergy_serviceError( (QLowEnergyService::ServiceError)errorCode)); } +void LowEnergyNotificationHub::lowEnergy_advertisementError( + JNIEnv *, jobject, jlong qtObject, jint status) +{ + lock.lockForRead(); + LowEnergyNotificationHub *hub = hubMap()->value(qtObject); + lock.unlock(); + if (!hub) + return; + + QMetaObject::invokeMethod(hub, "advertisementError", Qt::QueuedConnection, + Q_ARG(int, status)); +} + QT_END_NAMESPACE |