| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 | //---------------------------------------------------------------------------#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 onlyenum 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();  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
 |