From c7405a4cbbd9e7901313dbb0babf056ea31a001d Mon Sep 17 00:00:00 2001 From: Slava Monich Date: Tue, 22 Mar 2016 00:09:55 +0200 Subject: [PATCH] [transfer-engine] Added activeTransfers method to the D-Bus interface. Contributes to JB#34083 activeTransfersChanged signal is emitted when a transfer is added to or removed from the activeTransfers list. This allows to avoid the overhead of fetching the full list of transfers just to check if any of them is active. --- dbus/org.nemo.transferengine.xml | 8 ++++++ src/dbmanager.cpp | 49 ++++++++++++++++++++++++++++++-- src/dbmanager.h | 9 +++++- src/src.pro | 7 +++-- src/transferengine.cpp | 41 ++++++++++++++++++++------ src/transferengine.h | 5 +++- transfer-engine.pro | 1 + 7 files changed, 105 insertions(+), 15 deletions(-) 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/*