Terminal.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. typedef TStringList TUserGroupsList;
  15. typedef void __fastcall (__closure *TReadDirectoryEvent)(System::TObject* Sender, Boolean ReloadOnly);
  16. typedef void __fastcall (__closure *TProcessFileEvent)
  17. (const AnsiString FileName, const TRemoteFile * File, void * Param);
  18. typedef int __fastcall (__closure *TFileOperationEvent)
  19. (void * Param1, void * Param2);
  20. //---------------------------------------------------------------------------
  21. #define SUSPEND_OPERATION(Command) \
  22. { \
  23. OperationProgress->Suspend(); \
  24. try { \
  25. Command \
  26. } __finally { \
  27. OperationProgress->Resume(); \
  28. } \
  29. }
  30. #define THROW_SKIP_FILE(EXCEPTION, MESSAGE) \
  31. throw EScpSkipFile(EXCEPTION, MESSAGE)
  32. /* TODO : Better user interface (query to user) */
  33. // FILENAME is no longer used
  34. #define FILE_OPERATION_LOOP_EX(FILENAME, ALLOW_SKIP, MESSAGE, OPERATION) { \
  35. bool DoRepeat; \
  36. do { \
  37. DoRepeat = false; \
  38. try { \
  39. OPERATION; \
  40. } \
  41. catch (EAbort & E) \
  42. { \
  43. throw; \
  44. } \
  45. catch (EScpSkipFile & E) \
  46. { \
  47. throw; \
  48. } \
  49. catch (EFatal & E) \
  50. { \
  51. throw; \
  52. } \
  53. catch (Exception & E) \
  54. { \
  55. HandleExtendedException(&E, this); \
  56. int Answers = qaRetry | qaAbort | ((ALLOW_SKIP) ? qaSkip : 0); \
  57. int Answer; \
  58. int Params = qpAllowContinueOnError | (!(ALLOW_SKIP) ? qpFatalAbort : 0); \
  59. SUSPEND_OPERATION ( \
  60. Answer = FTerminal->DoQueryUser(MESSAGE, &E, Answers, Params); \
  61. ); \
  62. DoRepeat = (Answer == qaRetry); \
  63. if (Answer == qaAbort) OperationProgress->Cancel = csCancel; \
  64. if (!DoRepeat && ALLOW_SKIP) THROW_SKIP_FILE(&E, MESSAGE); \
  65. else \
  66. if (!DoRepeat && !ALLOW_SKIP) throw; \
  67. } \
  68. } while (DoRepeat); }
  69. #define FILE_OPERATION_LOOP(FILENAME, MESSAGE, OPERATION) \
  70. FILE_OPERATION_LOOP_EX(FILENAME, True, MESSAGE, OPERATION)
  71. //---------------------------------------------------------------------------
  72. enum TFSCapability { fcUserGroupListing, fcModeChanging, fcGroupChanging,
  73. fcOwnerChanging, fcAnyCommand, fcHardLink, fcSymbolicLink, fcResolveSymlink,
  74. fcTextMode };
  75. //---------------------------------------------------------------------------
  76. const cpDelete = 1;
  77. const cpDragDrop = 4;
  78. const cpTemporary = 4; // alias to cpDragDrop
  79. const cpNoConfirmation = 8;
  80. //---------------------------------------------------------------------------
  81. class TTerminal : public TSecureShell
  82. {
  83. // for TranslateLockedPath()
  84. friend class TRemoteFile;
  85. // for ReactOnCommand()
  86. friend class TSCPFileSystem;
  87. friend class TSFTPFileSystem;
  88. private:
  89. AnsiString FCurrentDirectory;
  90. AnsiString FLockDirectory;
  91. Integer FExceptionOnFail;
  92. TRemoteDirectory * FFiles;
  93. int FInTransaction;
  94. TNotifyEvent FOnChangeDirectory;
  95. TReadDirectoryEvent FOnReadDirectory;
  96. bool FReadCurrentDirectoryPending;
  97. bool FReadDirectoryPending;
  98. TUserGroupsList * FUserGroups;
  99. bool FUserGroupsLookedup;
  100. TFileOperationProgressEvent FOnProgress;
  101. TFileOperationFinished FOnFinished;
  102. TFileOperationProgressType * FOperationProgress;
  103. bool FUseBusyCursor;
  104. TRemoteDirectoryCache * FDirectoryCache;
  105. TCustomFileSystem * FFileSystem;
  106. void __fastcall CommandError(Exception * E, const AnsiString Msg);
  107. int __fastcall CommandError(Exception * E, const AnsiString Msg, int Answers);
  108. AnsiString __fastcall GetCurrentDirectory();
  109. bool __fastcall GetExceptionOnFail() const;
  110. AnsiString __fastcall GetProtocolName();
  111. TUserGroupsList * __fastcall GetUserGroups();
  112. void __fastcall SetCurrentDirectory(AnsiString value);
  113. void __fastcall SetExceptionOnFail(bool value);
  114. void __fastcall ReactOnCommand(int /*TFSCommand*/ Cmd);
  115. AnsiString __fastcall GetUserName() const;
  116. protected:
  117. void __fastcall DoReadDirectory(bool ReloadOnly);
  118. void __fastcall DoCreateDirectory(const AnsiString DirName,
  119. const TRemoteProperties * Properties);
  120. void __fastcall DoDeleteFile(const AnsiString FileName,
  121. const TRemoteFile * File, void * Param);
  122. void __fastcall DoCustomCommandOnFile(AnsiString FileName,
  123. const TRemoteFile * File, AnsiString Command);
  124. void __fastcall DoRenameFile(const AnsiString FileName, const AnsiString NewName);
  125. void __fastcall DoChangeFileProperties(const AnsiString FileName,
  126. const TRemoteFile * File, const TRemoteProperties * Properties);
  127. void __fastcall DoChangeDirectory();
  128. void __fastcall EnsureNonExistence(const AnsiString FileName);
  129. void __fastcall LookupUserGroups();
  130. void __fastcall FileModified(const TRemoteFile * File);
  131. int __fastcall FileOperationLoop(TFileOperationEvent CallBackFunc,
  132. TFileOperationProgressType * OperationProgress, bool AllowSkip,
  133. const AnsiString Message, void * Param1 = NULL, void * Param2 = NULL);
  134. bool __fastcall GetIsCapable(TFSCapability Capability) const;
  135. void __fastcall DirectoryModified(const AnsiString Path, bool SubDirs);
  136. void __fastcall ProcessFiles(TStrings * FileList,
  137. TFileOperation Operation, TProcessFileEvent ProcessFile, void * Param = NULL);
  138. void __fastcall ProcessDirectory(const AnsiString DirName,
  139. TProcessFileEvent CallBackFunc, void * Param = NULL);
  140. AnsiString __fastcall TranslateLockedPath(AnsiString Path, bool Lock);
  141. void __fastcall ReadDirectory(TRemoteFileList * FileList);
  142. void __fastcall CustomReadDirectory(TRemoteFileList * FileList);
  143. void __fastcall DoCreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
  144. void __fastcall OpenLocalFile(const AnsiString FileName, int Access,
  145. int * Attrs, HANDLE * Handle, unsigned long * ACTime, unsigned long * MTime,
  146. unsigned long * ATime, __int64 * Size);
  147. TRemoteFileList * ReadDirectoryListing(AnsiString Directory);
  148. bool __fastcall HandleException(Exception * E);
  149. __property TFileOperationProgressType * OperationProgress = { read=FOperationProgress };
  150. public:
  151. __fastcall TTerminal();
  152. __fastcall ~TTerminal();
  153. virtual void __fastcall Open();
  154. virtual void __fastcall Close();
  155. void __fastcall AnyCommand(const AnsiString Command);
  156. void __fastcall CloseOnCompletion(const AnsiString Message = "");
  157. void __fastcall BeginTransaction();
  158. void __fastcall ReadCurrentDirectory();
  159. void __fastcall ReadDirectory(bool ReloadOnly);
  160. void __fastcall ReadFile(const AnsiString FileName, TRemoteFile *& File);
  161. void __fastcall ReadSymlink(TRemoteFile * SymlinkFile, TRemoteFile *& File);
  162. void __fastcall CopyToLocal(TStrings * FilesToCopy,
  163. const AnsiString TargetDir, const TCopyParamType * CopyParam, int Params);
  164. void __fastcall CopyToRemote(TStrings * FilesToCopy,
  165. const AnsiString TargetDir, const TCopyParamType * CopyParam, int Params);
  166. void __fastcall CreateDirectory(const AnsiString DirName,
  167. const TRemoteProperties * Properties = NULL);
  168. void __fastcall CreateLink(const AnsiString FileName, const AnsiString PointTo, bool Symbolic);
  169. void __fastcall DeleteFile(AnsiString FileName,
  170. const TRemoteFile * File = NULL, void * Recursive = NULL);
  171. void __fastcall DeleteFiles(TStrings * FilesToDelete, bool * Recursive = NULL);
  172. void __fastcall CustomCommandOnFile(AnsiString FileName,
  173. const TRemoteFile * File, void * ACommand);
  174. void __fastcall CustomCommandOnFiles(AnsiString Command, TStrings * Files);
  175. void __fastcall ChangeDirectory(const AnsiString Directory);
  176. void __fastcall DoStartup();
  177. void __fastcall EndTransaction();
  178. void __fastcall HomeDirectory();
  179. void __fastcall ChangeFileProperties(AnsiString FileName,
  180. const TRemoteFile * File, /*const TRemoteProperties */ void * Properties);
  181. void __fastcall ChangeFilesProperties(TStrings * FileList,
  182. const TRemoteProperties * Properties);
  183. void __fastcall TerminalError(AnsiString Msg);
  184. void __fastcall TerminalError(Exception * E, AnsiString Msg);
  185. void __fastcall ReloadDirectory();
  186. void __fastcall RenameFile(const AnsiString FileName, const AnsiString NewName);
  187. void __fastcall RenameFile(const TRemoteFile * File, const AnsiString NewName, bool CheckExistence);
  188. __property AnsiString CurrentDirectory = { read = GetCurrentDirectory, write = SetCurrentDirectory };
  189. __property bool ExceptionOnFail = { read = GetExceptionOnFail, write = SetExceptionOnFail };
  190. __property TRemoteDirectory * Files = { read = FFiles };
  191. __property TNotifyEvent OnChangeDirectory = { read = FOnChangeDirectory, write = FOnChangeDirectory };
  192. __property TReadDirectoryEvent OnReadDirectory = { read = FOnReadDirectory, write = FOnReadDirectory };
  193. __property TUserGroupsList * UserGroups = { read = GetUserGroups };
  194. __property TFileOperationProgressEvent OnProgress = { read=FOnProgress, write=FOnProgress };
  195. __property TFileOperationFinished OnFinished = { read=FOnFinished, write=FOnFinished };
  196. __property AnsiString ProtocolName = { read = GetProtocolName };
  197. __property bool UseBusyCursor = { read = FUseBusyCursor, write = FUseBusyCursor };
  198. __property AnsiString UserName = { read=GetUserName };
  199. __property bool IsCapable[TFSCapability Capability] = { read = GetIsCapable };
  200. };
  201. //---------------------------------------------------------------------------
  202. class TTerminalList : public TObjectList
  203. {
  204. public:
  205. __fastcall TTerminalList(TConfiguration * AConfiguration);
  206. __fastcall ~TTerminalList();
  207. virtual TTerminal * __fastcall NewTerminal(TSessionData * Data);
  208. virtual void __fastcall FreeTerminal(TTerminal * Terminal);
  209. void __fastcall FreeAndNullTerminal(TTerminal * & Terminal);
  210. virtual void __fastcall Idle();
  211. __property TTerminal * Terminals[int Index] = { read=GetTerminal };
  212. private:
  213. TConfiguration * FConfiguration;
  214. TTerminal * __fastcall GetTerminal(int Index);
  215. };
  216. //---------------------------------------------------------------------------
  217. #endif