1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
/*
SPDX-FileCopyrightText: 2009 Constantin Berzan <exit3219@gmail.com>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "agentprogressmonitor.h"
#include <Akonadi/AgentManager>
using namespace Akonadi;
using namespace PimCommon;
AgentProgressMonitor::AgentProgressMonitor(const AgentInstance &agent, KPIM::ProgressItem *item)
: QObject(item)
, mAgent(agent)
, mItem(item)
{
connect(AgentManager::self(), &AgentManager::instanceProgressChanged, this, &AgentProgressMonitor::instanceProgressChanged);
connect(AgentManager::self(), &AgentManager::instanceStatusChanged, this, &AgentProgressMonitor::instanceStatusChanged);
connect(Akonadi::AgentManager::self(), &AgentManager::instanceRemoved, this, &AgentProgressMonitor::instanceRemoved);
connect(Akonadi::AgentManager::self(), &AgentManager::instanceNameChanged, this, &AgentProgressMonitor::instanceNameChanged);
// TODO connect to instanceError, instanceWarning, instanceOnline ?
// and do what?
connect(item, &KPIM::ProgressItem::progressItemCanceled, this, &AgentProgressMonitor::abort);
// TODO handle offline case
}
AgentProgressMonitor::~AgentProgressMonitor() = default;
void AgentProgressMonitor::abort()
{
mAgent.abortCurrentTask();
}
void AgentProgressMonitor::instanceRemoved(const Akonadi::AgentInstance &instance)
{
Q_UNUSED(instance)
if (!mItem.data()) {
return;
}
mItem.data()->disconnect(this); // avoid abort call
mItem.data()->cancel();
if (mItem.data()) {
mItem.data()->setComplete();
}
}
void AgentProgressMonitor::instanceProgressChanged(const AgentInstance &instance)
{
if (!mItem.data()) {
return;
}
if (mAgent == instance) { // compares identifiers
mAgent = instance; // keeps copy of current status
const int progress = mAgent.progress();
if (progress >= 0) {
mItem.data()->setProgress(progress);
}
}
}
void AgentProgressMonitor::instanceStatusChanged(const AgentInstance &instance)
{
if (!mItem.data()) {
return;
}
if (mAgent == instance) { // compares identifiers
mAgent = instance; // keeps copy of current status
mItem.data()->setStatus(mAgent.statusMessage());
switch (mAgent.status()) {
case AgentInstance::Idle:
if (mItem.data()) {
mItem.data()->setComplete();
}
break;
case AgentInstance::Running:
break;
case AgentInstance::Broken:
mItem.data()->disconnect(this); // avoid abort call
mItem.data()->cancel();
if (mItem.data()) {
mItem.data()->setComplete();
}
break;
default:
Q_ASSERT(false);
}
}
}
void AgentProgressMonitor::instanceNameChanged(const Akonadi::AgentInstance &instance)
{
if (!mItem.data()) {
return;
}
mItem.data()->setLabel(instance.name());
}
|