Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'active' into 'master'
Add activeTransfers method to the D-Bus interface

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.

See merge request !2
  • Loading branch information
Slava Monich committed Mar 24, 2016
2 parents dc528c6 + c7405a4 commit adcf538
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 15 deletions.
8 changes: 8 additions & 0 deletions dbus/org.nemo.transferengine.xml
Expand Up @@ -79,6 +79,12 @@
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList &lt; TransferDBRecord &gt; "/>
</method>

# Get a list of active transfers
<method name="activeTransfers">
<arg name="records" type="a(iidss)" direction="out" />
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList &lt; TransferDBRecord &gt; "/>
</method>

# Get a list of transfer methods such as FB, Twitter, BT, NFC, etc
<method name="transferMethods">
<arg name="methods" type="a(ssssasi)" direction="out" />
Expand Down Expand Up @@ -116,6 +122,8 @@

<signal name="transfersChanged" />

<signal name="activeTransfersChanged" />

<signal name="transferMethodListChanged" />
</interface>
</node>
Expand Down
49 changes: 47 additions & 2 deletions src/dbmanager.cpp
@@ -1,6 +1,6 @@
/****************************************************************************************
**
** Copyright (C) 2013 Jolla Ltd.
** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila <marko.mattila@jollamobile.com>
** All rights reserved.
**
Expand Down Expand Up @@ -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<TransferDBRecord> 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<TransferDBRecord> 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<TransferDBRecord> DbManager::transfers(TransferEngineData::TransferStatus status) const
{
// TODO: This should order the result based on timestamp
QList<TransferDBRecord> 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;
}
Expand Down
9 changes: 8 additions & 1 deletion src/dbmanager.h
@@ -1,6 +1,6 @@
/****************************************************************************************
**
** Copyright (C) 2013 Jolla Ltd.
** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila <marko.mattila@jollamobile.com>
** All rights reserved.
**
Expand Down Expand Up @@ -63,8 +63,14 @@ class DbManager

bool clearTransfers();

int transferCount() const;

int activeTransferCount() const;

QList<TransferDBRecord> transfers() const;

QList<TransferDBRecord> activeTransfers() const;

TransferEngineData::TransferType transferType(int key) const;

TransferEngineData::TransferStatus transferStatus(int key) const;
Expand All @@ -75,6 +81,7 @@ class DbManager

private:
DbManager();
QList<TransferDBRecord> transfers(TransferEngineData::TransferStatus status) const;
DbManagerPrivate *d_ptr;
Q_DECLARE_PRIVATE(DbManager)
};
Expand Down
7 changes: 4 additions & 3 deletions src/src.pro
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
41 changes: 33 additions & 8 deletions src/transferengine.cpp
@@ -1,6 +1,6 @@
/****************************************************************************************
**
** Copyright (C) 2013 Jolla Ltd.
** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila <marko.mattila@jollamobile.com>
** All rights reserved.
**
Expand Down Expand Up @@ -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"

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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
}
}
}
}
Expand Down Expand Up @@ -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";
}
Expand Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -1197,6 +1207,16 @@ QList<TransferDBRecord> TransferEngine::transfers()
return DbManager::instance()->transfers();
}

/*!
DBus adaptor calls this method to fetch a list of active transfers. This method returns QList<TransferDBRecord>.
*/
QList<TransferDBRecord> 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<TransferMethodInfo>.
Expand All @@ -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();
}
}
}

Expand Down
5 changes: 4 additions & 1 deletion src/transferengine.h
@@ -1,6 +1,6 @@
/****************************************************************************************
**
** Copyright (C) 2013 Jolla Ltd.
** Copyright (C) 2013-2016 Jolla Ltd.
** Contact: Marko Mattila <marko.mattila@jollamobile.com>
** All rights reserved.
**
Expand Down Expand Up @@ -83,6 +83,8 @@ public Q_SLOTS:

QList<TransferDBRecord> transfers();

QList<TransferDBRecord> activeTransfers();

QList <TransferMethodInfo> transferMethods();

void clearTransfers();
Expand All @@ -102,6 +104,7 @@ public Q_SLOTS:

void transfersChanged();

void activeTransfersChanged();

private:
TransferEnginePrivate *d_ptr;
Expand Down
1 change: 1 addition & 0 deletions transfer-engine.pro
Expand Up @@ -13,6 +13,7 @@ systemd.path = /usr/lib/systemd/user/
OTHER_FILES += \
rpm/*.spec \
nemo-transfer-engine.conf \
dbus/* \
doc/src/* \
doc/config/*

Expand Down

0 comments on commit adcf538

Please sign in to comment.