diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp index 343310322..d19bcf481 100644 --- a/src/libsync/propagateremotemkdir.cpp +++ b/src/libsync/propagateremotemkdir.cpp @@ -28,6 +28,46 @@ namespace OCC { Q_LOGGING_CATEGORY(lcPropagateRemoteMkdir, "nextcloud.sync.propagator.remotemkdir", QtInfoMsg) +PropagateRemoteMkdir::PropagateRemoteMkdir(OwncloudPropagator *propagator, const SyncFileItemPtr &item) + : PropagateItemJob(propagator, item) + , _deleteExisting(false) + , _uploadEncryptedHelper(nullptr) + , _parallelism(FullParallelism) +{ + const auto rootPath = [=]() { + const auto result = propagator->_remoteFolder; + if (result.startsWith('/')) { + return result.mid(1); + } else { + return result; + } + }(); + const auto path = _item->_file; + const auto slashPosition = path.lastIndexOf('/'); + const auto parentPath = slashPosition >= 0 ? path.left(slashPosition) : QString(); + + SyncJournalFileRecord parentRec; + bool ok = propagator->_journal->getFileRecord(parentPath, &parentRec); + if (!ok) { + done(SyncFileItem::NormalError); + return; + } + + const auto remoteParentPath = parentRec._e2eMangledName.isEmpty() ? parentPath : parentRec._e2eMangledName; + const auto absoluteRemoteParentPath = remoteParentPath.isEmpty() ? rootPath : rootPath + remoteParentPath + '/'; + const auto account = propagator->account(); + + if (account->capabilities().clientSideEncryptionAvailable() && + account->e2e()->isFolderEncrypted(absoluteRemoteParentPath)) { + _parallelism = WaitForFinished; + } +} + +PropagatorJob::JobParallelism PropagateRemoteMkdir::parallelism() +{ + return _parallelism; +} + void PropagateRemoteMkdir::start() { if (propagator()->_abortRequested.fetchAndAddRelaxed(0)) diff --git a/src/libsync/propagateremotemkdir.h b/src/libsync/propagateremotemkdir.h index 469d65bd9..43de418ee 100644 --- a/src/libsync/propagateremotemkdir.h +++ b/src/libsync/propagateremotemkdir.h @@ -30,14 +30,13 @@ class PropagateRemoteMkdir : public PropagateItemJob QPointer _job; bool _deleteExisting; PropagateUploadEncrypted *_uploadEncryptedHelper; + JobParallelism _parallelism; friend class PropagateDirectory; // So it can access the _item; public: - PropagateRemoteMkdir(OwncloudPropagator *propagator, const SyncFileItemPtr &item) - : PropagateItemJob(propagator, item) - , _deleteExisting(false) - , _uploadEncryptedHelper(nullptr) - { - } + PropagateRemoteMkdir(OwncloudPropagator *propagator, const SyncFileItemPtr &item); + + JobParallelism parallelism() override; + void start() override; void abort(PropagatorJob::AbortType abortType) override;