summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNedim Hadzic <nhadzic@blackberry.com>2014-03-27 20:12:27 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-04-03 12:12:09 +0200
commitc95a71f9636464f921be5bbbaf8d3aeb84c06fbc (patch)
tree04137a03eb2904e7680d97482cc15c302c9deeb2
parent1b256167372734a5b84b5f657cf9d99c5128e505 (diff)
Implemented sending buffer files in QBluetoothTransferReply QNX
QTemporaryFile did not work since it created temporary file in the app folder, which was not accessible for sending and sharing the file. Task-number: QTBUG-32742 Change-Id: Icf3f30e800976916d3e82a928d04143757bf9afe Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
-rw-r--r--src/bluetooth/qbluetoothtransferreply.cpp2
-rw-r--r--src/bluetooth/qbluetoothtransferreply.h4
-rw-r--r--src/bluetooth/qbluetoothtransferreply_qnx.cpp70
-rw-r--r--src/bluetooth/qbluetoothtransferreply_qnx_p.h6
4 files changed, 62 insertions, 20 deletions
diff --git a/src/bluetooth/qbluetoothtransferreply.cpp b/src/bluetooth/qbluetoothtransferreply.cpp
index ae97c639..9acd917d 100644
--- a/src/bluetooth/qbluetoothtransferreply.cpp
+++ b/src/bluetooth/qbluetoothtransferreply.cpp
@@ -68,6 +68,8 @@ QT_BEGIN_NAMESPACE
\value FileNotFoundError Unable to open the file specified
\value HostNotFoundError Unable to connect to the target host
\value UserCanceledTransferError User terminated the transfer
+ \value IODeviceNotReadableError File was not open before initiating the sending command
+ \value ResourceBusyError Unable to access the resource.
*/
diff --git a/src/bluetooth/qbluetoothtransferreply.h b/src/bluetooth/qbluetoothtransferreply.h
index 42571ca4..33910fd9 100644
--- a/src/bluetooth/qbluetoothtransferreply.h
+++ b/src/bluetooth/qbluetoothtransferreply.h
@@ -61,7 +61,9 @@ public:
UnknownError,
FileNotFoundError,
HostNotFoundError,
- UserCanceledTransferError
+ UserCanceledTransferError,
+ IODeviceNotReadableError,
+ ResourceBusyError
};
diff --git a/src/bluetooth/qbluetoothtransferreply_qnx.cpp b/src/bluetooth/qbluetoothtransferreply_qnx.cpp
index bc15fbde..3f22d536 100644
--- a/src/bluetooth/qbluetoothtransferreply_qnx.cpp
+++ b/src/bluetooth/qbluetoothtransferreply_qnx.cpp
@@ -56,8 +56,11 @@
#include <QtCore/private/qcore_unix_p.h>
#include <QTime>
+#include <QDir>
+#include <QCoreApplication>
-//static const QLatin1String agentPath("/shared/tmp/opp");
+static const QString agentPath(QStringLiteral("/accounts/1000/shared/misc/"));
+static bool busy;
QT_BEGIN_NAMESPACE
@@ -69,7 +72,6 @@ QBluetoothTransferReplyQnx::QBluetoothTransferReplyQnx(QIODevice *input, const Q
{
setRequest(request);
setManager(parent);
-
ppsRegisterControl();
//qsrand(QTime::currentTime().msec());
//m_agent_path = agentPath;
@@ -87,6 +89,8 @@ QBluetoothTransferReplyQnx::QBluetoothTransferReplyQnx(QIODevice *input, const Q
*/
QBluetoothTransferReplyQnx::~QBluetoothTransferReplyQnx()
{
+ removeTempFile();
+ delete tempfile;
ppsUnregisterControl(this);
}
@@ -98,19 +102,39 @@ bool QBluetoothTransferReplyQnx::start()
QFile *file = qobject_cast<QFile *>(source);
if (!file){
-// tempfile = new QTemporaryFile(this );
-// tempfile->open();
-
-// QFutureWatcher<bool> *watcher = new QFutureWatcher<bool>();
-// QObject::connect(watcher, SIGNAL(finished()), this, SLOT(copyDone()));
+ // Deleting temporary files in case of app crash
+ QDir directory(agentPath);
+ QString appName = QStringLiteral("Qt5OPP_tmp") + QCoreApplication::applicationName();
+ if (directory.exists(appName) && !busy) {
+ QFile file(agentPath + appName);
+ file.remove();
+ }
+ else if (directory.exists(appName) && busy) {
+ m_errorStr = QBluetoothTransferReply::tr("Resurce busy.");
+ m_error = QBluetoothTransferReply::ResourceBusyError;
+ m_finished = true;
+ m_running = false;
+ Q_EMIT finished(this);
+ return false;
+ }
+ if (!source->isReadable()) {
+ m_errorStr = QBluetoothTransferReply::tr("QIODevice cannot be read."
+ "Make sure it is open for reading.");
+ m_error = QBluetoothTransferReply::IODeviceNotReadableError;
+ m_finished = true;
+ m_running = false;
+ Q_EMIT finished(this);
+ return false;
+ }
+ QString fileName = agentPath + QStringLiteral("Qt5OPP_tmp");
+ tempfile = new QFile(fileName);
+ tempfile->open(QIODevice::WriteOnly);
-// QFuture<bool> results = QtConcurrent::run(QBluetoothTransferReplyQnx::copyToTempFile, tempfile, source);
-// watcher->setFuture(results);
- //QTemporaryFile does not work properly yet
- m_error = QBluetoothTransferReply::UnknownError;
- m_finished = true;
- m_running = false;
- Q_EMIT finished(this);
+ QFutureWatcher<bool> *watcher = new QFutureWatcher<bool>();
+ QObject::connect(watcher, SIGNAL(finished()), this, SLOT(copyDone()));
+ QFuture<bool> results = QtConcurrent::run(QBluetoothTransferReplyQnx::copyToTempFile, tempfile, source);
+ watcher->setFuture(results);
+ busy = true;
} else {
if (!file->exists()) {
@@ -139,7 +163,7 @@ bool QBluetoothTransferReplyQnx::copyToTempFile(QIODevice *to, QIODevice *from)
char *block = new char[4096];
int size;
- while ((size = from->read(block, 4096))) {
+ while ((size = from->read(block, 4096)) > 0) {
if (size != to->write(block, size))
return false;
}
@@ -150,14 +174,14 @@ bool QBluetoothTransferReplyQnx::copyToTempFile(QIODevice *to, QIODevice *from)
void QBluetoothTransferReplyQnx::copyDone()
{
- qCDebug(QT_BT_QNX) << "Copy done";
startOPP(tempfile->fileName());
QObject::sender()->deleteLater();
}
void QBluetoothTransferReplyQnx::startOPP(QString filename)
{
- qCDebug(QT_BT_QNX) << "Sending Push object command";
+ qCDebug(QT_BT_QNX) << "Sending push object command"
+ << request().address().toString() << filename;
ppsSendOpp("push_object", filename.toUtf8(), request().address(), this);
}
@@ -183,6 +207,7 @@ void QBluetoothTransferReplyQnx::controlEvent(ppsResult result)
{
if (result.msg == QStringLiteral("opp_cancelled")) {
qCDebug(QT_BT_QNX) << "opp cancelled" << result.errorMsg << result.error;
+ removeTempFile();
if (m_running)
return;
m_finished = true;
@@ -215,6 +240,7 @@ void QBluetoothTransferReplyQnx::controlEvent(ppsResult result)
Q_EMIT transferProgress(sentBytes, totalBytes);
} else if (result.msg == QStringLiteral("opp_complete")) {
qCDebug(QT_BT_QNX) << "opp complete";
+ removeTempFile();
m_finished = true;
m_running = false;
Q_EMIT finished(this);
@@ -242,6 +268,16 @@ void QBluetoothTransferReplyQnx::abort()
//not supported yet
}
+void QBluetoothTransferReplyQnx::removeTempFile()
+{
+ if (tempfile) {
+ if (tempfile->exists()) {
+ tempfile->remove();
+ busy = false;
+ }
+ }
+}
+
#include "moc_qbluetoothtransferreply_qnx_p.cpp"
QT_END_NAMESPACE
diff --git a/src/bluetooth/qbluetoothtransferreply_qnx_p.h b/src/bluetooth/qbluetoothtransferreply_qnx_p.h
index 4522c8bf..903545c2 100644
--- a/src/bluetooth/qbluetoothtransferreply_qnx_p.h
+++ b/src/bluetooth/qbluetoothtransferreply_qnx_p.h
@@ -50,11 +50,12 @@
#include "qbluetoothtransferreply.h"
-#include <QTemporaryFile>
#include <QSocketNotifier>
#include "qnx/ppshelpers_p.h"
+QT_FORWARD_DECLARE_CLASS(QFile)
+
QT_BEGIN_NAMESPACE
class Q_BLUETOOTH_EXPORT QBluetoothTransferReplyQnx : public QBluetoothTransferReply
@@ -80,7 +81,8 @@ private Q_SLOTS:
private:
void startOPP(QString filename);
- QTemporaryFile *tempfile;
+ void removeTempFile();
+ QFile *tempfile;
QIODevice *source;
bool m_running;