Terminal.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. //---------------------------------------------------------------------------
  2. #ifndef TerminalH
  3. #define TerminalH
  4. #include <Classes.hpp>
  5. #include "FileOperationProgress.h"
  6. #include "FileMasks.h"
  7. #include "SecureShell.h"
  8. //---------------------------------------------------------------------------
  9. class TCopyParamType;
  10. class TFileOperationProgressType;
  11. class TRemoteDirectory;
  12. class TRemoteFile;
  13. class TCustomFileSystem;
  14. struct TCalculateSizeParams;
  15. struct TOverwriteFileParams;
  16. struct TSynchronizeData;
  17. struct TSynchronizeStats;
  18. struct TSynchronizeOptions;
  19. struct TCalculateSizeStats;
  20. typedef TStringList TUsersGroupsList;
  21. typedef void __fastcall (__closure *TReadDirectoryEvent)(System::TObject* Sender, Boolean ReloadOnly);
  22. typedef void __fastcall (__closure *TReadDirectoryProgressEvent)(
  23. System::TObject* Sender, int Progress);
  24. typedef void __fastcall (__closure *TProcessFileEvent)
  25. (const AnsiString FileName, const TRemoteFile * File, void * Param);
  26. typedef void __fastcall (__closure *TProcessFileEventEx)
  27. (const AnsiString FileName, const TRemoteFile * File, void * Param, int Index);
  28. typedef int __fastcall (__closure *TFileOperationEvent)
  29. (void * Param1, void * Param2);
  30. typedef void __fastcall (__closure *TSynchronizeDirectory)
  31. (const AnsiString LocalDirectory, const AnsiString RemoteDirectory, bool & Continue);
  32. typedef void __fastcall (__closure *TDeleteLocalFileEvent)(const AnsiString FileName);
  33. typedef int __fastcall (__closure *TDirectoryModifiedEvent)
  34. (TTerminal * Terminal, const AnsiString Directory, bool SubDirs);
  35. //---------------------------------------------------------------------------
  36. #define SUSPEND_OPERATION(Command) \
  37. { \
  38. TSuspendFileOperationProgress Suspend(OperationProgress); \
  39. Command \
  40. }
  41. #define THROW_SKIP_FILE(EXCEPTION, MESSAGE) \
  42. throw EScpSkipFile(EXCEPTION, MESSAGE)
  43. #define THROW_SKIP_FILE_NULL THROW_SKIP_FILE(NULL, "")
  44. /* TODO : Better user interface (query to user) */
  45. #define FILE_OPERATION_LOOP_CUSTOM(TERMINAL, ALLOW_SKIP, MESSAGE, OPERATION) { \
  46. bool DoRepeat; \
  47. do { \
  48. DoRepeat = false; \
  49. try { \
  50. OPERATION; \
  51. } \
  52. catch (EAbort & E) \
  53. { \
  54. throw; \
  55. } \
  56. catch (EScpSkipFile & E) \
  57. { \
  58. throw; \
  59. } \
  60. catch (EFatal & E) \
  61. { \
  62. throw; \
  63. } \
  64. catch (Exception & E) \
  65. { \
  66. TERMINAL->FileOperationLoopQuery(E, OperationProgress, MESSAGE, ALLOW_SKIP); \
  67. DoRepeat = true; \
  68. } \
  69. } while (DoRepeat); }
  70. #define FILE_OPERATION_LOOP(MESSAGE, OPERATION) \
  71. FILE_OPERATION_LOOP_EX(True, MESSAGE, OPERATION)
  72. //---------------------------------------------------------------------------
  73. enum TFSCapability { fcUserGroupListing, fcModeChanging, fcGroupChanging,
  74. fcOwnerChanging, fcAnyCommand, fcHardLink, fcSymbolicLink, fcResolveSymlink,
  75. fcTextMode, fcRename, fcNativeTextMode, fcNewerOnlyUpload, fcRemoteCopy,
  76. fcTimestampChanging, fcRemoteMove };
  77. enum TCurrentFSProtocol { cfsUnknown, cfsSCP, cfsSFTP };
  78. //---------------------------------------------------------------------------
  79. const cpDelete = 0x01;
  80. const cpTemporary = 0x04;
  81. const cpNoConfirmation = 0x08;
  82. const cpNewerOnly = 0x10;
  83. //---------------------------------------------------------------------------
  84. const ccApplyToDirectories = 0x01;
  85. const ccRecursive = 0x02;
  86. const ccUser = 0x100;
  87. //---------------------------------------------------------------------------
  88. const csIgnoreErrors = 0x01;
  89. //---------------------------------------------------------------------------
  90. class TTerminal : public TSecureShell
  91. {
  92. public:
  93. // TScript::SynchronizeProc relies on the order
  94. enum TSynchronizeMode { smRemote, smLocal, smBoth };
  95. static const spDelete = 0x01; // cannot be combined with spTimestamp and spBySize
  96. static const spNoConfirmation = 0x02; // has no effect for spTimestamp
  97. static const spExistingOnly = 0x04; // is implicit for spTimestamp
  98. static const spNoRecurse = 0x08;
  99. static const spUseCache = 0x10; // cannot be combined with spTimestamp
  100. static const spDelayProgress = 0x20; // cannot be combined with spTimestamp
  101. static const spPreviewChanges = 0x40; // has no effect for spTimestamp
  102. static const spSubDirs = 0x80; // cannot be combined with spTimestamp
  103. static const spTimestamp = 0x100;
  104. static const spNotByTime = 0x200; // cannot be combined with spTimestamp and smBoth
  105. static const spBySize = 0x400; // cannot be combined with smBoth, has opposite meaning for spTimestamp
  106. // for TranslateLockedPath()
  107. friend class TRemoteFile;
  108. // for ReactOnCommand()
  109. friend class TSCPFileSystem;
  110. friend class TSFTPFileSystem;
  111. private:
  112. AnsiString FCurrentDirectory;
  113. AnsiString FLockDirectory;
  114. Integer FExceptionOnFail;
  115. TRemoteDirectory * FFiles;
  116. int FInTransaction;
  117. TNotifyEvent FOnChangeDirectory;
  118. TReadDirectoryEvent FOnReadDirectory;
  119. TDirectoryModifiedEvent FOnDirectoryModified;
  120. TNotifyEvent FOnStartReadDirectory;
  121. TReadDirectoryProgressEvent FOnReadDirectoryProgress;
  122. TDeleteLocalFileEvent FOnDeleteLocalFile;
  123. TUsersGroupsList * FGroups;
  124. TUsersGroupsList * FUsers;
  125. bool FUsersGroupsLookedup;
  126. TFileOperationProgressEvent FOnProgress;
  127. TFileOperationFinished FOnFinished;
  128. TFileOperationProgressType * FOperationProgress;
  129. bool FUseBusyCursor;
  130. TRemoteDirectoryCache * FDirectoryCache;
  131. TRemoteDirectoryChangesCache * FDirectoryChangesCache;
  132. TCustomFileSystem * FFileSystem;
  133. TStrings * FAdditionalInfo;
  134. AnsiString FLastDirectoryChange;
  135. TCurrentFSProtocol FFSProtocol;
  136. TTerminal * FCommandSession;
  137. bool FAutoReadDirectory;
  138. bool FReadingCurrentDirectory;
  139. bool * FClosedOnCompletion;
  140. void __fastcall CommandError(Exception * E, const AnsiString Msg);
  141. int __fastcall CommandError(Exception * E, const AnsiString Msg, int Answers);
  142. AnsiString __fastcall PeekCurrentDirectory();
  143. AnsiString __fastcall GetCurrentDirectory();
  144. bool __fastcall GetExceptionOnFail() const;
  145. AnsiString __fastcall GetProtocolName();
  146. TUsersGroupsList * __fastcall GetGroups();
  147. TUsersGroupsList * __fastcall GetUsers();
  148. void __fastcall SetCurrentDirectory(AnsiString value);
  149. void __fastcall SetExceptionOnFail(bool value);
  150. void __fastcall ReactOnCommand(int /*TFSCommand*/ Cmd);
  151. AnsiString __fastcall GetUserName() const;
  152. bool __fastcall GetAreCachesEmpty() const;
  153. void __fastcall ClearCachedFileList(const AnsiString Path, bool SubDirs);
  154. void __fastcall AddCachedFileList(TRemoteFileList * FileList);
  155. bool __fastcall GetCommandSessionOpened();
  156. TTerminal * __fastcall GetCommandSession();
  157. bool __fastcall GetResolvingSymlinks();
  158. protected:
  159. bool FReadCurrentDirectoryPending;
  160. bool FReadDirectoryPending;
  161. virtual void __fastcall KeepAlive();
  162. void __fastcall DoStartReadDirectory();
  163. void __fastcall DoReadDirectoryProgress(int Progress);
  164. void __fastcall DoReadDirectory(bool ReloadOnly);
  165. void __fastcall DoDirectoryModified(const AnsiString Path, bool SubDirs);
  166. void __fastcall DoCreateDirectory(const AnsiString DirName,
  167. const TRemoteProperties * Properties);
  168. void __fastcall DoDeleteFile(const AnsiString FileName,
  169. const TRemoteFile * File, void * Param);
  170. void __fastcall DoCustomCommandOnFile(AnsiString FileName,
  171. const TRemoteFile * File, AnsiString Command, int Params, TLogAddLineEvent OutputEvent);
  172. void __fastcall DoRenameFile(const AnsiString FileName,
  173. const AnsiString NewName, bool Move);
  174. void __fastcall DoCopyFile(const AnsiString FileName, const AnsiString NewName);
  175. void __fastcall DoChangeFileProperties(const AnsiString FileName,
  176. const TRemoteFile * File, const TRemoteProperties * Properties);
  177. void __fastcall DoChangeDirectory();
  178. void __fastcall EnsureNonExistence(const AnsiString FileName);
  179. void __fastcall LookupUsersGroups();
  180. void __fastcall FileModified(const TRemoteFile * File,
  181. const AnsiString FileName, bool ClearDirectoryChange = false);
  182. int __fastcall FileOperationLoop(TFileOperationEvent CallBackFunc,
  183. TFileOperationProgressType * OperationProgress, bool AllowSkip,
  184. const AnsiString Message, void * Param1 = NULL, void * Param2 = NULL);
  185. bool __fastcall GetIsCapable(TFSCapability Capability) const;
  186. bool __fastcall ProcessFiles(TStrings * FileList, TFileOperation Operation,
  187. TProcessFileEvent ProcessFile, void * Param = NULL, TOperationSide Side = osRemote,
  188. bool Ex = false);
  189. bool __fastcall ProcessFilesEx(TStrings * FileList, TFileOperation Operation,
  190. TProcessFileEventEx ProcessFile, void * Param = NULL, TOperationSide Side = osRemote);
  191. void __fastcall ProcessDirectory(const AnsiString DirName,
  192. TProcessFileEvent CallBackFunc, void * Param = NULL, bool UseCache = false);
  193. AnsiString __fastcall TranslateLockedPath(AnsiString Path, bool Lock);
  194. void __fastcall ReadDirectory(TRemoteFileList * FileList);
  195. void __fastcall CustomReadDirectory(TRemoteFileList * FileList);
  196. void __fastcall DoCreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
  197. bool __fastcall CreateLocalFile(const AnsiString FileName,
  198. TFileOperationProgressType * OperationProgress, HANDLE * AHandle,
  199. bool NoConfirmation);
  200. void __fastcall OpenLocalFile(const AnsiString FileName, int Access,
  201. int * Attrs, HANDLE * Handle, __int64 * ACTime, __int64 * MTime,
  202. __int64 * ATime, __int64 * Size, bool TryWriteReadOnly = true);
  203. bool __fastcall HandleException(Exception * E);
  204. void __fastcall CalculateFileSize(AnsiString FileName,
  205. const TRemoteFile * File, /*TCalculateSizeParams*/ void * Size);
  206. void __fastcall DoCalculateDirectorySize(const AnsiString FileName,
  207. const TRemoteFile * File, TCalculateSizeParams * Params);
  208. void __fastcall CalculateLocalFileSize(const AnsiString FileName,
  209. const TSearchRec Rec, /*__int64*/ void * Size);
  210. void __fastcall CalculateLocalFilesSize(TStrings * FileList, __int64 & Size,
  211. const TCopyParamType * CopyParam = NULL);
  212. TStrings * __fastcall GetAdditionalInfo();
  213. int __fastcall ConfirmFileOverwrite(const AnsiString FileName,
  214. const TOverwriteFileParams * FileParams, int Answers, const TQueryParams * Params,
  215. TOperationSide Side, TFileOperationProgressType * OperationProgress);
  216. void __fastcall DoSynchronizeDirectory(const AnsiString LocalDirectory,
  217. const AnsiString RemoteDirectory, TSynchronizeMode Mode,
  218. const TCopyParamType * CopyParam, int Params,
  219. TSynchronizeDirectory OnSynchronizeDirectory, TSynchronizeStats * Stats,
  220. TSynchronizeOptions * Options, int Level);
  221. void __fastcall SynchronizeFile(const AnsiString FileName,
  222. const TRemoteFile * File, /*TSynchronizeData*/ void * Param);
  223. void __fastcall SynchronizeRemoteTimestamp(const AnsiString FileName,
  224. const TRemoteFile * File, void * Param);
  225. void __fastcall SynchronizeLocalTimestamp(const AnsiString FileName,
  226. const TRemoteFile * File, void * Param, int Index);
  227. void __fastcall DoSynchronizeProgress(const TSynchronizeData & Data);
  228. void __fastcall DeleteLocalFile(AnsiString FileName,
  229. const TRemoteFile * File, void * Param);
  230. void __fastcall RecycleFile(AnsiString FileName, const TRemoteFile * File);
  231. bool __fastcall IsRecycledFile(AnsiString FileName);
  232. TStrings * __fastcall GetFixedPaths();
  233. __property TFileOperationProgressType * OperationProgress = { read=FOperationProgress };
  234. public:
  235. __fastcall TTerminal();
  236. __fastcall ~TTerminal();
  237. virtual void __fastcall Open();
  238. virtual void __fastcall Close();
  239. virtual void __fastcall DirectoryModified(const AnsiString Path, bool SubDirs);
  240. virtual void __fastcall DirectoryLoaded(TRemoteFileList * FileList);
  241. virtual void __fastcall Idle();
  242. bool __fastcall AllowedAnyCommand(const AnsiString Command);
  243. void __fastcall AnyCommand(const AnsiString Command, TLogAddLineEvent OutputEvent);
  244. void __fastcall CloseOnCompletion(const AnsiString Message = "");
  245. AnsiString __fastcall AbsolutePath(AnsiString Path);
  246. void __fastcall BeginTransaction();
  247. void __fastcall ReadCurrentDirectory();
  248. void __fastcall ReadDirectory(bool ReloadOnly, bool ForceCache = false);
  249. TRemoteFileList * ReadDirectoryListing(AnsiString Directory, bool UseCache);
  250. void __fastcall ReadFile(const AnsiString FileName, TRemoteFile *& File);
  251. void __fastcall ReadSymlink(TRemoteFile * SymlinkFile, TRemoteFile *& File);
  252. bool __fastcall CopyToLocal(TStrings * FilesToCopy,
  253. const AnsiString TargetDir, const TCopyParamType * CopyParam, int Params);
  254. bool __fastcall CopyToRemote(TStrings * FilesToCopy,
  255. const AnsiString TargetDir, const TCopyParamType * CopyParam, int Params);
  256. void __fastcall CreateDirectory(const AnsiString DirName,
  257. const TRemoteProperties * Properties = NULL);
  258. void __fastcall CreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
  259. void __fastcall DeleteFile(AnsiString FileName,
  260. const TRemoteFile * File = NULL, void * Recursive = NULL);
  261. bool __fastcall DeleteFiles(TStrings * FilesToDelete, bool * Recursive = NULL);
  262. bool __fastcall DeleteLocalFiles(TStrings * FileList);
  263. void __fastcall CustomCommandOnFile(AnsiString FileName,
  264. const TRemoteFile * File, void * AParams);
  265. void __fastcall CustomCommandOnFiles(AnsiString Command, int Params,
  266. TStrings * Files, TLogAddLineEvent OutputEvent);
  267. void __fastcall ChangeDirectory(const AnsiString Directory);
  268. void __fastcall DoStartup();
  269. void __fastcall EndTransaction();
  270. void __fastcall HomeDirectory();
  271. void __fastcall ChangeFileProperties(AnsiString FileName,
  272. const TRemoteFile * File, /*const TRemoteProperties */ void * Properties);
  273. void __fastcall ChangeFilesProperties(TStrings * FileList,
  274. const TRemoteProperties * Properties);
  275. void __fastcall TerminalError(AnsiString Msg);
  276. void __fastcall TerminalError(Exception * E, AnsiString Msg);
  277. void __fastcall ReloadDirectory();
  278. void __fastcall RefreshDirectory();
  279. void __fastcall RenameFile(const AnsiString FileName, const AnsiString NewName);
  280. void __fastcall RenameFile(const TRemoteFile * File, const AnsiString NewName, bool CheckExistence);
  281. void __fastcall MoveFile(const AnsiString FileName, const TRemoteFile * File,
  282. /*const TMoveFileParams*/ void * Param);
  283. bool __fastcall MoveFiles(TStrings * FileList, const AnsiString Target,
  284. const AnsiString FileMask);
  285. void __fastcall CopyFile(const AnsiString FileName, const TRemoteFile * File,
  286. /*const TMoveFileParams*/ void * Param);
  287. bool __fastcall CopyFiles(TStrings * FileList, const AnsiString Target,
  288. const AnsiString FileMask);
  289. void __fastcall CalculateFilesSize(TStrings * FileList, __int64 & Size,
  290. int Params, const TCopyParamType * CopyParam = NULL, TCalculateSizeStats * Stats = NULL);
  291. void __fastcall ClearCaches();
  292. void __fastcall Synchronize(const AnsiString LocalDirectory,
  293. const AnsiString RemoteDirectory, TSynchronizeMode Mode,
  294. const TCopyParamType * CopyParam, int Params,
  295. TSynchronizeDirectory OnSynchronizeDirectory, TSynchronizeStats * Stats,
  296. TSynchronizeOptions * Options);
  297. bool __fastcall DirectoryFileList(const AnsiString Path,
  298. TRemoteFileList *& FileList, bool CanLoad);
  299. void __fastcall MakeLocalFileList(const AnsiString FileName,
  300. const TSearchRec Rec, void * Param);
  301. AnsiString __fastcall FileUrl(const AnsiString FileName);
  302. bool __fastcall FileOperationLoopQuery(Exception & E,
  303. TFileOperationProgressType * OperationProgress, const AnsiString Message,
  304. bool AllowSkip, AnsiString SpecialRetry = "");
  305. static bool __fastcall IsAbsolutePath(const AnsiString Path);
  306. static AnsiString __fastcall ExpandFileName(AnsiString Path,
  307. const AnsiString BasePath);
  308. __property AnsiString CurrentDirectory = { read = GetCurrentDirectory, write = SetCurrentDirectory };
  309. __property bool ExceptionOnFail = { read = GetExceptionOnFail, write = SetExceptionOnFail };
  310. __property TRemoteDirectory * Files = { read = FFiles };
  311. __property TNotifyEvent OnChangeDirectory = { read = FOnChangeDirectory, write = FOnChangeDirectory };
  312. __property TReadDirectoryEvent OnReadDirectory = { read = FOnReadDirectory, write = FOnReadDirectory };
  313. __property TDirectoryModifiedEvent OnDirectoryModified = { read = FOnDirectoryModified, write = FOnDirectoryModified };
  314. __property TNotifyEvent OnStartReadDirectory = { read = FOnStartReadDirectory, write = FOnStartReadDirectory };
  315. __property TReadDirectoryProgressEvent OnReadDirectoryProgress = { read = FOnReadDirectoryProgress, write = FOnReadDirectoryProgress };
  316. __property TDeleteLocalFileEvent OnDeleteLocalFile = { read = FOnDeleteLocalFile, write = FOnDeleteLocalFile };
  317. __property TUsersGroupsList * Groups = { read = GetGroups };
  318. __property TUsersGroupsList * Users = { read = GetUsers };
  319. __property TFileOperationProgressEvent OnProgress = { read=FOnProgress, write=FOnProgress };
  320. __property TFileOperationFinished OnFinished = { read=FOnFinished, write=FOnFinished };
  321. __property TCurrentFSProtocol FSProtocol = { read = FFSProtocol };
  322. __property AnsiString ProtocolName = { read = GetProtocolName };
  323. __property bool UseBusyCursor = { read = FUseBusyCursor, write = FUseBusyCursor };
  324. __property AnsiString UserName = { read=GetUserName };
  325. __property bool IsCapable[TFSCapability Capability] = { read = GetIsCapable };
  326. __property TStrings * AdditionalInfo = { read = GetAdditionalInfo };
  327. __property bool AreCachesEmpty = { read = GetAreCachesEmpty };
  328. __property bool CommandSessionOpened = { read = GetCommandSessionOpened };
  329. __property TTerminal * CommandSession = { read = GetCommandSession };
  330. __property bool AutoReadDirectory = { read = FAutoReadDirectory, write = FAutoReadDirectory };
  331. __property TStrings * FixedPaths = { read = GetFixedPaths };
  332. __property bool ResolvingSymlinks = { read = GetResolvingSymlinks };
  333. };
  334. //---------------------------------------------------------------------------
  335. class TSecondaryTerminal : public TTerminal
  336. {
  337. public:
  338. __fastcall TSecondaryTerminal(TTerminal * MainTerminal);
  339. protected:
  340. virtual void __fastcall DirectoryLoaded(TRemoteFileList * FileList);
  341. virtual void __fastcall DirectoryModified(const AnsiString Path,
  342. bool SubDirs);
  343. virtual bool __fastcall DoPromptUser(AnsiString Prompt, TPromptKind Kind,
  344. AnsiString & Response);
  345. virtual void __fastcall SetSessionData(TSessionData * value);
  346. private:
  347. bool FMasterPasswordTried;
  348. TTerminal * FMainTerminal;
  349. };
  350. //---------------------------------------------------------------------------
  351. class TTerminalList : public TObjectList
  352. {
  353. public:
  354. __fastcall TTerminalList(TConfiguration * AConfiguration);
  355. __fastcall ~TTerminalList();
  356. virtual TTerminal * __fastcall NewTerminal(TSessionData * Data);
  357. virtual void __fastcall FreeTerminal(TTerminal * Terminal);
  358. void __fastcall FreeAndNullTerminal(TTerminal * & Terminal);
  359. virtual void __fastcall Idle();
  360. __property TTerminal * Terminals[int Index] = { read=GetTerminal };
  361. __property int ActiveCount = { read = GetActiveCount };
  362. private:
  363. TConfiguration * FConfiguration;
  364. TTerminal * __fastcall GetTerminal(int Index);
  365. int __fastcall GetActiveCount();
  366. };
  367. //---------------------------------------------------------------------------
  368. struct TCustomCommandParams
  369. {
  370. AnsiString Command;
  371. int Params;
  372. TLogAddLineEvent OutputEvent;
  373. };
  374. //---------------------------------------------------------------------------
  375. struct TCalculateSizeStats
  376. {
  377. TCalculateSizeStats();
  378. int Files;
  379. int Directories;
  380. int SymLinks;
  381. };
  382. //---------------------------------------------------------------------------
  383. struct TCalculateSizeParams
  384. {
  385. __int64 Size;
  386. int Params;
  387. const TCopyParamType * CopyParam;
  388. TCalculateSizeStats * Stats;
  389. };
  390. //---------------------------------------------------------------------------
  391. struct TOverwriteFileParams
  392. {
  393. __int64 SourceSize;
  394. __int64 DestSize;
  395. TDateTime SourceTimestamp;
  396. TDateTime DestTimestamp;
  397. };
  398. //---------------------------------------------------------------------------
  399. struct TMakeLocalFileListParams
  400. {
  401. TStrings * FileList;
  402. bool IncludeDirs;
  403. bool Recursive;
  404. };
  405. //---------------------------------------------------------------------------
  406. struct TSynchronizeStats
  407. {
  408. TSynchronizeStats();
  409. // currently we do not need any other stats
  410. // (these are for keep remote directory up to date)
  411. int NewDirectories;
  412. int RemovedDirectories;
  413. int ObsoleteDirectories;
  414. };
  415. //---------------------------------------------------------------------------
  416. struct TSynchronizeOptions
  417. {
  418. TSynchronizeOptions();
  419. ~TSynchronizeOptions();
  420. TStringList * Filter;
  421. };
  422. //---------------------------------------------------------------------------
  423. #endif