diff --git a/src/engine/transaction.h b/src/engine/transaction.h --- a/src/engine/transaction.h +++ b/src/engine/transaction.h @@ -63,6 +63,7 @@ * \p path into an id. */ quint64 documentId(const QByteArray& path) const; + QVector childrenDocumentId(quint64 parentId) const; QByteArray documentData(quint64 id) const; DocumentTimeDB::TimeInfo documentTimeInfo(quint64 id) const; diff --git a/src/engine/transaction.cpp b/src/engine/transaction.cpp --- a/src/engine/transaction.cpp +++ b/src/engine/transaction.cpp @@ -127,6 +127,15 @@ return parentId; } +QVector Transaction::childrenDocumentId(quint64 parentId) const +{ + DocumentUrlDB docUrlDB(m_dbis.idTreeDbi, m_dbis.idFilenameDbi, m_txn); + + const QVector children = docUrlDB.getChildren(parentId); + + return children; +} + DocumentTimeDB::TimeInfo Transaction::documentTimeInfo(quint64 id) const { Q_ASSERT(m_txn); diff --git a/src/file/metadatamover.cpp b/src/file/metadatamover.cpp --- a/src/file/metadatamover.cpp +++ b/src/file/metadatamover.cpp @@ -25,6 +25,8 @@ #include "baloodebug.h" #include +#include +#include using namespace Baloo; @@ -40,22 +42,46 @@ } +static void buildRecursiveList(quint64 parentId, QList &fileList, Transaction &tr) +{ + const auto childrenIds = tr.childrenDocumentId(parentId); + + for (const auto &oneChildren : childrenIds) { + fileList.push_back(QFile::decodeName(tr.documentUrl(oneChildren))); + buildRecursiveList(oneChildren, fileList, tr); + } +} + void MetadataMover::moveFileMetadata(const QString& from, const QString& to) { // qCDebug(BALOO) << from << to; Q_ASSERT(!from.isEmpty() && from != QLatin1String("/")); Q_ASSERT(!to.isEmpty() && to != QLatin1String("/")); Transaction tr(m_db, Transaction::ReadWrite); + quint64 id = tr.documentId(QFile::encodeName(from)); + QList fileList; + if (id) { + buildRecursiveList(id, fileList, tr); + } + // We do NOT get deleted messages for overwritten files! Thus, we // have to remove all metadata for overwritten files first. removeMetadata(&tr, to); // and finally update the old statements updateMetadata(&tr, from, to); tr.commit(); + + QDBusMessage message = QDBusMessage::createSignal(QStringLiteral("/files"), + QStringLiteral("org.kde"), + QStringLiteral("moved")); + + message.setArguments({{fileList}, from, to}); + + QDBusConnection::sessionBus().send(message); } void MetadataMover::removeFileMetadata(const QString& file) @@ -77,13 +103,24 @@ return; } + QList fileList; + buildRecursiveList(id, fileList, *tr); + bool isDir = url.endsWith('/'); if (!isDir) { tr->removeDocument(id); } else { tr->removeRecursively(id); } + QDBusMessage message = QDBusMessage::createSignal(QStringLiteral("/files"), + QStringLiteral("org.kde"), + QStringLiteral("removed")); + + message.setArguments({{fileList}}); + + QDBusConnection::sessionBus().send(message); + Q_EMIT fileRemoved(url); }