57
58
return (stateString == "complete" || stateString == "cancelled" || stateString == "failed");
60
static bool checkAllTasksFinished(QMap<QString, QVariantMap> const & state)
61
bool checkAllTasksFinished(keeper::Items const & state) const
63
64
for (auto iter = state.begin(); ret && (iter != state.end()); ++iter)
65
auto statusString = (*iter).value("action").toString();
66
auto statusString = (*iter).get_status();
66
67
ret = stateIsFinal(statusString);
72
static keeper::Items getValue(QDBusMessage const & message, keeper::Error & error)
74
if (message.errorMessage().isEmpty())
76
if (message.arguments().count() != 1)
78
error = keeper::Error::UNKNOWN;
79
return keeper::Items();
82
auto value = message.arguments().at(0);
83
if (value.typeName() != QStringLiteral("QDBusArgument"))
85
error = keeper::Error::UNKNOWN;
86
return keeper::Items();
88
auto dbus_arg = value.value<QDBusArgument>();
89
error = keeper::Error::OK;
94
if (message.arguments().count() != 2)
96
error = keeper::Error::UNKNOWN;
97
return keeper::Items();
102
error = keeper::convert_from_dbus_variant(message.arguments().at(1), &valid);
105
error = keeper::Error::UNKNOWN;
107
return keeper::Items();
71
110
QScopedPointer<DBusInterfaceKeeperUser> userIface;
72
111
QScopedPointer<DBusPropertiesInterface> propertiesIface;
74
QMap<QString, QVariantMap> backups;
75
QMap<QString, QVariantMap> restores;
113
keeper::Items backups;
76
114
double progress = 0;
77
115
bool readyToBackup = false;
78
116
bool backupBusy = false;
79
QMap<QString, TaskStatus> task_status;
117
QMap<QString, TaskStatus> taskStatus;
80
118
TasksMode mode = TasksMode::IDLE_MODE;
89
127
// Store backups list locally with an additional "enabled" pair to keep track enabled states
90
128
// TODO: We should be listening to a backupChoicesChanged signal to keep this list updated
91
d->backups = getBackupChoices();
130
d->backups = getBackupChoices(error);
92
132
for(auto iter = d->backups.begin(); iter != d->backups.end(); ++iter)
94
134
iter.value()["enabled"] = false;
250
void KeeperClient::cancel()
252
QDBusReply<void> cancelReply = d->userIface->call("Cancel");
254
if (!cancelReply.isValid())
256
qWarning() << "Error canceling" << cancelReply.error().message();
210
260
QString KeeperClient::getBackupName(QString uuid)
212
return d->backups.value(uuid).value("display-name").toString();
215
QMap<QString, QVariantMap> KeeperClient::getBackupChoices() const
217
QDBusReply<QMap<QString, QVariantMap>> choices = d->userIface->call("GetBackupChoices");
219
if (!choices.isValid())
221
qWarning() << "Error getting backup choices:" << choices.error().message();
222
return QMap<QString, QVariantMap>();
225
return choices.value();
228
QMap<QString, QVariantMap> KeeperClient::getRestoreChoices() const
230
QDBusPendingReply<QMap<QString, QVariantMap>> choices = d->userIface->call("GetRestoreChoices");
232
choices.waitForFinished();
233
if (!choices.isValid())
235
qWarning() << "Error getting restore choices:" << choices.error().message();
236
return QMap<QString, QVariantMap>();
239
return choices.value();
242
void KeeperClient::startBackup(const QStringList& uuids) const
244
QDBusReply<void> backupReply = d->userIface->call("StartBackup", uuids);
262
return d->backups.value(uuid).get_display_name();
265
keeper::Items KeeperClient::getBackupChoices(keeper::Error & error) const
267
QDBusMessage choices = d->userIface->call("GetBackupChoices");
268
return KeeperClientPrivate::getValue(choices, error);
271
keeper::Items KeeperClient::getRestoreChoices(QString const & storage, keeper::Error & error) const
273
QDBusMessage choices = d->userIface->call("GetRestoreChoices", storage);
274
return KeeperClientPrivate::getValue(choices, error);
277
void KeeperClient::startBackup(const QStringList& uuids, QString const & storage) const
279
QDBusReply<void> backupReply = d->userIface->call("StartBackup", uuids, storage);
246
281
if (!backupReply.isValid())
252
void KeeperClient::startRestore(const QStringList& uuids) const
287
void KeeperClient::startRestore(const QStringList& uuids, QString const & storage) const
254
QDBusReply<void> backupReply = d->userIface->call("StartRestore", uuids);
289
QDBusReply<void> backupReply = d->userIface->call("StartRestore", uuids, storage);
256
291
if (!backupReply.isValid())
262
QMap<QString, QVariantMap> KeeperClient::getState() const
297
keeper::Items KeeperClient::getState() const
264
299
return d->userIface->state();
302
QStringList KeeperClient::getStorageAccounts() const
304
QDBusPendingReply<QStringList> accountsReply = d->userIface->call("GetStorageAccounts");
306
accountsReply.waitForFinished();
307
if (!accountsReply.isValid())
309
qWarning() << "Error retrieving storage accounts:" << accountsReply.error().message();
312
return accountsReply.value();
267
315
void KeeperClient::stateUpdated()
269
317
auto states = getState();
271
319
if (!states.empty())
273
for (auto const & uuid : d->task_status.keys())
321
for (auto const & uuid : d->taskStatus.keys())
275
323
auto iter_state = states.find(uuid);
276
324
if (iter_state == states.end())
278
326
qWarning() << "State for uuid: " << uuid << " was not found";
280
auto state = (*iter_state);
281
double progress = state.value("percent-done").toDouble();
282
auto status = state.value("action").toString();
284
keeper::KeeperError keeper_error = keeper::KeeperError::OK;
285
auto iter_error = state.find("error");
286
if (iter_error != state.end())
289
keeper_error = keeper::convertFromDBusVariant(state.value("error"), &conversion_ok);
292
auto current_state = d->task_status[uuid];
328
keeper::Item keeper_item((*iter_state));
329
auto progress = keeper_item.get_percent_done();
330
auto status = keeper_item.get_status();
331
auto keeper_error = keeper_item.get_error();
333
auto current_state = d->taskStatus[uuid];
293
334
if (current_state.status != status || current_state.percentage < progress)
295
d->task_status[uuid].status = status;
296
d->task_status[uuid].percentage = progress;
297
Q_EMIT(taskStatusChanged(state.value("display-name").toString(), status, progress, keeper_error));
336
d->taskStatus[uuid].status = status;
337
d->taskStatus[uuid].percentage = progress;
338
Q_EMIT(taskStatusChanged(keeper_item.get_display_name(), status, progress, keeper_error));
301
342
double totalProgress = 0;
302
343
for (auto const& state : states)
304
totalProgress += state.value("percent-done").toDouble();
345
keeper::Item keeper_item(state);
346
totalProgress += keeper_item.get_percent_done();
307
349
d->progress = totalProgress / states.count();