1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/source/core/FileOperationProgress.h
Martin Prikryl 1d9fe8c955 Changing compiler to Clang/bcc32c
- regarding the ILINK_LibraryPath for Cfg_1_Win32 (Debug):
Win32\Debug (not only Win32c\Debug) needs to be before Win32c\Release, as win32c does not include debug builds of Pascal code - so without that VCL debugging won't work
- IDE insist on adding CC_Suffix to all projects once switched to Clang, although it is only used in WinSCP.cbproj
- UNICODE define: Not needed for build (it's implicit), but CodeInsight does not know it it somehow

Source commit: da06d73eb86caff5ca9cac0185bed54da0da8f07
2025-09-04 07:53:01 +02:00

263 lines
10 KiB
C++

//---------------------------------------------------------------------------
#ifndef FileOperationProgressH
#define FileOperationProgressH
//---------------------------------------------------------------------------
#include "Configuration.h"
#include "CopyParam.h"
#include "Exceptions.h"
#include <vector>
//---------------------------------------------------------------------------
class TFileOperationProgressType;
enum TFileOperation { foNone, foCopy, foMove, foDelete, foSetProperties,
foRename, foCustomCommand, foCalculateSize, foRemoteMove, foRemoteCopy,
foGetProperties, foCalculateChecksum, foLock, foUnlock };
// csCancelTransfer and csRemoteAbort are used with SCP only
enum TCancelStatus { csContinue = 0, csCancelFile, csCancel, csCancelTransfer, csRemoteAbort };
enum TBatchOverwrite { boNo, boAll, boNone, boOlder, boAlternateResume, boAppend, boResume };
typedef void __fastcall (__closure *TFileOperationProgressEvent)
(TFileOperationProgressType & ProgressData);
typedef void __fastcall (__closure *TFileOperationFinished)
(TFileOperation Operation, TOperationSide Side, bool Temp,
const UnicodeString & FileName, bool Success, bool NotCancelled, TOnceDoneOperation & OnceDoneOperation);
//---------------------------------------------------------------------------
class TFileOperationStatistics
{
public:
TFileOperationStatistics();
int FilesUploaded;
int FilesDownloaded;
int FilesDeletedLocal;
int FilesDeletedRemote;
__int64 TotalUploaded;
__int64 TotalDownloaded;
};
//---------------------------------------------------------------------------
class TFileOperationProgressType
{
public:
class TPersistence
{
friend class TFileOperationProgressType;
public:
TPersistence();
__property TFileOperationStatistics * Statistics = { read = FStatistics, write = FStatistics };
private:
void Clear(bool Batch, bool Speed);
TDateTime StartTime;
TBatchOverwrite BatchOverwrite;
bool SkipToAll;
unsigned long CPSLimit;
bool CounterSet;
std::vector<unsigned long> Ticks;
std::vector<__int64> TotalTransferredThen;
TOperationSide Side;
__int64 TotalTransferred;
TFileOperationStatistics * FStatistics;
};
private:
TFileOperation FOperation;
UnicodeString FFileName;
UnicodeString FFullFileName;
UnicodeString FDirectory;
bool FAsciiTransfer;
bool FTransferringFile;
bool FTemp;
__int64 FLocalSize;
__int64 FLocallyUsed;
__int64 FTransferSize;
__int64 FTransferredSize;
__int64 FSkippedSize;
bool FInProgress;
bool FDone;
bool FFileInProgress;
TCancelStatus FCancel;
int FCount;
__int64 FTotalTransferBase;
__int64 FTotalSkipped;
__int64 FTotalSize;
bool FTotalSizeSet;
bool FSuspended;
bool FRestored;
TFileOperationProgressType * FParent;
// when it was last time suspended (to calculate suspend time in Resume())
unsigned int FSuspendTime;
// when current file was started being transferred
TDateTime FFileStartTime;
int FFilesFinished;
int FFilesFinishedSuccessfully;
TFileOperationProgressEvent FOnProgress;
TFileOperationFinished FOnFinished;
bool FReset;
unsigned int FLastSecond;
unsigned long FRemainingCPS;
TOnceDoneOperation FInitialOnceDoneOperation;
TPersistence FPersistence;
TCriticalSection * FSection;
TCriticalSection * FUserSelectionsSection;
__int64 __fastcall GetTotalTransferred();
__int64 __fastcall GetOperationTransferred() const;
__int64 __fastcall GetTotalSize();
unsigned long __fastcall GetCPSLimit();
TBatchOverwrite __fastcall GetBatchOverwrite();
bool __fastcall GetSkipToAll();
TDateTime __fastcall GetStartTime() const { return FPersistence.StartTime; }
TOperationSide __fastcall GetSide() const { return FPersistence.Side; }
protected:
void __fastcall ClearTransfer();
inline void __fastcall DoProgress();
int __fastcall OperationProgress() const;
void __fastcall AddTransferredToTotals(__int64 ASize);
void __fastcall AddSkipped(__int64 ASize);
void __fastcall AddTotalSize(__int64 ASize);
void __fastcall RollbackTransferFromTotals(__int64 ATransferredSize, __int64 ASkippedSize);
unsigned int __fastcall GetCPS();
void __fastcall Init();
static bool __fastcall PassCancelToParent(TCancelStatus ACancel);
void __fastcall DoClear(bool Batch, bool Speed);
public:
// common data
__property TFileOperation Operation = { read = FOperation };
// on what side if operation being processed (local/remote), source of copy
__property TOperationSide Side = { read = GetSide };
__property int Count = { read = FCount };
__property UnicodeString FileName = { read = FFileName };
__property UnicodeString FullFileName = { read = FFullFileName };
__property UnicodeString Directory = { read = FDirectory };
__property bool AsciiTransfer = { read = FAsciiTransfer };
// Can be true with SCP protocol only
__property bool TransferringFile = { read = FTransferringFile };
__property bool Temp = { read = FTemp };
// file size to read/write
__property __int64 LocalSize = { read = FLocalSize };
__property __int64 LocallyUsed = { read = FLocallyUsed };
__property __int64 TransferSize = { read = FTransferSize };
__property __int64 TransferredSize = { read = FTransferredSize };
__property __int64 SkippedSize = { read = FSkippedSize };
__property bool InProgress = { read = FInProgress };
__property bool Done = { read = FDone };
__property bool FileInProgress = { read = FFileInProgress };
__property TCancelStatus Cancel = { read = GetCancel };
// when operation started
__property TDateTime StartTime = { read = GetStartTime };
// bytes transferred
__property __int64 TotalTransferred = { read = GetTotalTransferred };
__property __int64 OperationTransferred = { read = GetOperationTransferred };
__property __int64 TotalSize = { read = GetTotalSize };
__property int FilesFinishedSuccessfully = { read = FFilesFinishedSuccessfully };
__property TOnceDoneOperation InitialOnceDoneOperation = { read = FInitialOnceDoneOperation };
__property TBatchOverwrite BatchOverwrite = { read = GetBatchOverwrite };
__property bool SkipToAll = { read = GetSkipToAll };
__property unsigned long CPSLimit = { read = GetCPSLimit };
__property bool TotalSizeSet = { read = FTotalSizeSet };
__property bool Suspended = { read = FSuspended };
__fastcall TFileOperationProgressType();
__fastcall TFileOperationProgressType(
TFileOperationProgressEvent AOnProgress, TFileOperationFinished AOnFinished,
TFileOperationProgressType * Parent = NULL);
__fastcall ~TFileOperationProgressType();
TFileOperationProgressType & operator =(const TFileOperationProgressType &) = default;
void __fastcall Assign(const TFileOperationProgressType & Other);
void __fastcall AssignButKeepSuspendState(const TFileOperationProgressType & Other);
void __fastcall AddLocallyUsed(__int64 ASize);
void __fastcall AddTransferred(__int64 ASize, bool AddToTotals = true);
void __fastcall AddResumed(__int64 ASize);
void __fastcall AddSkippedFileSize(__int64 ASize);
void __fastcall Clear();
unsigned int __fastcall CPS();
void __fastcall Finish(UnicodeString FileName, bool Success,
TOnceDoneOperation & OnceDoneOperation);
void __fastcall Succeeded(int Count = 1);
void __fastcall Progress();
unsigned long __fastcall LocalBlockSize();
bool __fastcall IsLocallyDone();
bool IsTransferDone();
bool IsTransferDoneChecked();
void __fastcall SetFile(UnicodeString AFileName, bool AFileInProgress = true);
void __fastcall SetFileInProgress();
unsigned long __fastcall TransferBlockSize();
unsigned long __fastcall AdjustToCPSLimit(unsigned long Size);
void __fastcall ThrottleToCPSLimit(unsigned long Size);
static unsigned long __fastcall StaticBlockSize();
void __fastcall Reset();
void __fastcall Resume();
void __fastcall SetLocalSize(__int64 ASize);
void __fastcall SetAsciiTransfer(bool AAsciiTransfer);
void __fastcall SetTransferSize(__int64 ASize);
void __fastcall ChangeTransferSize(__int64 ASize);
void __fastcall RollbackTransfer();
void __fastcall SetTotalSize(__int64 ASize);
void __fastcall Start(TFileOperation AOperation, TOperationSide ASide, int ACount);
void __fastcall Start(TFileOperation AOperation,
TOperationSide ASide, int ACount, bool ATemp, const UnicodeString ADirectory,
unsigned long ACPSLimit, TOnceDoneOperation InitialOnceDoneOperation);
void __fastcall Stop();
void __fastcall SetDone();
void __fastcall Suspend();
void __fastcall LockUserSelections();
void __fastcall UnlockUserSelections();
// whole operation
TDateTime __fastcall TimeElapsed();
// only current file
TDateTime __fastcall TimeExpected();
TDateTime __fastcall TotalTimeLeft();
int __fastcall TransferProgress();
int __fastcall OverallProgress() const;
int __fastcall TotalTransferProgress() const;
void __fastcall SetSpeedCounters();
void __fastcall SetTransferringFile(bool ATransferringFile);
TCancelStatus __fastcall GetCancel();
void __fastcall SetCancel(TCancelStatus ACancel);
void __fastcall SetCancelAtLeast(TCancelStatus ACancel);
bool __fastcall ClearCancelFile();
void __fastcall SetCPSLimit(unsigned long ACPSLimit);
void __fastcall SetBatchOverwrite(TBatchOverwrite ABatchOverwrite);
void __fastcall SetSkipToAll();
UnicodeString __fastcall GetLogStr(bool Done);
void __fastcall Store(TPersistence & Persistence);
void __fastcall Restore(TPersistence & Persistence);
bool IsIndeterminate() const;
bool IsTransfer() const;
static bool IsIndeterminateOperation(TFileOperation Operation);
static bool IsTransferOperation(TFileOperation Operation);
};
//---------------------------------------------------------------------------
class TSuspendFileOperationProgress
{
public:
__fastcall TSuspendFileOperationProgress(TFileOperationProgressType * OperationProgress)
{
FOperationProgress = OperationProgress;
if (FOperationProgress != NULL)
{
FOperationProgress->Suspend();
}
}
__fastcall ~TSuspendFileOperationProgress()
{
if (FOperationProgress != NULL)
{
FOperationProgress->Resume();
}
}
private:
TFileOperationProgressType * FOperationProgress;
};
//---------------------------------------------------------------------------
#endif