diff --git a/src/core/slavebase.h b/src/core/slavebase.h --- a/src/core/slavebase.h +++ b/src/core/slavebase.h @@ -333,14 +333,26 @@ */ MetaData allMetaData() const; + /** + * Returns a map to query config/meta-data information from. + * + * The application provides the slave with all configuration information + * relevant for the current protocol and host. + * @since 5.64 + */ + QMap mapConfig() const; + /** * Returns a configuration object to query config/meta-data information * from. * * The application provides the slave with all configuration information * relevant for the current protocol and host. + * + * TODO KF6: remove + * @deprecated since 5.64 use mapConfig instead */ - KConfigGroup *config(); + KIOCORE_DEPRECATED KConfigGroup *config(); /** * Returns an object that can translate remote filenames into proper diff --git a/src/core/slavebase.cpp b/src/core/slavebase.cpp --- a/src/core/slavebase.cpp +++ b/src/core/slavebase.cpp @@ -35,12 +35,14 @@ #include #endif +#include #include #include #include #include #include #include +#include #include #include @@ -121,6 +123,7 @@ MetaData configData; KConfig *config; KConfigGroup *configGroup; + QMap mapConfig; QUrl onHoldUrl; QElapsedTimer lastTimeout; @@ -177,19 +180,24 @@ // Reconstructs configGroup from configData and mIncomingMetaData void rebuildConfig() { - configGroup->deleteGroup(KConfigGroup::WriteConfigFlags()); + mapConfig.clear(); // mIncomingMetaData cascades over config, so we write config first, // to let it be overwritten MetaData::ConstIterator end = configData.constEnd(); for (MetaData::ConstIterator it = configData.constBegin(); it != end; ++it) { - configGroup->writeEntry(it.key(), it->toUtf8(), KConfigGroup::WriteConfigFlags()); + mapConfig.insert(it.key(), it->toUtf8()); } end = q->mIncomingMetaData.constEnd(); for (MetaData::ConstIterator it = q->mIncomingMetaData.constBegin(); it != end; ++it) { - configGroup->writeEntry(it.key(), it->toUtf8(), KConfigGroup::WriteConfigFlags()); + mapConfig.insert(it.key(), it->toUtf8()); } + + delete configGroup; + configGroup = nullptr; + delete config; + config = nullptr; } bool finalState() const @@ -294,9 +302,7 @@ d->slaveid = QString::fromUtf8(protocol) + QString::number(getpid()); d->resume = false; d->needSendCanResume = false; - d->config = new KConfig(QString(), KConfig::SimpleConfig); - // The KConfigGroup needs the KConfig to exist during its whole lifetime. - d->configGroup = new KConfigGroup(d->config, QString()); + d->mapConfig = QMap(); d->onHold = false; d->wasKilled = false; // d->processed_size = 0; @@ -427,8 +433,25 @@ return false; } +QMap SlaveBase::mapConfig() const +{ + return d->mapConfig; +} + KConfigGroup *SlaveBase::config() { + if (!d->config) { + d->config = new KConfig(QString(), KConfig::SimpleConfig); + + d->configGroup = new KConfigGroup(d->config, QString()); + + auto end = d->mapConfig.cend(); + for (auto it = d->mapConfig.cbegin(); it != end; ++it) + { + d->configGroup->writeEntry(it.key(), it->toString().toUtf8(), KConfigGroup::WriteConfigFlags()); + } + } + return d->configGroup; }