summaryrefslogtreecommitdiffstats
path: root/src/android
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@digia.com>2014-02-26 11:08:41 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-27 13:00:50 +0100
commitccaeb6539d2f7e9ac756a7f2017c9f9e8813e265 (patch)
tree496ce956fc9408ef3fb50d34d8a4c094f3de22b9 /src/android
parent9d6057f3fa0b51ee2d36ad931072d2a3c816d0a6 (diff)
Fix crash when interrupting QBluetoothSocket's input stream thread
The previous QThread did not always properly resume when InputStream.read() was interrupted by BluetoothSocket.close(). This patch converts the QThread to a Java thread which works as the Android API docs suggested. Task-number: QTBUG-37061 Change-Id: Id6ac9b57a28f3b532cbe49ff1dfdc9d1e6432aaa Reviewed-by: Nedim Hadzic <nedimhadzija@gmail.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Diffstat (limited to 'src/android')
-rw-r--r--src/android/bluetooth/bluetooth.pri3
-rw-r--r--src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java103
2 files changed, 105 insertions, 1 deletions
diff --git a/src/android/bluetooth/bluetooth.pri b/src/android/bluetooth/bluetooth.pri
index d3fdd0d0..b2121ff3 100644
--- a/src/android/bluetooth/bluetooth.pri
+++ b/src/android/bluetooth/bluetooth.pri
@@ -6,7 +6,8 @@ PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/bluetooth
JAVACLASSPATH += $$PWD/src/
JAVASOURCES += \
$$PATHPREFIX/QtBluetoothBroadcastReceiver.java \
- $$PATHPREFIX/QtBluetoothSocketServer.java
+ $$PATHPREFIX/QtBluetoothSocketServer.java \
+ $$PATHPREFIX/QtBluetoothInputStreamThread.java
# install
diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java
new file mode 100644
index 00000000..57636ad4
--- /dev/null
+++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothInputStreamThread.java
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtBluetooth module of the Qt Toolkit.
+**
+** $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 Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/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 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt 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 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+package org.qtproject.qt5.android.bluetooth;
+
+import java.io.InputStream;
+import java.io.IOException;
+import android.util.Log;
+
+public class QtBluetoothInputStreamThread extends Thread
+{
+ /* Pointer to the Qt object that "owns" the Java object */
+ long qtObject = 0;
+ public boolean logEnabled = false;
+ private static final String TAG = "QtBluetooth";
+ private InputStream m_inputStream = null;
+
+ //error codes
+ public static final int QT_MISSING_INPUT_STREAM = 0;
+ public static final int QT_READ_FAILED = 1;
+ public static final int QT_THREAD_INTERRUPTED = 2;
+
+ public QtBluetoothInputStreamThread()
+ {
+ setName("QtBtInputStreamThread");
+ }
+
+ public void setInputStream(InputStream stream)
+ {
+ m_inputStream = stream;
+ }
+
+ public void run()
+ {
+ if (m_inputStream == null) {
+ errorOccurred(qtObject, QT_MISSING_INPUT_STREAM);
+ return;
+ }
+
+ byte[] buffer = new byte[1000];
+ int bytesRead = 0;
+
+ try {
+ while (!isInterrupted()) {
+ //this blocks until we see incoming data
+ //or close() on related BluetoothSocket is called
+ bytesRead = m_inputStream.read(buffer);
+ readyData(qtObject, buffer, bytesRead);
+ }
+
+ errorOccurred(qtObject, QT_THREAD_INTERRUPTED);
+ } catch (IOException ex) {
+ if (logEnabled)
+ Log.d(TAG, "InputStream.read() failed:" + ex.toString());
+ ex.printStackTrace();
+ errorOccurred(qtObject, QT_READ_FAILED);
+ }
+
+ if (logEnabled)
+ Log.d(TAG, "Leaving input stream thread");
+ }
+
+ public static native void errorOccurred(long qtObject, int errorCode);
+ public static native void readyData(long qtObject, byte[] buffer, int bufferLength);
+}