Skip to content

Commit

Permalink
Bug 1691: With parallel background transfers, it is not possible to d…
Browse files Browse the repository at this point in the history
…isable size calculation, which effectively prevented parallel transfers from working

https://winscp.net/tracker/1691

Source commit: e44d90c8fd31ed2cb265dc8bf07ebc81530c17ae
  • Loading branch information
martinprikryl committed Oct 22, 2018
1 parent 885ab62 commit 92d9b96
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 15 deletions.
2 changes: 1 addition & 1 deletion source/core/CopyParam.cpp
Expand Up @@ -326,7 +326,7 @@ void __fastcall TCopyParamType::DoGetInfoStr(
{
if (DebugAlwaysTrue(!CalculateSize))
{
ADD(LoadStr(COPY_INFO_DONT_CALCULATE_SIZE), cpaIncludeMaskOnly);
ADD(LoadStr(COPY_INFO_DONT_CALCULATE_SIZE), cpaIncludeMaskOnly | cpaNoCalculateSize);
// Always false in scripting, in assembly controlled by use of FileTransferProgress
}
}
Expand Down
1 change: 1 addition & 0 deletions source/core/CopyParam.h
Expand Up @@ -26,6 +26,7 @@ const int cpaNoRemoveBOM = 0x400;
const int cpaNoPreserveTimeDirs = 0x800;
const int cpaNoResumeSupport = 0x1000;
const int cpaNoEncryptNewFiles = 0x2000;
const int cpaNoCalculateSize = 0x4000;
//---------------------------------------------------------------------------
struct TUsableCopyParamAttrs
{
Expand Down
23 changes: 14 additions & 9 deletions source/core/Terminal.cpp
Expand Up @@ -6664,22 +6664,25 @@ bool __fastcall TTerminal::CopyToRemote(
{
__int64 Size;
std::unique_ptr<TStringList> Files;
if (CanParallel(CopyParam, Params, ParallelOperation) &&
!CopyParam->ClearArchive)
bool ACanParallel =
CanParallel(CopyParam, Params, ParallelOperation) &&
!CopyParam->ClearArchive;
if (ACanParallel)
{
Files.reset(new TStringList());
Files->OwnsObjects = true;
}
bool CalculatedSize;
if ((CopyParam->Size >= 0) &&
DebugAlwaysTrue(Files.get() == NULL)) // Size is set for sync only and we never use parallel transfer for sync
DebugAlwaysTrue(!ACanParallel)) // Size is set for sync only and we never use parallel transfer for sync
{
Size = CopyParam->Size;
CalculatedSize = true;
}
else
{
CalculatedSize = CalculateLocalFilesSize(FilesToCopy, Size, CopyParam, CopyParam->CalculateSize, Files.get(), NULL);
bool CalculateSize = ACanParallel || CopyParam->CalculateSize;
CalculatedSize = CalculateLocalFilesSize(FilesToCopy, Size, CopyParam, CalculateSize, Files.get(), NULL);
}

FLastProgressLogged = GetTickCount();
Expand Down Expand Up @@ -6709,7 +6712,7 @@ bool __fastcall TTerminal::CopyToRemote(
BeginTransaction();
try
{
bool Parallel = CalculatedSize && (Files.get() != NULL);
bool Parallel = ACanParallel && CalculatedSize;
LogTotalTransferDetails(TargetDir, CopyParam, &OperationProgress, Parallel, Files.get());

if (Parallel)
Expand Down Expand Up @@ -7112,14 +7115,15 @@ bool __fastcall TTerminal::CopyToLocal(
TFileOperationProgressType OperationProgress(&DoProgress, &DoFinished);

std::unique_ptr<TStringList> Files;
if (CanParallel(CopyParam, Params, ParallelOperation))
bool ACanParallel = CanParallel(CopyParam, Params, ParallelOperation);
if (ACanParallel)
{
Files.reset(new TStringList());
Files->OwnsObjects = true;
}

if ((CopyParam->Size >= 0) &&
DebugAlwaysTrue(Files.get() == NULL)) // Size is set for sync only and we never use parallel transfer for sync
DebugAlwaysTrue(!ACanParallel)) // Size is set for sync only and we never use parallel transfer for sync
{
TotalSize = CopyParam->Size;
TotalSizeKnown = true;
Expand All @@ -7131,7 +7135,8 @@ bool __fastcall TTerminal::CopyToLocal(
{
TCalculateSizeStats Stats;
Stats.FoundFiles = Files.get();
if (CalculateFilesSize(FilesToCopy, TotalSize, csIgnoreErrors, CopyParam, CopyParam->CalculateSize, Stats))
bool CalculateSize = ACanParallel || CopyParam->CalculateSize;
if (CalculateFilesSize(FilesToCopy, TotalSize, csIgnoreErrors, CopyParam, CalculateSize, Stats))
{
TotalSizeKnown = true;
}
Expand Down Expand Up @@ -7166,7 +7171,7 @@ bool __fastcall TTerminal::CopyToLocal(
{
try
{
bool Parallel = TotalSizeKnown && (Files.get() != NULL);
bool Parallel = ACanParallel && TotalSizeKnown;
LogTotalTransferDetails(TargetDir, CopyParam, &OperationProgress, Parallel, Files.get());

if (Parallel)
Expand Down
15 changes: 10 additions & 5 deletions source/forms/Copy.cpp
Expand Up @@ -314,6 +314,11 @@ UnicodeString __fastcall TCopyDialog::GetDirectory()
return Result;
}
//---------------------------------------------------------------------------
int __fastcall TCopyDialog::ActualCopyParamAttrs()
{
return FCopyParamAttrs | FLAGMASK(QueueCheck2->Checked && WinConfiguration->DefaultCopyParam.QueueParallel, cpaNoCalculateSize);
}
//---------------------------------------------------------------------------
void __fastcall TCopyDialog::UpdateControls()
{
if (!FToRemote && FLAGSET(FOptions, coAllowRemoteTransfer))
Expand All @@ -329,7 +334,7 @@ void __fastcall TCopyDialog::UpdateControls()
}
}

UnicodeString InfoStr = FCopyParams.GetInfoStr(L"; ", FCopyParamAttrs);
UnicodeString InfoStr = FCopyParams.GetInfoStr(L"; ", ActualCopyParamAttrs());
SetLabelHintPopup(CopyParamLabel, InfoStr);

bool RemoteTransfer = FLAGSET(FOutputOptions, cooRemoteTransfer);
Expand Down Expand Up @@ -477,7 +482,7 @@ void __fastcall TCopyDialog::TransferSettingsButtonClick(TObject * /*Sender*/)
void __fastcall TCopyDialog::GenerateCode()
{
TFilesSelected FilesSelected = FLAGSET(FOptions, coAllFiles) ? fsAll : fsList;
DoGenerateTransferCodeDialog(FToRemote, FMove, FCopyParamAttrs, FSessionData, FilesSelected, FFileList, Directory, Params);
DoGenerateTransferCodeDialog(FToRemote, FMove, ActualCopyParamAttrs(), FSessionData, FilesSelected, FFileList, Directory, Params);
}
//---------------------------------------------------------------------------
void __fastcall TCopyDialog::CopyParamClick(TObject * Sender)
Expand All @@ -486,7 +491,7 @@ void __fastcall TCopyDialog::CopyParamClick(TObject * Sender)
// so that they are preserved when assigning back later
TGUICopyParamType Param = Params;
bool PrevSaveSettings = FSaveSettings;
int Result = CopyParamListPopupClick(Sender, Param, FPreset, FCopyParamAttrs, &FSaveSettings);
int Result = CopyParamListPopupClick(Sender, Param, FPreset, ActualCopyParamAttrs(), &FSaveSettings);
if (Result < 0)
{
if (DebugAlwaysTrue(Result == -cplGenerateCode))
Expand Down Expand Up @@ -521,7 +526,7 @@ void __fastcall TCopyDialog::CopyParamGroupClick(TObject * /*Sender*/)
{
if (CopyParamGroup->Enabled)
{
if (DoCopyParamCustomDialog(FCopyParams, FCopyParamAttrs))
if (DoCopyParamCustomDialog(FCopyParams, ActualCopyParamAttrs()))
{
UpdateControls();
}
Expand All @@ -546,7 +551,7 @@ void __fastcall TCopyDialog::CopyParamListPopup(TRect R, int AdditionalOptions)
FLAGCLEAR(FOptions, coDisableSaveSettings) && !RemoteTransfer,
cplSaveSettings) |
FLAGMASK(FLAGCLEAR(FOutputOptions, cooRemoteTransfer) && FLAGCLEAR(FOptions, coTemp), cplGenerateCode),
FCopyParamAttrs,
ActualCopyParamAttrs(),
FSaveSettings);
}
//---------------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions source/forms/Copy.h
Expand Up @@ -75,6 +75,7 @@ class TCopyDialog : public TForm
void __fastcall AdjustTransferControls();
bool __fastcall RemotePaths();
void __fastcall CopyParamListPopup(TRect R, int AdditionalOptions);
int __fastcall ActualCopyParamAttrs();
public:
__fastcall TCopyDialog(
TComponent* Owner, bool ToRemote, bool Move, TStrings * FileList, int Options,
Expand Down
2 changes: 2 additions & 0 deletions source/forms/CopyParams.cpp
Expand Up @@ -210,6 +210,8 @@ void __fastcall TCopyParamsFrame::UpdateControls()
FLAGCLEAR(CopyParamAttrs, cpaNoPreserveTimeDirs) &&
FLAGCLEAR(CopyParamAttrs, cpaIncludeMaskOnly) && Enabled &&
PreserveTimeCheck->Checked);
EnableControl(CommonCalculateSizeCheck,
FLAGCLEAR(CopyParamAttrs, cpaNoCalculateSize) && FLAGCLEAR(CopyParamAttrs, cpaIncludeMaskOnly) && Enabled);
EnableControl(ChangeCaseGroup, FLAGCLEAR(CopyParamAttrs, cpaIncludeMaskOnly) && Enabled);
EnableControl(IgnorePermErrorsCheck,
((PreserveRightsCheck->Enabled && PreserveRightsCheck->Checked) ||
Expand Down

0 comments on commit 92d9b96

Please sign in to comment.