Skip to content

Commit

Permalink
Fix the over agressive progress feedback and package id resolution ne…
Browse files Browse the repository at this point in the history
…ver ending.
  • Loading branch information
denexter authored and blammit committed Mar 12, 2018
1 parent b33dd4a commit eb2dfc6
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 13 deletions.
78 changes: 65 additions & 13 deletions src/developermodesettings.cpp
Expand Up @@ -70,10 +70,13 @@

/* D-Bus signal names */
#define PACKAGEKIT_TRANSACTION_PACKAGE "Package"
#define PACKAGEKIT_TRANSACTION_ITEMPROGRESS "ItemProgress"
#define PACKAGEKIT_TRANSACTION_ERRORCODE "ErrorCode"
#define PACKAGEKIT_TRANSACTION_FINISHED "Finished"

/* D-Bus property names */
#define PACKAGEKIT_TRANSACTION_PERCENTAGE "Percentage"
#define PACKAGEKIT_TRANSACTION_STATUS "Status"

/* D-Bus service */
#define USB_MODED_SERVICE "com.meego.usb_moded"
#define USB_MODED_PATH "/com/meego/usb_moded"
Expand All @@ -87,6 +90,15 @@
#define USB_MODED_CONFIG_IP "ip"
#define USB_MODED_CONFIG_INTERFACE "interface"

#define DBUS_PROPERTIES_INTERFACE "org.freedesktop.DBus.Properties"
#define DBUS_PROPERTIES_CHANGED "PropertiesChanged"

enum TransactionStatus {
TransactionRemoving = 6,
TransactionDownloading = 8,
TransactionInstalling = 9
};

static QMap<QString,QString>
enumerate_network_interfaces()
{
Expand Down Expand Up @@ -138,6 +150,7 @@ DeveloperModeSettings::DeveloperModeSettings(QObject *parent)
, m_remoteLoginEnabled(false) // TODO: Read (from password manager?)
, m_workerStatus(Idle)
, m_workerProgress(PROGRESS_INDETERMINATE)
, m_transactionStatus(0)
{
int uid = getdef_num("UID_MIN", -1);
struct passwd *pwd;
Expand Down Expand Up @@ -333,9 +346,12 @@ QDBusPendingCallWatcher *DeveloperModeSettings::resolvePackageId(const QString &
connectTransactionSignal(
PACKAGEKIT_TRANSACTION_PACKAGE,
SLOT(transactionPackage(uint,QString)));

connectPropertiesChanged();

connectTransactionSignal(
PACKAGEKIT_TRANSACTION_FINISHED,
SLOT(transactionItemProgress(QString,uint,uint)));
SLOT(transactionFinished(uint,uint)));

return packageKitTransactionCall(
m_packageKitTransaction,
Expand All @@ -345,9 +361,8 @@ QDBusPendingCallWatcher *DeveloperModeSettings::resolvePackageId(const QString &

QDBusPendingCallWatcher *DeveloperModeSettings::installPackage(const QString &packageId)
{
connectTransactionSignal(
PACKAGEKIT_TRANSACTION_ITEMPROGRESS,
SLOT(transactionItemProgress(QString,uint,uint)));
connectPropertiesChanged();

connectTransactionSignal(
PACKAGEKIT_TRANSACTION_FINISHED,
SLOT(transactionFinished(uint,uint)));
Expand All @@ -359,9 +374,8 @@ QDBusPendingCallWatcher *DeveloperModeSettings::installPackage(const QString &pa

QDBusPendingCallWatcher *DeveloperModeSettings::removePackage(const QString &packageId)
{
connectTransactionSignal(
PACKAGEKIT_TRANSACTION_ITEMPROGRESS,
SLOT(transactionItemProgress(QString,uint,uint)));
connectPropertiesChanged();

connectTransactionSignal(
PACKAGEKIT_TRANSACTION_FINISHED,
SLOT(transactionFinished(uint,uint)));
Expand All @@ -384,6 +398,17 @@ void DeveloperModeSettings::connectTransactionSignal(const QString &name, const
slot);
}

void DeveloperModeSettings::connectPropertiesChanged()
{
QDBusConnection::systemBus().connect(
PACKAGEKIT_SERVICE,
m_packageKitTransaction.path(),
DBUS_PROPERTIES_INTERFACE,
DBUS_PROPERTIES_CHANGED,
this,
SLOT(transactionPropertiesChanged(QString,QVariantMap,QStringList)));
}

void DeveloperModeSettings::executePackageKitCommand(
QDBusPendingCallWatcher *(DeveloperModeSettings::*command)(const QString &),
const QString &argument)
Expand Down Expand Up @@ -451,12 +476,39 @@ void DeveloperModeSettings::transactionPackage(uint, const QString &packageId)
}
}

void DeveloperModeSettings::transactionItemProgress(const QString &, uint, uint progress)
void DeveloperModeSettings::transactionPropertiesChanged(
const QString &interface, const QVariantMap &changed, const QStringList &)
{
// Ignore package and status. Progress will proceed from 0 to 100 multiple times.
if (m_workerProgress != int(progress)) {
m_workerProgress = progress;
emit workerProgressChanged();
qDebug() << "properties changed" << interface << changed;

if (interface != PACKAGEKIT_TRANSACTION_INTERFACE) {
return;
}

auto it = changed.find(PACKAGEKIT_TRANSACTION_STATUS);
if (it != changed.end()) {
m_transactionStatus = it->toInt();
}

it = changed.find(PACKAGEKIT_TRANSACTION_PERCENTAGE);
if (it != changed.end()) {
switch (m_transactionStatus) {
case TransactionRemoving:
case TransactionDownloading:
case TransactionInstalling: {
int progress = it->toInt();
if (progress > 100) {
progress = PROGRESS_INDETERMINATE;
}
if (m_workerProgress != progress) {
m_workerProgress = progress;
emit workerProgressChanged();
}
break;
}
default:
break;
}
}
}

Expand Down
4 changes: 4 additions & 0 deletions src/developermodesettings.h
Expand Up @@ -120,13 +120,15 @@ private slots:
void transactionItemProgress(const QString &package, uint status, uint progress);
void transactionErrorCode(uint code, const QString &message);
void transactionFinished(uint exit, uint runtime);
void transactionPropertiesChanged(const QString &interface, const QVariantMap &changed, const QStringList &invalidated);

private:
QDBusPendingCallWatcher *resolvePackageId(const QString &packageName);
QDBusPendingCallWatcher *installPackage(const QString &packageId);
QDBusPendingCallWatcher *removePackage(const QString &packageId);

void connectTransactionSignal(const QString &name, const char *slot);
void connectPropertiesChanged();

void executePackageKitCommand(
QDBusPendingCallWatcher *(DeveloperModeSettings::*command)(const QString &),
Expand All @@ -147,6 +149,8 @@ private slots:
bool m_remoteLoginEnabled;
DeveloperModeSettings::Status m_workerStatus;
int m_workerProgress;
int m_transactionStatus;

};

Q_DECLARE_METATYPE(DeveloperModeSettings::Status);
Expand Down

0 comments on commit eb2dfc6

Please sign in to comment.