FileOperationProgress.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "Common.h"
  5. #include "FileOperationProgress.h"
  6. //---------------------------------------------------------------------------
  7. #define TRANSFER_BUF_SIZE 4096
  8. //---------------------------------------------------------------------------
  9. __fastcall TFileOperationProgressType::TFileOperationProgressType()
  10. {
  11. Clear();
  12. }
  13. //---------------------------------------------------------------------------
  14. __fastcall TFileOperationProgressType::TFileOperationProgressType(
  15. TFileOperationProgressEvent AOnProgress, TFileOperationFinished AOnFinished)
  16. {
  17. Clear();
  18. FOnProgress = AOnProgress;
  19. FOnFinished = AOnFinished;
  20. }
  21. //---------------------------------------------------------------------------
  22. __fastcall TFileOperationProgressType::~TFileOperationProgressType()
  23. {
  24. assert(!InProgress && !Suspended);
  25. }
  26. //---------------------------------------------------------------------------
  27. void __fastcall TFileOperationProgressType::Clear()
  28. {
  29. FileName = "";
  30. AsciiTransfer = false;
  31. ResumeStatus = rsNotAvailable;
  32. Count = 0;
  33. FFilesFinished = 0;
  34. StartTime = Now();
  35. FStopped = 0;
  36. Suspended = false;
  37. FSuspendTime = 0;
  38. InProgress = false;
  39. TotalTransfered = 0;
  40. TotalResumed = 0;
  41. TotalSize = 0;
  42. TotalSizeSet = false;
  43. Operation = foNone;
  44. DragDrop = false;
  45. YesToAll = false;
  46. NoToAll = false;
  47. ClearTransfer();
  48. }
  49. //---------------------------------------------------------------------------
  50. void __fastcall TFileOperationProgressType::ClearTransfer()
  51. {
  52. LocalSize = 0;
  53. TransferSize = 0;
  54. LocalyUsed = 0;
  55. TransferedSize = 0;
  56. TransferingFile = false;
  57. FFileStopped = 0;
  58. }
  59. //---------------------------------------------------------------------------
  60. void __fastcall TFileOperationProgressType::Start(TFileOperation AOperation,
  61. TOperationSide ASide, int ACount, bool ADragDrop,
  62. const AnsiString ADirectory)
  63. {
  64. Clear();
  65. Operation = AOperation;
  66. Side = ASide;
  67. Count = ACount;
  68. InProgress = true;
  69. Cancel = csContinue;
  70. Directory = ADirectory;
  71. DragDrop = ADragDrop;
  72. DoProgress();
  73. }
  74. //---------------------------------------------------------------------------
  75. void __fastcall TFileOperationProgressType::Stop()
  76. {
  77. InProgress = false;
  78. DoProgress();
  79. }
  80. //---------------------------------------------------------------------------
  81. void __fastcall TFileOperationProgressType::Suspend()
  82. {
  83. assert(!Suspended);
  84. Suspended = true;
  85. FSuspendTime = Now();
  86. DoProgress();
  87. }
  88. //---------------------------------------------------------------------------
  89. void __fastcall TFileOperationProgressType::Resume()
  90. {
  91. assert(Suspended);
  92. Suspended = false;
  93. TDateTime TimeSuspended = (Now() - FSuspendTime);
  94. // see CPS()
  95. FStopped += TimeSuspended;
  96. FFileStopped += TimeSuspended;
  97. DoProgress();
  98. }
  99. //---------------------------------------------------------------------------
  100. int __fastcall TFileOperationProgressType::OperationProgress()
  101. {
  102. assert(Count);
  103. return (FFilesFinished * 100)/Count;
  104. }
  105. //---------------------------------------------------------------------------
  106. int __fastcall TFileOperationProgressType::TransferProgress()
  107. {
  108. if (TransferSize) return (int)((TransferedSize * 100)/TransferSize);
  109. else return 0;
  110. }
  111. //---------------------------------------------------------------------------
  112. int __fastcall TFileOperationProgressType::TotalTransferProgress()
  113. {
  114. assert(TotalSizeSet);
  115. int Result = TotalSize > 0 ? (int)((TotalTransfered * 100)/TotalSize) : 0;
  116. return Result < 100 ? Result : Result;
  117. }
  118. //---------------------------------------------------------------------------
  119. int __fastcall TFileOperationProgressType::OverallProgress()
  120. {
  121. if (TotalSizeSet)
  122. {
  123. assert((Operation == foCopy) || (Operation == foMove));
  124. return TotalTransferProgress();
  125. }
  126. else
  127. {
  128. return OperationProgress();
  129. }
  130. }
  131. //---------------------------------------------------------------------------
  132. void __fastcall TFileOperationProgressType::DoProgress()
  133. {
  134. if (FOnProgress) FOnProgress(*this, Cancel);
  135. }
  136. //---------------------------------------------------------------------------
  137. void __fastcall TFileOperationProgressType::Finish(AnsiString FileName,
  138. bool Success, bool & DisconnectWhenComplete)
  139. {
  140. assert(InProgress);
  141. if (FOnFinished)
  142. {
  143. FOnFinished(Operation, Side, DragDrop, FileName,
  144. /* TODO : There wasn't 'Success' condition, was it by mistake or by purpose? */
  145. Success && (Cancel == csContinue), DisconnectWhenComplete);
  146. }
  147. FFilesFinished++;
  148. DoProgress();
  149. }
  150. //---------------------------------------------------------------------------
  151. void __fastcall TFileOperationProgressType::SetFile(AnsiString AFileName)
  152. {
  153. FileName = AFileName;
  154. ClearTransfer();
  155. FFileStartTime = Now();
  156. DoProgress();
  157. }
  158. //---------------------------------------------------------------------------
  159. void __fastcall TFileOperationProgressType::SetLocalSize(__int64 ASize)
  160. {
  161. LocalSize = ASize;
  162. DoProgress();
  163. }
  164. //---------------------------------------------------------------------------
  165. void __fastcall TFileOperationProgressType::AddLocalyUsed(__int64 ASize)
  166. {
  167. LocalyUsed += ASize;
  168. if (LocalyUsed > LocalSize)
  169. {
  170. LocalSize = LocalyUsed;
  171. }
  172. DoProgress();
  173. }
  174. //---------------------------------------------------------------------------
  175. bool __fastcall TFileOperationProgressType::IsLocalyDone()
  176. {
  177. assert(LocalyUsed <= LocalSize);
  178. return (LocalyUsed == LocalSize);
  179. }
  180. //---------------------------------------------------------------------------
  181. unsigned long __fastcall TFileOperationProgressType::LocalBlockSize()
  182. {
  183. unsigned long Result = TRANSFER_BUF_SIZE;
  184. if (LocalyUsed + Result > LocalSize) Result = (unsigned long)(LocalSize - LocalyUsed);
  185. return Result;
  186. }
  187. //---------------------------------------------------------------------------
  188. void __fastcall TFileOperationProgressType::SetTotalSize(__int64 ASize)
  189. {
  190. TotalSize = ASize;
  191. TotalSizeSet = true;
  192. DoProgress();
  193. }
  194. //---------------------------------------------------------------------------
  195. void __fastcall TFileOperationProgressType::SetTransferSize(__int64 ASize)
  196. {
  197. TransferSize = ASize;
  198. DoProgress();
  199. }
  200. //---------------------------------------------------------------------------
  201. void __fastcall TFileOperationProgressType::AddTransfered(__int64 ASize)
  202. {
  203. TransferedSize += ASize;
  204. if (TransferedSize > TransferSize)
  205. {
  206. // this can happen with SFTP when downloading file that
  207. // grows while being downloaded
  208. if (TotalSizeSet)
  209. {
  210. TotalSize += (TransferedSize - TransferSize);
  211. }
  212. TransferSize = TransferedSize;
  213. }
  214. TotalTransfered += ASize;
  215. DoProgress();
  216. }
  217. //---------------------------------------------------------------------------
  218. void __fastcall TFileOperationProgressType::AddResumed(__int64 ASize)
  219. {
  220. TotalResumed += ASize;
  221. AddTransfered(ASize);
  222. AddLocalyUsed(ASize);
  223. }
  224. //---------------------------------------------------------------------------
  225. unsigned long __fastcall TFileOperationProgressType::TransferBlockSize()
  226. {
  227. unsigned long Result = TRANSFER_BUF_SIZE;
  228. if (TransferedSize + Result > TransferSize) Result = (unsigned long)(TransferSize - TransferedSize);
  229. return Result;
  230. }
  231. //---------------------------------------------------------------------------
  232. unsigned long __fastcall TFileOperationProgressType::StaticBlockSize()
  233. {
  234. return TRANSFER_BUF_SIZE;
  235. }
  236. //---------------------------------------------------------------------------
  237. bool __fastcall TFileOperationProgressType::IsTransferDone()
  238. {
  239. assert(TransferedSize <= TransferSize);
  240. return (TransferedSize == TransferSize);
  241. }
  242. //---------------------------------------------------------------------------
  243. void __fastcall TFileOperationProgressType::SetAsciiTransfer(bool AAsciiTransfer)
  244. {
  245. AsciiTransfer = AAsciiTransfer;
  246. DoProgress();
  247. }
  248. //---------------------------------------------------------------------------
  249. void __fastcall TFileOperationProgressType::SetResumeStatus(TResumeStatus AResumeStatus)
  250. {
  251. ResumeStatus = AResumeStatus;
  252. DoProgress();
  253. }
  254. //---------------------------------------------------------------------------
  255. TDateTime __fastcall TFileOperationProgressType::TimeElapsed()
  256. {
  257. return Now() - StartTime;
  258. }
  259. //---------------------------------------------------------------------------
  260. unsigned int __fastcall TFileOperationProgressType::CPS()
  261. {
  262. TDateTime CurTime = Suspended ? FSuspendTime : Now();
  263. TDateTime RealTime = (CurTime - StartTime) - FStopped;
  264. if ((double)RealTime > 0)
  265. {
  266. return (TotalTransfered - TotalResumed) / ((double)RealTime * (24 * 60 * 60));
  267. }
  268. else
  269. {
  270. return 0;
  271. }
  272. }
  273. //---------------------------------------------------------------------------
  274. TDateTime __fastcall TFileOperationProgressType::TimeExpected()
  275. {
  276. unsigned int CurCps = CPS();
  277. if (CurCps) return TDateTime((double)(((double)(TransferSize - TransferedSize)) / CurCps) / (24 * 60 * 60));
  278. else return 0;
  279. }
  280. //---------------------------------------------------------------------------
  281. TDateTime __fastcall TFileOperationProgressType::TotalTimeExpected()
  282. {
  283. assert(TotalSizeSet);
  284. unsigned int CurCps = CPS();
  285. if (CurCps > 0)
  286. {
  287. return TDateTime((double)((double)TotalSize / CurCps) /
  288. (24 * 60 * 60));
  289. }
  290. else
  291. {
  292. return 0;
  293. }
  294. }