diff --git a/src/gui/folder.cpp b/src/gui/folder.cpp index bcb3ed70f7547..d68a2196367f9 100644 --- a/src/gui/folder.cpp +++ b/src/gui/folder.cpp @@ -1144,20 +1144,31 @@ SyncOptions Folder::initializeSyncOptions() const { SyncOptions opt; ConfigFile cfgFile; + const auto account = _accountState->account(); auto newFolderLimit = cfgFile.newBigFolderSizeLimit(); opt._newBigFolderSizeLimit = newFolderLimit.first ? newFolderLimit.second * 1000LL * 1000LL : -1; // convert from MB to B opt._confirmExternalStorage = cfgFile.confirmExternalStorage(); opt._moveFilesToTrash = cfgFile.moveToTrash(); opt._vfs = _vfs; - opt._parallelNetworkJobs = _accountState->account()->isHttp2Supported() ? 20 : 6; + + const auto capsMaxConcurrentChunkUploads = account->capabilities().maxConcurrentChunkUploads(); + opt._parallelNetworkJobs = capsMaxConcurrentChunkUploads > 0 + ? capsMaxConcurrentChunkUploads + : account->isHttp2Supported() ? 20 : 6; // Chunk V2: Size of chunks must be between 5MB and 5GB, except for the last chunk which can be smaller - opt.setMinChunkSize(cfgFile.minChunkSize()); - opt.setMaxChunkSize(cfgFile.maxChunkSize()); - opt._initialChunkSize = ::qBound(opt.minChunkSize(), cfgFile.chunkSize(), opt.maxChunkSize()); - opt._targetChunkUploadDuration = cfgFile.targetChunkUploadDuration(); + const auto cfgMinChunkSize = cfgFile.minChunkSize(); + opt.setMinChunkSize(cfgMinChunkSize); + if (const auto capsMaxChunkSize = account->capabilities().maxChunkSize(); capsMaxChunkSize) { + opt.setMaxChunkSize(capsMaxChunkSize); + opt._initialChunkSize = capsMaxChunkSize; + } else { + const auto cfgMaxChunkSize = cfgFile.maxChunkSize(); + opt.setMaxChunkSize(cfgMaxChunkSize); + opt._initialChunkSize = ::qBound(cfgMinChunkSize, cfgFile.chunkSize(), cfgMaxChunkSize); + } opt.fillFromEnvironmentVariables(); opt.verifyChunkSizes(); diff --git a/src/libsync/capabilities.cpp b/src/libsync/capabilities.cpp index f7b84716f2daa..55e63874aa7ff 100644 --- a/src/libsync/capabilities.cpp +++ b/src/libsync/capabilities.cpp @@ -245,6 +245,16 @@ bool Capabilities::chunkingNg() const return _capabilities["dav"].toMap()["chunking"].toByteArray() >= "1.0"; } +qint64 Capabilities::maxChunkSize() const +{ + return _capabilities["files"].toMap()["chunked_upload"].toMap()["max_size"].toLongLong(); +} + +int Capabilities::maxConcurrentChunkUploads() const +{ + return _capabilities["files"].toMap()["chunked_upload"].toMap()["max_parallel_count"].toInt(); +} + bool Capabilities::bulkUpload() const { return _capabilities["dav"].toMap()["bulkupload"].toByteArray() >= "1.0"; diff --git a/src/libsync/capabilities.h b/src/libsync/capabilities.h index da10854528b30..b84fa8e7db223 100644 --- a/src/libsync/capabilities.h +++ b/src/libsync/capabilities.h @@ -64,6 +64,8 @@ class OWNCLOUDSYNC_EXPORT Capabilities [[nodiscard]] bool shareResharing() const; [[nodiscard]] int shareDefaultPermissions() const; [[nodiscard]] bool chunkingNg() const; + [[nodiscard]] qint64 maxChunkSize() const; + [[nodiscard]] int maxConcurrentChunkUploads() const; [[nodiscard]] bool bulkUpload() const; [[nodiscard]] bool filesLockAvailable() const; [[nodiscard]] bool filesLockTypeAvailable() const;