diff --git a/dbus/org.nemo.transferengine.xml b/dbus/org.nemo.transferengine.xml
index 19ecc18..5ad2828 100644
--- a/dbus/org.nemo.transferengine.xml
+++ b/dbus/org.nemo.transferengine.xml
@@ -79,6 +79,12 @@
+ # Get a list of active transfers
+
+
+
+
+
# Get a list of transfer methods such as FB, Twitter, BT, NFC, etc
@@ -116,6 +122,8 @@
+
+
diff --git a/src/dbmanager.cpp b/src/dbmanager.cpp
index 1013f42..75ecc05 100644
--- a/src/dbmanager.cpp
+++ b/src/dbmanager.cpp
@@ -1,6 +1,6 @@
/****************************************************************************************
**
-** Copyright (C) 2013 Jolla Ltd.
+** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila
** All rights reserved.
**
@@ -613,16 +613,61 @@ bool DbManager::clearTransfers()
return true;
}
+int DbManager::transferCount() const
+{
+ QSqlQuery query;
+ if (query.exec(QString("SELECT COUNT(transfer_id) FROM transfers"))) {
+ query.next();
+ return query.value(0).toInt();
+ } else {
+ qWarning() << "DbManager::transferCount: Failed to execute SQL query!";
+ return -1;
+ }
+}
+
+int DbManager::activeTransferCount() const
+{
+ QSqlQuery query;
+ if (query.exec(QString("SELECT COUNT(transfer_id) FROM transfers WHERE status='%1'").arg(TransferEngineData::TransferStarted))) {
+ query.next();
+ return query.value(0).toInt();
+ } else {
+ qWarning() << "DbManager::activeTransferCount: Failed to execute SQL query!";
+ return -1;
+ }
+}
+
/*!
Returns all the transfers from the database. This method doesn't fetch all the fields from all the
tables, instead it returns what is required to fill fields in TransferDBRecord class.
*/
QList DbManager::transfers() const
+{
+ return transfers(TransferEngineData::Unknown);
+}
+
+/*!
+ Returns all the active transfers from the database. This method doesn't fetch all the fields from all the
+ tables, instead it returns what is required to fill fields in TransferDBRecord class.
+ */
+QList DbManager::activeTransfers() const
+{
+ return transfers(TransferEngineData::TransferStarted);
+}
+
+/*!
+ Returns all the transfers from the database which have the specified status. This method doesn't fetch all the fields from all the
+ tables, instead it returns what is required to fill fields in TransferDBRecord class.
+ */
+QList DbManager::transfers(TransferEngineData::TransferStatus status) const
{
// TODO: This should order the result based on timestamp
QList records;
+ QString queryStr = (status == TransferEngineData::Unknown) ?
+ QString("SELECT * FROM transfers ORDER BY transfer_id DESC") :
+ QString("SELECT * FROM transfers WHERE status='%1' ORDER BY transfer_id DESC").arg(status);
QSqlQuery query;
- if (!query.exec("SELECT * FROM transfers ORDER BY transfer_id DESC")) {
+ if (!query.exec(queryStr)) {
qWarning() << "DbManager::transfers: Failed to execute SQL query. Couldn't get list of transfers!";
return records;
}
diff --git a/src/dbmanager.h b/src/dbmanager.h
index 3fb8437..04e214f 100644
--- a/src/dbmanager.h
+++ b/src/dbmanager.h
@@ -1,6 +1,6 @@
/****************************************************************************************
**
-** Copyright (C) 2013 Jolla Ltd.
+** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila
** All rights reserved.
**
@@ -63,8 +63,14 @@ class DbManager
bool clearTransfers();
+ int transferCount() const;
+
+ int activeTransferCount() const;
+
QList transfers() const;
+ QList activeTransfers() const;
+
TransferEngineData::TransferType transferType(int key) const;
TransferEngineData::TransferStatus transferStatus(int key) const;
@@ -75,6 +81,7 @@ class DbManager
private:
DbManager();
+ QList transfers(TransferEngineData::TransferStatus status) const;
DbManagerPrivate *d_ptr;
Q_DECLARE_PRIVATE(DbManager)
};
diff --git a/src/src.pro b/src/src.pro
index 9a468a6..51172e7 100644
--- a/src/src.pro
+++ b/src/src.pro
@@ -14,7 +14,10 @@ packagesExist(qt5-boostable) {
LIBS += -L../lib -lnemotransferengine-qt5
# generate adaptor code
-system(qdbusxml2cpp -c TransferEngineAdaptor -a transferengineadaptor.h:transferengineadaptor.cpp -i metatypedeclarations.h ../dbus/org.nemo.transferengine.xml)
+DBUS_ADAPTORS += transferengine
+transferengine.files = ../dbus/org.nemo.transferengine.xml
+transferengine.header_flags = -i metatypedeclarations.h -i transferengine.h -l TransferEngine -c TransferEngineAdaptor
+transferengine.source_flags = -l TransferEngine -c TransferEngineAdaptor
CONFIG += link_pkgconfig
PKGCONFIG += accounts-qt5 nemonotifications-qt5
@@ -49,12 +52,10 @@ PRE_TARGETDEPS += ts engineering_english
# Input
SOURCES += main.cpp \
- transferengineadaptor.cpp \
dbmanager.cpp \
transferengine.cpp
HEADERS += \
- transferengineadaptor.h \
dbmanager.h \
transferengine.h \
transferengine_p.h
diff --git a/src/transferengine.cpp b/src/transferengine.cpp
index 0bcb7ed..33f2c11 100644
--- a/src/transferengine.cpp
+++ b/src/transferengine.cpp
@@ -1,6 +1,6 @@
/****************************************************************************************
**
-** Copyright (C) 2013 Jolla Ltd.
+** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila
** All rights reserved.
**
@@ -29,7 +29,7 @@
#include "transferplugininterface.h"
#include "mediaitem.h"
#include "dbmanager.h"
-#include "transferengineadaptor.h"
+#include "transferengine_adaptor.h"
#include "transfertypes.h"
#include "transferplugininfo.h"
@@ -195,8 +195,12 @@ void TransferEnginePrivate::exitSafely()
void TransferEnginePrivate::delayedExitSafely()
{
- qDebug() << "Stopping transfer engine";
- qApp->exit();
+ if (getenv("TRANSFER_ENGINE_KEEP_RUNNING")) {
+ qDebug() << "Keeping transfer engine running";
+ } else {
+ qDebug() << "Stopping transfer engine";
+ qApp->exit();
+ }
}
void TransferEnginePrivate::enabledPluginsCheck()
@@ -285,6 +289,9 @@ void TransferEnginePrivate::recoveryCheck()
record.status == TransferEngineData::NotStarted) {
if (DbManager::instance()->updateTransferStatus(record.transfer_id, TransferEngineData::TransferInterrupted)) {
emit q->statusChanged(record.transfer_id, TransferEngineData::TransferInterrupted);
+ if (record.status == TransferEngineData::TransferStarted) {
+ emit q_ptr->activeTransfersChanged(); // It's not active anymore
+ }
}
}
}
@@ -1041,6 +1048,7 @@ void TransferEngine::startTransfer(int transferId)
d->m_activityMonitor->newActivity(transferId);
DbManager::instance()->updateTransferStatus(transferId, TransferEngineData::TransferStarted);
emit statusChanged(transferId, TransferEngineData::TransferStarted);
+ emit activeTransfersChanged();
} else {
qWarning() << "TransferEngine::startTransfer: could not start transfer";
}
@@ -1159,6 +1167,8 @@ void TransferEngine::finishTransfer(int transferId, int status, const QString &r
}
}
+ emit activeTransfersChanged(); // Assume that the transfer was active
+
if (notify) {
emit transfersChanged();
}
@@ -1197,6 +1207,16 @@ QList TransferEngine::transfers()
return DbManager::instance()->transfers();
}
+/*!
+ DBus adaptor calls this method to fetch a list of active transfers. This method returns QList.
+ */
+QList TransferEngine::activeTransfers()
+{
+ Q_D(TransferEngine);
+ d->exitSafely();
+ return DbManager::instance()->activeTransfers();
+}
+
/*!
DBus adaptor calls this method to fetch a list of transfer methods. This method returns QList.
@@ -1216,10 +1236,15 @@ void TransferEngine::clearTransfers()
{
Q_D(TransferEngine);
d->exitSafely();
- if (DbManager::instance()->clearTransfers()) {
- emit transfersChanged();
- } else {
- qWarning() << "TransferEngine::clearTransfers: Failed to clear finished transfers!";
+ const int count = DbManager::instance()->transferCount();
+ if (count > 0) {
+ const int active = DbManager::instance()->activeTransferCount();
+ if (DbManager::instance()->clearTransfers()) {
+ if (active > 0) {
+ emit activeTransfersChanged();
+ }
+ emit transfersChanged();
+ }
}
}
diff --git a/src/transferengine.h b/src/transferengine.h
index 0659555..4452528 100644
--- a/src/transferengine.h
+++ b/src/transferengine.h
@@ -1,6 +1,6 @@
/****************************************************************************************
**
-** Copyright (C) 2013 Jolla Ltd.
+** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila
** All rights reserved.
**
@@ -83,6 +83,8 @@ public Q_SLOTS:
QList transfers();
+ QList activeTransfers();
+
QList transferMethods();
void clearTransfers();
@@ -102,6 +104,7 @@ public Q_SLOTS:
void transfersChanged();
+ void activeTransfersChanged();
private:
TransferEnginePrivate *d_ptr;
diff --git a/transfer-engine.pro b/transfer-engine.pro
index 0a02d1e..7eefb8b 100644
--- a/transfer-engine.pro
+++ b/transfer-engine.pro
@@ -13,6 +13,7 @@ systemd.path = /usr/lib/systemd/user/
OTHER_FILES += \
rpm/*.spec \
nemo-transfer-engine.conf \
+ dbus/* \
doc/src/* \
doc/config/*