Terminal.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  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. typedef TStringList TUsersGroupsList;
  18. typedef void __fastcall (__closure *TReadDirectoryEvent)(System::TObject* Sender, Boolean ReloadOnly);
  19. typedef void __fastcall (__closure *TProcessFileEvent)
  20. (const AnsiString FileName, const TRemoteFile * File, void * Param);
  21. typedef int __fastcall (__closure *TFileOperationEvent)
  22. (void * Param1, void * Param2);
  23. typedef void __fastcall (__closure *TSynchronizeDirectory)
  24. (const AnsiString LocalDirectory, const AnsiString RemoteDirectory, bool & Continue);
  25. typedef void __fastcall (__closure *TDeleteLocalFileEvent)(const AnsiString FileName);
  26. typedef int __fastcall (__closure *TDirectoryModifiedEvent)
  27. (TTerminal * Terminal, const AnsiString Directory, bool SubDirs);
  28. //---------------------------------------------------------------------------
  29. #define SUSPEND_OPERATION(Command) \
  30. { \
  31. TSuspendFileOperationProgress Suspend(OperationProgress); \
  32. Command \
  33. }
  34. #define THROW_SKIP_FILE(EXCEPTION, MESSAGE) \
  35. throw EScpSkipFile(EXCEPTION, MESSAGE)
  36. #define THROW_SKIP_FILE_NULL THROW_SKIP_FILE(NULL, "")
  37. /* TODO : Better user interface (query to user) */
  38. #define FILE_OPERATION_LOOP_CUSTOM(TERMINAL, ALLOW_SKIP, MESSAGE, OPERATION) { \
  39. bool DoRepeat; \
  40. do { \
  41. DoRepeat = false; \
  42. try { \
  43. OPERATION; \
  44. } \
  45. catch (EAbort & E) \
  46. { \
  47. throw; \
  48. } \
  49. catch (EScpSkipFile & E) \
  50. { \
  51. throw; \
  52. } \
  53. catch (EFatal & E) \
  54. { \
  55. throw; \
  56. } \
  57. catch (Exception & E) \
  58. { \
  59. TERMINAL->DoHandleExtendedException(&E); \
  60. int Answers = qaRetry | qaAbort | ((ALLOW_SKIP) ? qaSkip : 0); \
  61. int Answer; \
  62. TQueryParams Params(qpAllowContinueOnError | (!(ALLOW_SKIP) ? qpFatalAbort : 0)); \
  63. SUSPEND_OPERATION ( \
  64. Answer = TERMINAL->DoQueryUser(MESSAGE, &E, Answers, &Params); \
  65. ); \
  66. DoRepeat = (Answer == qaRetry); \
  67. if (Answer == qaAbort) OperationProgress->Cancel = csCancel; \
  68. if (!DoRepeat && ALLOW_SKIP) THROW_SKIP_FILE(&E, MESSAGE); \
  69. else \
  70. if (!DoRepeat && !ALLOW_SKIP) throw; \
  71. } \
  72. } while (DoRepeat); }
  73. #define FILE_OPERATION_LOOP(MESSAGE, OPERATION) \
  74. FILE_OPERATION_LOOP_EX(True, MESSAGE, OPERATION)
  75. //---------------------------------------------------------------------------
  76. enum TFSCapability { fcUserGroupListing, fcModeChanging, fcGroupChanging,
  77. fcOwnerChanging, fcAnyCommand, fcHardLink, fcSymbolicLink, fcResolveSymlink,
  78. fcTextMode, fcRename, fcNativeTextMode, fcNewerOnlyUpload };
  79. enum TCurrentFSProtocol { cfsUnknown, cfsSCP, cfsSFTP };
  80. //---------------------------------------------------------------------------
  81. const cpDelete = 0x01;
  82. const cpDragDrop = 0x04;
  83. const cpTemporary = 0x04; // alias to cpDragDrop
  84. const cpNoConfirmation = 0x08;
  85. const cpNewerOnly = 0x10;
  86. //---------------------------------------------------------------------------
  87. const ccApplyToDirectories = 0x01;
  88. const ccRecursive = 0x02;
  89. //---------------------------------------------------------------------------
  90. const csIgnoreErrors = 0x01;
  91. //---------------------------------------------------------------------------
  92. class TTerminal : public TSecureShell
  93. {
  94. public:
  95. enum TSynchronizeMode { smRemote, smLocal, smBoth };
  96. static const spDelete = 0x01;
  97. static const spNoConfirmation = 0x02;
  98. static const spExistingOnly = 0x04;
  99. static const spNoRecurse = 0x08;
  100. static const spUseCache = 0x10;
  101. static const spDelayProgress = 0x20;
  102. // for TranslateLockedPath()
  103. friend class TRemoteFile;
  104. // for ReactOnCommand()
  105. friend class TSCPFileSystem;
  106. friend class TSFTPFileSystem;
  107. private:
  108. AnsiString FCurrentDirectory;
  109. AnsiString FLockDirectory;
  110. Integer FExceptionOnFail;
  111. TRemoteDirectory * FFiles;
  112. int FInTransaction;
  113. TNotifyEvent FOnChangeDirectory;
  114. TReadDirectoryEvent FOnReadDirectory;
  115. TDirectoryModifiedEvent FOnDirectoryModified;
  116. TNotifyEvent FOnStartReadDirectory;
  117. TDeleteLocalFileEvent FOnDeleteLocalFile;
  118. TUsersGroupsList * FGroups;
  119. TUsersGroupsList * FUsers;
  120. bool FUsersGroupsLookedup;
  121. TFileOperationProgressEvent FOnProgress;
  122. TFileOperationFinished FOnFinished;
  123. TFileOperationProgressType * FOperationProgress;
  124. bool FUseBusyCursor;
  125. TRemoteDirectoryCache * FDirectoryCache;
  126. TRemoteDirectoryChangesCache * FDirectoryChangesCache;
  127. TCustomFileSystem * FFileSystem;
  128. TStrings * FAdditionalInfo;
  129. AnsiString FLastDirectoryChange;
  130. TCurrentFSProtocol FFSProtocol;
  131. TTerminal * FCommandSession;
  132. void __fastcall CommandError(Exception * E, const AnsiString Msg);
  133. int __fastcall CommandError(Exception * E, const AnsiString Msg, int Answers);
  134. AnsiString __fastcall PeekCurrentDirectory();
  135. AnsiString __fastcall GetCurrentDirectory();
  136. bool __fastcall GetExceptionOnFail() const;
  137. AnsiString __fastcall GetProtocolName();
  138. TUsersGroupsList * __fastcall GetGroups();
  139. TUsersGroupsList * __fastcall GetUsers();
  140. void __fastcall SetCurrentDirectory(AnsiString value);
  141. void __fastcall SetExceptionOnFail(bool value);
  142. void __fastcall ReactOnCommand(int /*TFSCommand*/ Cmd);
  143. AnsiString __fastcall GetUserName() const;
  144. bool __fastcall GetAreCachesEmpty() const;
  145. void __fastcall ClearCachedFileList(const AnsiString Path, bool SubDirs);
  146. void __fastcall AddCachedFileList(TRemoteFileList * FileList);
  147. bool __fastcall GetCommandSessionOpened();
  148. TTerminal * __fastcall GetCommandSession();
  149. protected:
  150. bool FReadCurrentDirectoryPending;
  151. bool FReadDirectoryPending;
  152. virtual void __fastcall KeepAlive();
  153. void __fastcall DoStartReadDirectory();
  154. void __fastcall DoReadDirectory(bool ReloadOnly);
  155. void __fastcall DoDirectoryModified(const AnsiString Path, bool SubDirs);
  156. void __fastcall DoCreateDirectory(const AnsiString DirName,
  157. const TRemoteProperties * Properties);
  158. void __fastcall DoDeleteFile(const AnsiString FileName,
  159. const TRemoteFile * File, void * Param);
  160. void __fastcall DoCustomCommandOnFile(AnsiString FileName,
  161. const TRemoteFile * File, AnsiString Command, int Params);
  162. void __fastcall DoRenameFile(const AnsiString FileName,
  163. const AnsiString NewName, bool Move);
  164. void __fastcall DoChangeFileProperties(const AnsiString FileName,
  165. const TRemoteFile * File, const TRemoteProperties * Properties);
  166. void __fastcall DoChangeDirectory();
  167. void __fastcall EnsureNonExistence(const AnsiString FileName);
  168. void __fastcall LookupUsersGroups();
  169. void __fastcall FileModified(const TRemoteFile * File, const AnsiString FileName);
  170. int __fastcall FileOperationLoop(TFileOperationEvent CallBackFunc,
  171. TFileOperationProgressType * OperationProgress, bool AllowSkip,
  172. const AnsiString Message, void * Param1 = NULL, void * Param2 = NULL);
  173. bool __fastcall GetIsCapable(TFSCapability Capability) const;
  174. bool __fastcall ProcessFiles(TStrings * FileList, TFileOperation Operation,
  175. TProcessFileEvent ProcessFile, void * Param = NULL, TOperationSide Side = osRemote);
  176. void __fastcall ProcessDirectory(const AnsiString DirName,
  177. TProcessFileEvent CallBackFunc, void * Param = NULL, bool UseCache = false);
  178. AnsiString __fastcall TranslateLockedPath(AnsiString Path, bool Lock);
  179. void __fastcall ReadDirectory(TRemoteFileList * FileList);
  180. void __fastcall CustomReadDirectory(TRemoteFileList * FileList);
  181. void __fastcall DoCreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
  182. bool __fastcall CreateLocalFile(const AnsiString FileName,
  183. TFileOperationProgressType * OperationProgress, HANDLE * AHandle);
  184. void __fastcall OpenLocalFile(const AnsiString FileName, int Access,
  185. int * Attrs, HANDLE * Handle, unsigned long * ACTime, unsigned long * MTime,
  186. unsigned long * ATime, __int64 * Size, bool TryWriteReadOnly = true);
  187. TRemoteFileList * ReadDirectoryListing(AnsiString Directory, bool UseCache);
  188. bool __fastcall HandleException(Exception * E);
  189. void __fastcall CalculateFileSize(AnsiString FileName,
  190. const TRemoteFile * File, /*TCalculateSizeParams*/ void * Size);
  191. void __fastcall DoCalculateDirectorySize(const AnsiString FileName,
  192. const TRemoteFile * File, TCalculateSizeParams * Params);
  193. void __fastcall CalculateLocalFileSize(const AnsiString FileName,
  194. const TSearchRec Rec, /*__int64*/ void * Size);
  195. void __fastcall CalculateLocalFilesSize(TStrings * FileList, __int64 & Size,
  196. const TCopyParamType * CopyParam = NULL);
  197. TStrings * __fastcall GetAdditionalInfo();
  198. int __fastcall ConfirmFileOverwrite(const AnsiString FileName,
  199. const TOverwriteFileParams * FileParams, int Answers, const TQueryParams * Params,
  200. TOperationSide Side, TFileOperationProgressType * OperationProgress);
  201. void __fastcall DoSynchronizeDirectory(const AnsiString LocalDirectory,
  202. const AnsiString RemoteDirectory, TSynchronizeMode Mode,
  203. const TCopyParamType * CopyParam, int Params,
  204. TSynchronizeDirectory OnSynchronizeDirectory);
  205. void __fastcall SynchronizeFile(const AnsiString FileName,
  206. const TRemoteFile * File, /*TSynchronizeData*/ void * Param);
  207. void __fastcall DoSynchronizeProgress(const TSynchronizeData & Data);
  208. void __fastcall DeleteLocalFile(AnsiString FileName,
  209. const TRemoteFile * File, void * Param);
  210. __property TFileOperationProgressType * OperationProgress = { read=FOperationProgress };
  211. public:
  212. __fastcall TTerminal();
  213. __fastcall ~TTerminal();
  214. virtual void __fastcall Open();
  215. virtual void __fastcall Close();
  216. virtual void __fastcall DirectoryModified(const AnsiString Path, bool SubDirs);
  217. virtual void __fastcall DirectoryLoaded(TRemoteFileList * FileList);
  218. bool __fastcall AllowedAnyCommand(const AnsiString Command);
  219. void __fastcall AnyCommand(const AnsiString Command);
  220. void __fastcall CloseOnCompletion(const AnsiString Message = "");
  221. AnsiString __fastcall AbsolutePath(AnsiString Path);
  222. void __fastcall BeginTransaction();
  223. void __fastcall ReadCurrentDirectory();
  224. void __fastcall ReadDirectory(bool ReloadOnly, bool ForceCache = false);
  225. void __fastcall ReadFile(const AnsiString FileName, TRemoteFile *& File);
  226. void __fastcall ReadSymlink(TRemoteFile * SymlinkFile, TRemoteFile *& File);
  227. bool __fastcall CopyToLocal(TStrings * FilesToCopy,
  228. const AnsiString TargetDir, const TCopyParamType * CopyParam, int Params);
  229. bool __fastcall CopyToRemote(TStrings * FilesToCopy,
  230. const AnsiString TargetDir, const TCopyParamType * CopyParam, int Params);
  231. void __fastcall CreateDirectory(const AnsiString DirName,
  232. const TRemoteProperties * Properties = NULL);
  233. void __fastcall CreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
  234. void __fastcall DeleteFile(AnsiString FileName,
  235. const TRemoteFile * File = NULL, void * Recursive = NULL);
  236. bool __fastcall DeleteFiles(TStrings * FilesToDelete, bool * Recursive = NULL);
  237. bool __fastcall DeleteLocalFiles(TStrings * FileList);
  238. void __fastcall CustomCommandOnFile(AnsiString FileName,
  239. const TRemoteFile * File, void * AParams);
  240. void __fastcall CustomCommandOnFiles(AnsiString Command, int Params, TStrings * Files);
  241. void __fastcall ChangeDirectory(const AnsiString Directory);
  242. void __fastcall DoStartup();
  243. void __fastcall EndTransaction();
  244. void __fastcall HomeDirectory();
  245. void __fastcall ChangeFileProperties(AnsiString FileName,
  246. const TRemoteFile * File, /*const TRemoteProperties */ void * Properties);
  247. void __fastcall ChangeFilesProperties(TStrings * FileList,
  248. const TRemoteProperties * Properties);
  249. void __fastcall TerminalError(AnsiString Msg);
  250. void __fastcall TerminalError(Exception * E, AnsiString Msg);
  251. void __fastcall ReloadDirectory();
  252. void __fastcall RefreshDirectory();
  253. void __fastcall RenameFile(const AnsiString FileName, const AnsiString NewName);
  254. void __fastcall RenameFile(const TRemoteFile * File, const AnsiString NewName, bool CheckExistence);
  255. void __fastcall MoveFile(const AnsiString FileName, const TRemoteFile * File,
  256. /*const TMoveFileParams*/ void * Param);
  257. bool __fastcall MoveFiles(TStrings * FileList, const AnsiString Target,
  258. const AnsiString FileMask);
  259. void __fastcall CalculateFilesSize(TStrings * FileList, __int64 & Size,
  260. int Params, const TCopyParamType * CopyParam = NULL);
  261. void __fastcall ClearCaches();
  262. void __fastcall Synchronize(const AnsiString LocalDirectory,
  263. const AnsiString RemoteDirectory, TSynchronizeMode Mode,
  264. const TCopyParamType * CopyParam, int Params,
  265. TSynchronizeDirectory OnSynchronizeDirectory);
  266. bool __fastcall DirectoryFileList(const AnsiString Path,
  267. TRemoteFileList *& FileList, bool CanLoad);
  268. static bool __fastcall IsAbsolutePath(const AnsiString Path);
  269. static AnsiString __fastcall ExpandFileName(AnsiString Path,
  270. const AnsiString BasePath);
  271. __property AnsiString CurrentDirectory = { read = GetCurrentDirectory, write = SetCurrentDirectory };
  272. __property bool ExceptionOnFail = { read = GetExceptionOnFail, write = SetExceptionOnFail };
  273. __property TRemoteDirectory * Files = { read = FFiles };
  274. __property TNotifyEvent OnChangeDirectory = { read = FOnChangeDirectory, write = FOnChangeDirectory };
  275. __property TReadDirectoryEvent OnReadDirectory = { read = FOnReadDirectory, write = FOnReadDirectory };
  276. __property TDirectoryModifiedEvent OnDirectoryModified = { read = FOnDirectoryModified, write = FOnDirectoryModified };
  277. __property TNotifyEvent OnStartReadDirectory = { read = FOnStartReadDirectory, write = FOnStartReadDirectory };
  278. __property TDeleteLocalFileEvent OnDeleteLocalFile = { read = FOnDeleteLocalFile, write = FOnDeleteLocalFile };
  279. __property TUsersGroupsList * Groups = { read = GetGroups };
  280. __property TUsersGroupsList * Users = { read = GetUsers };
  281. __property TFileOperationProgressEvent OnProgress = { read=FOnProgress, write=FOnProgress };
  282. __property TFileOperationFinished OnFinished = { read=FOnFinished, write=FOnFinished };
  283. __property TCurrentFSProtocol FSProtocol = { read = FFSProtocol };
  284. __property AnsiString ProtocolName = { read = GetProtocolName };
  285. __property bool UseBusyCursor = { read = FUseBusyCursor, write = FUseBusyCursor };
  286. __property AnsiString UserName = { read=GetUserName };
  287. __property bool IsCapable[TFSCapability Capability] = { read = GetIsCapable };
  288. __property TStrings * AdditionalInfo = { read = GetAdditionalInfo };
  289. __property bool AreCachesEmpty = { read = GetAreCachesEmpty };
  290. __property bool CommandSessionOpened = { read = GetCommandSessionOpened };
  291. __property TTerminal * CommandSession = { read = GetCommandSession };
  292. };
  293. //---------------------------------------------------------------------------
  294. class TSecondaryTerminal : public TTerminal
  295. {
  296. public:
  297. __fastcall TSecondaryTerminal(TTerminal * MainTerminal);
  298. protected:
  299. virtual void __fastcall DirectoryLoaded(TRemoteFileList * FileList);
  300. virtual void __fastcall DirectoryModified(const AnsiString Path,
  301. bool SubDirs);
  302. virtual bool __fastcall DoPromptUser(AnsiString Prompt, TPromptKind Kind,
  303. AnsiString & Response);
  304. virtual void __fastcall SetSessionData(TSessionData * value);
  305. private:
  306. bool FMasterPasswordTried;
  307. TTerminal * FMainTerminal;
  308. };
  309. //---------------------------------------------------------------------------
  310. class TTerminalList : public TObjectList
  311. {
  312. public:
  313. __fastcall TTerminalList(TConfiguration * AConfiguration);
  314. __fastcall ~TTerminalList();
  315. virtual TTerminal * __fastcall NewTerminal(TSessionData * Data);
  316. virtual void __fastcall FreeTerminal(TTerminal * Terminal);
  317. void __fastcall FreeAndNullTerminal(TTerminal * & Terminal);
  318. virtual void __fastcall Idle();
  319. __property TTerminal * Terminals[int Index] = { read=GetTerminal };
  320. private:
  321. TConfiguration * FConfiguration;
  322. TTerminal * __fastcall GetTerminal(int Index);
  323. };
  324. //---------------------------------------------------------------------------
  325. struct TCustomCommandParams
  326. {
  327. AnsiString Command;
  328. int Params;
  329. };
  330. //---------------------------------------------------------------------------
  331. struct TCalculateSizeParams
  332. {
  333. __int64 Size;
  334. int Params;
  335. const TCopyParamType * CopyParam;
  336. };
  337. //---------------------------------------------------------------------------
  338. struct TOverwriteFileParams
  339. {
  340. __int64 SourceSize;
  341. __int64 DestSize;
  342. TDateTime SourceTimestamp;
  343. TDateTime DestTimestamp;
  344. };
  345. //---------------------------------------------------------------------------
  346. #endif