//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::Suspend() { assert(!Suspended); Suspended = true; FSuspendTime = GetTickCount(); DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::AddTransfered(__int64 ASize, bool AddToTotals) { TransferedSize += ASize; if (TransferedSize > TransferSize) { // this can happen with SFTP when downloading file that // grows while being downloaded if (TotalSizeSet) { TotalSize += (TransferedSize - TransferSize); } TransferSize = TransferedSize; } if (AddToTotals) { TotalTransfered += ASize; unsigned long Ticks = GetTickCount(); if (FTicks.empty() || (FTicks.back() > Ticks) || // ticks wrap after 49.7 days ((Ticks - FTicks.back()) >= MSecsPerSec)) { FTicks.push_back(Ticks); FTotalTransferredThen.push_back(TotalTransfered); } if (FTicks.size() > 10) { FTicks.erase(FTicks.begin()); FTotalTransferredThen.erase(FTotalTransferredThen.begin()); } } DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::Start(TFileOperation AOperation, TOperationSide ASide, int ACount, bool ATemp, const UnicodeString ADirectory, unsigned long ACPSLimit) { Clear(); Operation = AOperation; Side = ASide; Count = ACount; InProgress = true; Cancel = csContinue; Directory = ADirectory; Temp = ATemp; CPSLimit = ACPSLimit; try { DoProgress(); } catch (...) { // connection can be lost during progress callbacks ClearTransfer(); InProgress = false; throw; } }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::Stop() { // added to include remaining bytes to TotalSkipped, in case // the progress happens to update before closing ClearTransfer(); InProgress = false; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetFile(UnicodeString AFileName, bool AFileInProgress) { FileName = AFileName; FileInProgress = AFileInProgress; ClearTransfer(); FFileStartTime = Now(); DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::AddLocallyUsed(__int64 ASize) { LocallyUsed += ASize; if (LocallyUsed > LocalSize) { LocalSize = LocallyUsed; } DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::ChangeTransferSize(__int64 ASize) { // reflect change on file size (due to text transfer mode conversion particulary) // on total transfer size if (TotalSizeSet) { TotalSize += (ASize - TransferSize); } TransferSize = ASize; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::Finish(UnicodeString FileName, bool Success, TOnceDoneOperation & OnceDoneOperation) { assert(InProgress); FOnFinished(Operation, Side, Temp, FileName, /* TODO : There wasn't 'Success' condition, was it by mistake or by purpose? */ Success && (Cancel == csContinue), OnceDoneOperation); FFilesFinished++; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetFile(UnicodeString AFileName, bool AFileInProgress) { FullFileName = AFileName; if (Side == osRemote) { // historically set were passing filename-only for remote site operations, // now we need to collect a full paths, so we pass in full path, // but still want to have filename-only in FileName AFileName = UnixExtractFileName(AFileName); } FileName = AFileName; FileInProgress = AFileInProgress; ClearTransfer(); FFileStartTime = Now(); DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::Resume() { assert(Suspended); Suspended = false; // shift timestamps for CPS calculation in advance // by the time the progress was suspended unsigned long Stopped = (GetTickCount() - FSuspendTime); size_t i = 0; while (i < FTicks.size()) { FTicks[i] += Stopped; ++i; } DoProgress(); }
//--------------------------------------------------------------------------- unsigned long __fastcall TFileOperationProgressType::AdjustToCPSLimit( unsigned long Size) { SetSpeedCounters(); if (CPSLimit > 0) { // we must not return 0, hence, if we reach zero, // we wait until the next second do { unsigned int Second = (GetTickCount() / MSecsPerSec); if (Second != FLastSecond) { FRemainingCPS = CPSLimit; FLastSecond = Second; } if (FRemainingCPS == 0) { SleepEx(100, true); DoProgress(); } } while ((CPSLimit > 0) && (FRemainingCPS == 0)); // CPSLimit may have been dropped in DoProgress if (CPSLimit > 0) { if (FRemainingCPS < Size) { Size = FRemainingCPS; } FRemainingCPS -= Size; } } return Size; }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetAsciiTransfer(bool AAsciiTransfer) { AsciiTransfer = AAsciiTransfer; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetTransferSize(__int64 ASize) { TransferSize = ASize; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetTotalSize(__int64 ASize) { TotalSize = ASize; TotalSizeSet = true; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetLocalSize(__int64 ASize) { LocalSize = ASize; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetResumeStatus(TResumeStatus AResumeStatus) { ResumeStatus = AResumeStatus; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::AddSkippedFileSize(__int64 ASize) { TotalSkipped += ASize; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::SetFileInProgress() { assert(!FileInProgress); FileInProgress = true; DoProgress(); }
//--------------------------------------------------------------------------- void __fastcall TFileOperationProgressType::Progress() { DoProgress(); }