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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/*
SPDX-FileCopyrightText: 2009 Jonathan Armond <jon.armond@gmail.com>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "kmigratorbase.h"
#include <Akonadi/AgentInstanceCreateJob>
#include <Akonadi/AgentManager>
#include <Akonadi/AgentType>
#include "migration_debug.h"
#include <KConfigGroup>
#include <KLocalizedString>
#include <KSharedConfig>
#include <QCoreApplication>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QMetaEnum>
#include <QStandardPaths>
#include <QTimer>
using namespace Akonadi;
namespace
{
QString messageTypeToString(KMigratorBase::MessageType type)
{
switch (type) {
case KMigratorBase::Success:
return QStringLiteral("Success");
case KMigratorBase::Skip:
return QStringLiteral("Skipped");
case KMigratorBase::Info:
return QStringLiteral("Info ");
case KMigratorBase::Warning:
return QStringLiteral("WARNING");
case KMigratorBase::Error:
return QStringLiteral("ERROR ");
}
Q_ASSERT(false);
return {};
}
}
KMigratorBase::KMigratorBase()
{
const QString logFileName = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1Char('/') + QCoreApplication::applicationName()
+ QLatin1StringView("/migration.log");
QFileInfo fileInfo(logFileName);
QDir().mkpath(fileInfo.absolutePath());
m_logFile = new QFile(logFileName);
if (!m_logFile->open(QFile::Append)) {
delete m_logFile;
m_logFile = nullptr;
qCWarning(MIGRATION_LOG) << "Unable to open log file: " << logFileName;
}
logMessage(Info, QStringLiteral("Starting migration..."));
connect(this, &KMigratorBase::message, this, &KMigratorBase::logMessage);
// load the vtable before we continue
QTimer::singleShot(0, this, &KMigratorBase::migrate);
}
KMigratorBase::~KMigratorBase()
{
logMessage(Info, QStringLiteral("Migration finished."));
delete m_logFile;
}
KMigratorBase::MigrationState KMigratorBase::migrationState(const QString &identifier) const
{
KConfigGroup cfg(KSharedConfig::openConfig(), QStringLiteral("Resource ") + identifier);
QMetaEnum e = metaObject()->enumerator(metaObject()->indexOfEnumerator("MigrationState"));
const QString s = cfg.readEntry("MigrationState", e.valueToKey(None));
MigrationState state = (MigrationState)e.keyToValue(s.toLatin1().constData());
if (state != None) {
const QString resId = cfg.readEntry("ResourceIdentifier", "");
// previously migrated but removed again
if (!AgentManager::self()->instance(resId).isValid()) {
state = None;
}
}
return state;
}
void KMigratorBase::setMigrationState(const QString &identifier, MigrationState state, const QString &resId, const QString &type)
{
KConfigGroup cfg(KSharedConfig::openConfig(), QStringLiteral("Resource ") + identifier);
QMetaEnum e = metaObject()->enumerator(metaObject()->indexOfEnumerator("MigrationState"));
const QString stateStr = QLatin1StringView(e.valueToKey(state));
cfg.writeEntry("MigrationState", stateStr);
cfg.writeEntry("ResourceIdentifier", resId);
cfg.sync();
cfg = KConfigGroup(KSharedConfig::openConfig(), QStringLiteral("Bridged"));
QStringList bridgedResources = cfg.readEntry(type + QLatin1StringView("Resources"), QStringList());
if (state == Bridged) {
if (!bridgedResources.contains(identifier)) {
bridgedResources << identifier;
}
} else {
bridgedResources.removeAll(identifier);
}
cfg.writeEntry(type + QLatin1StringView("Resources"), bridgedResources);
cfg.sync();
}
KJob *KMigratorBase::createAgentInstance(const QString &typeId, QObject *receiver, const char *slot)
{
Q_EMIT message(Info, i18n("Creating instance of type %1", typeId));
auto job = new AgentInstanceCreateJob(typeId, this);
// clang-format off
connect(job, SIGNAL(result(KJob*)), receiver, slot);
// clang-format on
job->start();
return job;
}
void KMigratorBase::logMessage(KMigratorBase::MessageType type, const QString &msg)
{
if (m_logFile) {
m_logFile->write(QString(QLatin1Char('[') + QDateTime::currentDateTime().toString() + QLatin1StringView("] ") + messageTypeToString(type)
+ QLatin1StringView(": ") + msg + QLatin1Char('\n'))
.toUtf8());
m_logFile->flush();
}
}
#include "moc_kmigratorbase.cpp"
|