diff --git a/src/common/vfs.h b/src/common/vfs.h index 183c3013f9..d0f4e28fc0 100644 --- a/src/common/vfs.h +++ b/src/common/vfs.h @@ -179,7 +179,7 @@ public: * If the remote metadata changes, the local placeholder's metadata should possibly * change as well. */ - [[nodiscard]] virtual Result updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) = 0; + [[nodiscard]] virtual OCC::Result updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) = 0; [[nodiscard]] virtual Result updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) = 0; @@ -320,7 +320,7 @@ public: [[nodiscard]] bool socketApiPinStateActionsShown() const override { return false; } [[nodiscard]] bool isHydrating() const override { return false; } - Result updateMetadata(const QString &, time_t, qint64, const QByteArray &) override { return {}; } + OCC::Result updateMetadata(const SyncFileItem &, const QString &, const QString &) override { return {OCC::Vfs::ConvertToPlaceholderResult::Ok}; } Result updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override {Q_UNUSED(filePath) Q_UNUSED(fileId) return {QString{}};} [[nodiscard]] bool isPlaceHolderInSync(const QString &filePath) const override { Q_UNUSED(filePath) return true; } Result createPlaceholder(const SyncFileItem &) override { return {}; } diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 66268109fd..7b4b69f4f9 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -396,7 +396,7 @@ void OCC::SyncEngine::slotItemDiscovered(const OCC::SyncFileItemPtr &item) // Update on-disk virtual file metadata if (modificationHappened && item->_type == ItemTypeVirtualFile) { - auto r = _syncOptions._vfs->updateMetadata(filePath, item->_modtime, item->_size, item->_fileId); + auto r = _syncOptions._vfs->updateMetadata(*item, filePath, {}); if (!r) { item->_status = SyncFileItem::Status::NormalError; item->_instruction = CSYNC_INSTRUCTION_ERROR; diff --git a/src/libsync/vfs/cfapi/cfapiwrapper.cpp b/src/libsync/vfs/cfapi/cfapiwrapper.cpp index 022997302d..5620c7f3ed 100644 --- a/src/libsync/vfs/cfapi/cfapiwrapper.cpp +++ b/src/libsync/vfs/cfapi/cfapiwrapper.cpp @@ -327,7 +327,6 @@ OCC::Result updatePlaceholderStat OCC::Utility::UnixTimeToLargeIntegerFiletime(modtime, &metadata.BasicInfo.LastAccessTime); OCC::Utility::UnixTimeToLargeIntegerFiletime(modtime, &metadata.BasicInfo.ChangeTime); - OCC::CfApiWrapper::setPinState(path, OCC::PinState::Unspecified, OCC::CfApiWrapper::SetPinRecurseMode::NoRecurse); qCInfo(lcCfApiWrapper) << "updatePlaceholderState" << path << modtime; const qint64 result = diff --git a/src/libsync/vfs/cfapi/vfs_cfapi.cpp b/src/libsync/vfs/cfapi/vfs_cfapi.cpp index f5ee43c5e3..8b3757ef58 100644 --- a/src/libsync/vfs/cfapi/vfs_cfapi.cpp +++ b/src/libsync/vfs/cfapi/vfs_cfapi.cpp @@ -177,19 +177,19 @@ bool VfsCfApi::isHydrating() const return !d->hydrationJobs.isEmpty(); } -Result VfsCfApi::updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) +OCC::Result VfsCfApi::updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) { const auto localPath = QDir::toNativeSeparators(filePath); - if (cfapi::handleForPath(localPath)) { - auto result = cfapi::updatePlaceholderInfo(localPath, modtime, size, fileId); - if (result) { - return {}; - } else { - return result.error(); - } + const auto replacesPath = QDir::toNativeSeparators(replacesFile); + + if (syncItem._type == ItemTypeVirtualFileDehydration) { + return cfapi::dehydratePlaceholder(localPath, syncItem._modtime, syncItem._size, syncItem._fileId); } else { - qCWarning(lcCfApi) << "Couldn't update metadata for non existing file" << localPath; - return {QStringLiteral("Couldn't update metadata")}; + if (cfapi::findPlaceholderInfo(localPath)) { + return cfapi::updatePlaceholderInfo(localPath, syncItem._modtime, syncItem._size, syncItem._fileId, replacesPath); + } else { + return cfapi::convertToPlaceholder(localPath, syncItem._modtime, syncItem._size, syncItem._fileId, replacesPath); + } } } diff --git a/src/libsync/vfs/cfapi/vfs_cfapi.h b/src/libsync/vfs/cfapi/vfs_cfapi.h index c6bd37bb5f..91cdabe87e 100644 --- a/src/libsync/vfs/cfapi/vfs_cfapi.h +++ b/src/libsync/vfs/cfapi/vfs_cfapi.h @@ -32,7 +32,7 @@ public: bool socketApiPinStateActionsShown() const override; bool isHydrating() const override; - Result updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override; + OCC::Result updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) override; Result updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override; diff --git a/src/libsync/vfs/suffix/vfs_suffix.cpp b/src/libsync/vfs/suffix/vfs_suffix.cpp index d010a056e7..7f18412bfb 100644 --- a/src/libsync/vfs/suffix/vfs_suffix.cpp +++ b/src/libsync/vfs/suffix/vfs_suffix.cpp @@ -66,15 +66,17 @@ bool VfsSuffix::isHydrating() const return false; } -Result VfsSuffix::updateMetadata(const QString &filePath, time_t modtime, qint64, const QByteArray &) +OCC::Result VfsSuffix::updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) { - if (modtime <= 0) { + Q_UNUSED(replacesFile) + + if (syncItem._modtime <= 0) { return {tr("Error updating metadata due to invalid modification time")}; } - qCDebug(lcVfsSuffix()) << "setModTime" << filePath << modtime; - FileSystem::setModTime(filePath, modtime); - return {}; + qCDebug(lcVfsSuffix()) << "setModTime" << filePath << syncItem._modtime; + FileSystem::setModTime(filePath, syncItem._modtime); + return {OCC::Vfs::ConvertToPlaceholderResult::Ok}; } Result VfsSuffix::createPlaceholder(const SyncFileItem &item) diff --git a/src/libsync/vfs/suffix/vfs_suffix.h b/src/libsync/vfs/suffix/vfs_suffix.h index e28484ba03..0c0e5de7e4 100644 --- a/src/libsync/vfs/suffix/vfs_suffix.h +++ b/src/libsync/vfs/suffix/vfs_suffix.h @@ -30,7 +30,7 @@ public: [[nodiscard]] bool socketApiPinStateActionsShown() const override { return true; } [[nodiscard]] bool isHydrating() const override; - Result updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override; + OCC::Result updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) override; Result updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override {Q_UNUSED(filePath) Q_UNUSED(fileId) return {QString{}};} [[nodiscard]] bool isPlaceHolderInSync(const QString &filePath) const override { Q_UNUSED(filePath) return true; } diff --git a/src/libsync/vfs/xattr/vfs_xattr.cpp b/src/libsync/vfs/xattr/vfs_xattr.cpp index 4e46dd83ee..c6315b82ac 100644 --- a/src/libsync/vfs/xattr/vfs_xattr.cpp +++ b/src/libsync/vfs/xattr/vfs_xattr.cpp @@ -60,15 +60,17 @@ bool VfsXAttr::isHydrating() const return false; } -Result VfsXAttr::updateMetadata(const QString &filePath, time_t modtime, qint64, const QByteArray &) +OCC::Result VfsXAttr::updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) { - if (modtime <= 0) { + Q_UNUSED(replacesFile) + + if (syncItem._modtime <= 0) { return {tr("Error updating metadata due to invalid modification time")}; } - qCDebug(lcVfsXAttr()) << "setModTime" << filePath << modtime; - FileSystem::setModTime(filePath, modtime); - return {}; + qCDebug(lcVfsXAttr()) << "setModTime" << filePath << syncItem._modtime; + FileSystem::setModTime(filePath, syncItem._modtime); + return {OCC::Vfs::ConvertToPlaceholderResult::Ok}; } Result VfsXAttr::createPlaceholder(const SyncFileItem &item) diff --git a/src/libsync/vfs/xattr/vfs_xattr.h b/src/libsync/vfs/xattr/vfs_xattr.h index e3f4f3c3dc..382f4d1d81 100644 --- a/src/libsync/vfs/xattr/vfs_xattr.h +++ b/src/libsync/vfs/xattr/vfs_xattr.h @@ -29,7 +29,7 @@ public: [[nodiscard]] bool socketApiPinStateActionsShown() const override; [[nodiscard]] bool isHydrating() const override; - Result updateMetadata(const QString &filePath, time_t modtime, qint64 size, const QByteArray &fileId) override; + OCC::Result updateMetadata(const SyncFileItem &syncItem, const QString &filePath, const QString &replacesFile) override; Result updatePlaceholderMarkInSync(const QString &filePath, const QByteArray &fileId) override {Q_UNUSED(filePath) Q_UNUSED(fileId) return {QString{}};} [[nodiscard]] bool isPlaceHolderInSync(const QString &filePath) const override { Q_UNUSED(filePath) return true; }