* new placeholder shall supersede, for rename-replace actions with new downloads,
* for example.
*/
- virtual void convertToPlaceholder(
+ virtual Result<void, QString> convertToPlaceholder(
const QString &filename,
const SyncFileItem &item,
const QString &replacesFile = QString()) = 0;
Result<void, QString> updateMetadata(const QString &, time_t, qint64, const QByteArray &) override { return {}; }
Result<void, QString> createPlaceholder(const SyncFileItem &) override { return {}; }
Result<void, QString> dehydratePlaceholder(const SyncFileItem &) override { return {}; }
- void convertToPlaceholder(const QString &, const SyncFileItem &, const QString &) override {}
+ Result<void, QString> convertToPlaceholder(const QString &, const SyncFileItem &, const QString &) override { return {}; }
bool needsMetadataUpdate(const SyncFileItem &) override { return false; }
bool isDehydratedPlaceholder(const QString &) override { return false; }
bool OwncloudPropagator::updateMetadata(const SyncFileItem &item, const QString &localFolderPath, SyncJournalDb &journal, Vfs &vfs)
{
QString fsPath = localFolderPath + item.destination();
- vfs.convertToPlaceholder(fsPath, item);
+ if (!vfs.convertToPlaceholder(fsPath, item)) {
+ return false;
+ }
auto record = item.toSyncJournalFileRecordWithInode(fsPath);
return journal.setFileRecord(record);
}
preserveGroupOwnership(_tmpFile.fileName(), existingFile);
// Make the file a hydrated placeholder if possible
- propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, fn);
+ const auto result = propagator()->syncOptions()._vfs->convertToPlaceholder(_tmpFile.fileName(), *_item, fn);
+ if (!result) {
+ done(SyncFileItem::NormalError, result.error());
+ return;
+ }
}
// Apply the remote permissions
// Ensure it's a placeholder file on disk
if (item->_type == ItemTypeFile) {
- _syncOptions._vfs->convertToPlaceholder(filePath, *item);
+ const auto result = _syncOptions._vfs->convertToPlaceholder(filePath, *item);
+ if (!result) {
+ item->_instruction = CSYNC_INSTRUCTION_ERROR;
+ item->_errorString = tr("Could not update file : %1").arg(result.error());
+ return;
+ }
}
// Update on-disk virtual file metadata
return {};
}
-void VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
+Result<void, QString> VfsCfApi::convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile)
{
const auto localPath = QDir::toNativeSeparators(filename);
const auto replacesPath = QDir::toNativeSeparators(replacesFile);
const auto handle = cfapi::handleForPath(localPath);
if (cfapi::findPlaceholderInfo(handle)) {
- cfapi::updatePlaceholderInfo(handle, item._modtime, item._size, item._fileId, replacesPath);
+ return cfapi::updatePlaceholderInfo(handle, item._modtime, item._size, item._fileId, replacesPath);
} else {
- cfapi::convertToPlaceholder(handle, item._modtime, item._size, item._fileId, replacesPath);
+ return cfapi::convertToPlaceholder(handle, item._modtime, item._size, item._fileId, replacesPath);
}
}
Result<void, QString> createPlaceholder(const SyncFileItem &item) override;
Result<void, QString> dehydratePlaceholder(const SyncFileItem &item) override;
- void convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile) override;
+ Result<void, QString> convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &replacesFile) override;
bool needsMetadataUpdate(const SyncFileItem &) override;
bool isDehydratedPlaceholder(const QString &filePath) override;
return {};
}
-void VfsSuffix::convertToPlaceholder(const QString &, const SyncFileItem &, const QString &)
+Result<void, QString> VfsSuffix::convertToPlaceholder(const QString &, const SyncFileItem &, const QString &)
{
// Nothing necessary
+ return {};
}
bool VfsSuffix::isDehydratedPlaceholder(const QString &filePath)
Result<void, QString> createPlaceholder(const SyncFileItem &item) override;
Result<void, QString> dehydratePlaceholder(const SyncFileItem &item) override;
- void convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &) override;
+ Result<void, QString> convertToPlaceholder(const QString &filename, const SyncFileItem &item, const QString &) override;
bool needsMetadataUpdate(const SyncFileItem &) override { return false; }
bool isDehydratedPlaceholder(const QString &filePath) override;