TerminalManager.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. //---------------------------------------------------------------------------
  2. #ifndef TerminalManagerH
  3. #define TerminalManagerH
  4. //---------------------------------------------------------------------------
  5. #include <Terminal.h>
  6. #include <Queue.h>
  7. #include <FileOperationProgress.h>
  8. #include <WinInterface.h>
  9. #include <Vcl.AppEvnts.hpp>
  10. #include <deque>
  11. //---------------------------------------------------------------------------
  12. class TCustomScpExplorerForm;
  13. class TTerminalQueue;
  14. class TAuthenticateForm;
  15. struct ITaskbarList3;
  16. class TThumbnailDownloadQueueItem;
  17. //---------------------------------------------------------------------------
  18. enum TTerminalPendingAction { tpNull, tpNone, tpReconnect, tpFree };
  19. //---------------------------------------------------------------------------
  20. struct TRemoteThumbnailNeeded
  21. {
  22. int Index;
  23. TRemoteFile * File;
  24. TSize ThumbnailSize;
  25. };
  26. //---------------------------------------------------------------------------
  27. struct TRemoteThumbnailData
  28. {
  29. UnicodeString FileName;
  30. TBitmap * Thumbnail;
  31. TSize ThumbnailSize;
  32. };
  33. //---------------------------------------------------------------------------
  34. typedef std::map<int, TRemoteThumbnailData> TRemoteThumbnailsMap;
  35. typedef std::deque<TRemoteThumbnailNeeded> TRemoteThumbnailsQueue;
  36. //---------------------------------------------------------------------------
  37. class TManagedTerminal : public TTerminal
  38. {
  39. public:
  40. __fastcall TManagedTerminal(TSessionData * SessionData, TConfiguration * Configuration);
  41. virtual __fastcall ~TManagedTerminal();
  42. void StartLoadingDirectory();
  43. void DisableThumbnails();
  44. void ThumbnailVisible(int Index, const UnicodeString & FileName, bool Visible);
  45. void PopThumbnailQueue();
  46. bool LocalBrowser;
  47. TSessionData * StateData;
  48. TObject * LocalExplorerState;
  49. TObject * RemoteExplorerState;
  50. TObject * OtherLocalExplorerState;
  51. TDateTime ReopenStart;
  52. TDateTime DirectoryLoaded;
  53. TTerminalThread * TerminalThread;
  54. TDateTime QueueOperationStart;
  55. // To distinguish sessions that were explicitly disconnected and
  56. // should not be reconnected when their tab is activated.
  57. bool Disconnected;
  58. bool DisconnectedTemporarily;
  59. // Sessions that should not close when they fail to connect
  60. // (i.e. those that were ever connected or were opened as a part of a workspace)
  61. bool Permanent;
  62. std::unique_ptr<TCriticalSection> ThumbnailsSection;
  63. bool ThumbnailsEnabled;
  64. TThumbnailDownloadQueueItem * ThumbnailDownloadQueueItem;
  65. UnicodeString InactiveTerminationMessage;
  66. TDateTime NextInactiveReconnect;
  67. TDateTime LastInactiveSave;
  68. UnicodeString OrigRemoteDirectory;
  69. TRemoteThumbnailsMap Thumbnails;
  70. TRemoteThumbnailsQueue ThumbnailsQueue;
  71. int ThumbnailVisibleResult;
  72. private:
  73. void ReleaseThumbnails();
  74. };
  75. //---------------------------------------------------------------------------
  76. class TTerminalManager : public TTerminalList
  77. {
  78. public:
  79. static TTerminalManager * __fastcall Instance(bool ForceCreation = true);
  80. static void __fastcall DestroyInstance();
  81. __fastcall TTerminalManager();
  82. __fastcall ~TTerminalManager();
  83. TManagedTerminal * __fastcall NewManagedTerminal(TSessionData * Data);
  84. TManagedTerminal * __fastcall NewLocalBrowser(
  85. const UnicodeString & LocalDirectory = UnicodeString(), const UnicodeString & OtherLocalDirectory = UnicodeString());
  86. TManagedTerminal * __fastcall NewSessions(TList * DataList);
  87. virtual void __fastcall FreeTerminal(TTerminal * Terminal);
  88. void __fastcall Move(TTerminal * Source, TTerminal * Target);
  89. void __fastcall DisconnectActiveTerminalIfPermanentFreeOtherwise();
  90. void __fastcall DisconnectActiveTerminal();
  91. void __fastcall ReconnectActiveTerminal();
  92. void __fastcall FreeActiveTerminal();
  93. void __fastcall CycleTerminals(bool Forward);
  94. bool __fastcall ConnectTerminal(TTerminal * Terminal);
  95. void __fastcall SetActiveTerminalWithAutoReconnect(TManagedTerminal * value);
  96. void __fastcall UpdateAppTitle();
  97. bool __fastcall CanOpenInPutty();
  98. void __fastcall OpenInPutty();
  99. void __fastcall NewSession(
  100. const UnicodeString & SessionUrl, bool ReloadSessions = true, TForm * LinkedForm = NULL, bool ReplaceExisting = false);
  101. void NewLocalSession(const UnicodeString & LocalDirectory = UnicodeString(), const UnicodeString & OtherLocalDirectory = UnicodeString());
  102. void __fastcall Idle(bool SkipCurrentTerminal);
  103. UnicodeString __fastcall GetSessionTitle(TManagedTerminal * Terminal, bool Unique);
  104. UnicodeString FormatTerminalNoteMessage(TManagedTerminal * Terminal, const UnicodeString & Message);
  105. UnicodeString __fastcall GetActiveSessionAppTitle();
  106. UnicodeString __fastcall GetAppProgressTitle();
  107. UnicodeString __fastcall FormatFormCaptionWithSession(TCustomForm * Form, const UnicodeString & Caption);
  108. void __fastcall HandleException(Exception * E);
  109. void __fastcall SaveWorkspace(TList * DataList);
  110. void __fastcall QueueStatusUpdated();
  111. bool IsOpenedTerminal(TTerminal * Terminal);
  112. bool IsReconnectingTerminal(TTerminal * Terminal);
  113. bool IsAvailableTerminal(TTerminal * Terminal);
  114. bool IsAvailableTerminalForSite(TTerminal * Terminal, TSessionData * Data);
  115. TManagedTerminal * __fastcall FindActiveTerminalForSite(TSessionData * Data);
  116. TTerminalQueue * __fastcall FindQueueForTerminal(TTerminal * Terminal);
  117. bool __fastcall UploadPublicKey(TTerminal * Terminal, TSessionData * Data, UnicodeString & FileName);
  118. UnicodeString GetPathForSessionTabName(const UnicodeString & Result);
  119. bool HookFatalExceptionMessageDialog(TMessageParams & Params);
  120. void UnhookFatalExceptionMessageDialog();
  121. bool ScheduleTerminalReconnnect(TTerminal * Terminal);
  122. TBitmap * ThumbnailNeeded(TManagedTerminal * Terminal, int Index, TRemoteFile * File, const TSize & Size);
  123. void TerminalLoadedDirectory(TManagedTerminal * ATerminal);
  124. __property TCustomScpExplorerForm * ScpExplorer = { read = FScpExplorer, write = SetScpExplorer };
  125. __property TManagedTerminal * ActiveSession = { read = FActiveSession, write = SetActiveSession };
  126. __property TManagedTerminal * ActiveTerminal = { read = GetActiveTerminal };
  127. __property TTerminalQueue * ActiveQueue = { read = GetActiveQueue };
  128. __property int ActiveSessionIndex = { read = GetActiveSessionIndex, write = SetActiveSessionIndex };
  129. __property TStrings * SessionList = { read = GetSessionList };
  130. __property TTerminal * LocalTerminal = { read = FLocalTerminal };
  131. __property TManagedTerminal * Sessions[int Index] = { read = GetSession };
  132. __property bool Updating = { read = IsUpdating };
  133. __property TManagedTerminal * ReconnectingInactiveTerminal = { read = FReconnectingInactiveTerminal };
  134. protected:
  135. virtual TTerminal * __fastcall CreateTerminal(TSessionData * Data);
  136. void __fastcall DoConnectTerminal(TTerminal * Terminal, bool Reopen, bool AdHoc);
  137. virtual TTerminal * __fastcall NewTerminal(TSessionData * Data);
  138. private:
  139. static TTerminalManager * FInstance;
  140. TCustomScpExplorerForm * FScpExplorer;
  141. TManagedTerminal * FActiveSession;
  142. TManagedTerminal * FTerminalWithFatalExceptionTimer;
  143. bool FTerminalReconnnecteScheduled;
  144. TTerminal * FLocalTerminal;
  145. bool FDestroying;
  146. TTerminalPendingAction FTerminalPendingAction;
  147. TStrings * FSessionList;
  148. TList * FQueues;
  149. UnicodeString FProgressTitle;
  150. UnicodeString FForegroundProgressTitle;
  151. TDateTime FDirectoryReadingStart;
  152. TAuthenticateForm * FAuthenticateForm;
  153. TCriticalSection * FQueueSection;
  154. DWORD FMainThread;
  155. int FPendingConfigurationChange;
  156. std::unique_ptr<TCriticalSection> FChangeSection;
  157. std::vector<std::pair<TTerminalQueue *, TQueueEvent> > FQueueEvents;
  158. unsigned int FTaskbarButtonCreatedMessage;
  159. ITaskbarList3 * FTaskbarList;
  160. int FAuthenticating;
  161. void * FBusyToken;
  162. bool FAuthenticationCancelled;
  163. std::unique_ptr<TApplicationEvents> FApplicationsEvents;
  164. bool FKeepAuthenticateForm;
  165. int FUpdating;
  166. int FMaxSessions;
  167. TTerminal * FOpeningTerminal;
  168. TManagedTerminal * FReconnectingInactiveTerminal;
  169. UnicodeString FReconnectingNote;
  170. bool __fastcall ConnectActiveTerminalImpl(bool Reopen);
  171. bool __fastcall ConnectActiveTerminal();
  172. TTerminalQueue * __fastcall NewQueue(TTerminal * Terminal);
  173. void __fastcall SetScpExplorer(TCustomScpExplorerForm * value);
  174. void UpdateScpExplorer();
  175. void UpdateScpExplorer(TManagedTerminal * Session, TTerminalQueue * Queue);
  176. void __fastcall DoSetActiveSession(TManagedTerminal * value, bool AutoReconnect, bool LastTerminalClosed);
  177. void __fastcall SetActiveSession(TManagedTerminal * value);
  178. TManagedTerminal * GetActiveTerminal();
  179. void __fastcall UpdateAll();
  180. void __fastcall ApplicationException(TObject * Sender, Exception * E);
  181. void __fastcall ApplicationShowHint(UnicodeString & HintStr, bool & CanShow,
  182. THintInfo & HintInfo);
  183. void __fastcall ApplicationMessage(TMsg & Msg, bool & Handled);
  184. void __fastcall ConfigurationChange(TObject * Sender);
  185. void __fastcall TerminalUpdateStatus(TTerminal * Terminal, bool Active);
  186. void __fastcall TerminalQueryUser(TObject * Sender,
  187. const UnicodeString Query, TStrings * MoreMessages, unsigned int Answers,
  188. const TQueryParams * Params, unsigned int & Answer, TQueryType Type, void * Arg);
  189. void __fastcall TerminalPromptUser(TTerminal * Terminal,
  190. TPromptKind Kind, UnicodeString Name, UnicodeString Instructions, TStrings * Prompt,
  191. TStrings * Results, bool & Result, void * Arg);
  192. void __fastcall TerminalDisplayBanner(TTerminal * Terminal,
  193. UnicodeString SessionName, const UnicodeString & Banner, bool & NeverShowAgain,
  194. int Options, unsigned int & Params);
  195. void __fastcall TerminalShowExtendedException(TTerminal * Terminal,
  196. Exception * E, void * Arg);
  197. void __fastcall TerminalReadDirectoryProgress(TObject * Sender, int Progress,
  198. int ResolvedLinks, bool & Cancel);
  199. void __fastcall TerminalInformation(
  200. TTerminal * Terminal, const UnicodeString & Str, int Phase, const UnicodeString & Additional);
  201. void __fastcall TerminalCustomCommand(TTerminal * Terminal, const UnicodeString & Command, bool & Handled);
  202. void __fastcall FreeAll();
  203. void __fastcall SessionReady();
  204. TStrings * __fastcall GetSessionList();
  205. int __fastcall GetActiveSessionIndex();
  206. TTerminalQueue * __fastcall GetActiveQueue();
  207. void __fastcall SaveTerminal(TTerminal * Terminal);
  208. void __fastcall SetActiveSessionIndex(int value);
  209. void __fastcall OperationFinished(::TFileOperation Operation, TOperationSide Side,
  210. bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
  211. TOnceDoneOperation & OnceDoneOperation);
  212. void __fastcall OperationProgress(TFileOperationProgressType & ProgressData);
  213. void __fastcall DeleteLocalFile(const UnicodeString FileName, bool Alternative, int & Deleted);
  214. void __fastcall QueueEvent(TTerminalQueue * Queue, TQueueEvent Event);
  215. TAuthenticateForm * __fastcall MakeAuthenticateForm(TTerminal * Terminal);
  216. void __fastcall MasterPasswordPrompt();
  217. void __fastcall FileNameInputDialogInitializeRenameBaseName(
  218. TObject * Sender, TInputDialogData * Data);
  219. void __fastcall InitTaskbarButtonCreatedMessage();
  220. void __fastcall ReleaseTaskbarList();
  221. void __fastcall CreateTaskbarList();
  222. void __fastcall UpdateTaskbarList();
  223. void __fastcall AuthenticateFormCancel(TObject * Sender);
  224. void __fastcall DoSessionListChanged();
  225. TManagedTerminal * __fastcall DoNewSession(TSessionData * Data);
  226. static void __fastcall TerminalThreadIdle(void * Data, TObject * Sender);
  227. void __fastcall SetQueueConfiguration(TTerminalQueue * Queue);
  228. void __fastcall ApplicationModalBegin(TObject * Sender);
  229. void __fastcall ApplicationModalEnd(TObject * Sender);
  230. bool __fastcall HandleMouseWheel(WPARAM WParam, LPARAM LParam);
  231. void __fastcall DoConfigurationChange();
  232. bool __fastcall ShouldDisplayQueueStatusOnAppTitle();
  233. void __fastcall SetupTerminal(TTerminal * Terminal);
  234. void __fastcall CloseAutheticateForm();
  235. void __fastcall AuthenticatingDone();
  236. TManagedTerminal * __fastcall CreateManagedTerminal(TSessionData * Data);
  237. TManagedTerminal * __fastcall GetSession(int Index);
  238. bool IsUpdating();
  239. bool SupportedSession(TSessionData * Data);
  240. void __fastcall TerminalFatalExceptionTimer(unsigned int & Result);
  241. void NeedThumbnailDownloadQueueItem(TManagedTerminal * ATerminal);
  242. void StartInactiveTerminalReconnect(TManagedTerminal * Terminal);
  243. void CheckInactiveTerminalReconnect();
  244. TTerminalThread * CreateTerminalThread(TTerminal * Terminal);
  245. void ReconnectingTerminal(TManagedTerminal * ManagedTerminal);
  246. void ReconnectedTerminal(TManagedTerminal * ManagedTerminal);
  247. void FreeTerminalCleanup(TTerminal * ATerminal, bool IsActiveSession);
  248. };
  249. //---------------------------------------------------------------------------
  250. class TThumbnailDownloadQueueItem : public TTransferQueueItem
  251. {
  252. public:
  253. TThumbnailDownloadQueueItem(
  254. TCustomScpExplorerForm * ScpExplorer, TManagedTerminal * Terminal, const UnicodeString & SourceDir,
  255. const UnicodeString & TargetDir, const TCopyParamType * CopyParam);
  256. __fastcall ~TThumbnailDownloadQueueItem();
  257. protected:
  258. virtual void __fastcall DoTransferExecute(TTerminal * Terminal, TParallelOperation * ParallelOperation);
  259. private:
  260. TManagedTerminal * FManagedTerminal;
  261. TCustomScpExplorerForm * FScpExplorer;
  262. bool Continue();
  263. bool CheckQueueFront(int Index, const UnicodeString & FileName, TSize ThumbnailSize);
  264. };
  265. //---------------------------------------------------------------------------
  266. #endif