1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/source/windows/EditorManager.h
Martin Prikryl bf7b9448eb Issue 2232 – Automatically reconnect inactive sessions
https://winscp.net/tracker/2232

Source commit: 083cfa045a8291cdfcc1fe8ce1e510a7d7619e7e
2025-04-08 17:20:29 +02:00

116 lines
4.7 KiB
C++

//---------------------------------------------------------------------------
#ifndef EditorManagerH
#define EditorManagerH
//---------------------------------------------------------------------------
#include <vector>
//---------------------------------------------------------------------------
class TManagedTerminal;
class TTerminalQueue;
//---------------------------------------------------------------------------
struct TEditedFileData
{
TEditedFileData();
~TEditedFileData();
UnicodeString LocalRootDirectory;
UnicodeString RemoteDirectory;
bool ForceText;
TManagedTerminal * Terminal;
TSessionData * SessionData;
UnicodeString SessionName;
UnicodeString OriginalFileName;
UnicodeString Command;
TDateTime SourceTimestamp;
};
//---------------------------------------------------------------------------
typedef void __fastcall (__closure * TEditedFileChangedEvent)
(const UnicodeString & FileName, const TDateTime & Timestamp, TEditedFileData * Data, HANDLE CompleteEvent, bool & Retry);
typedef void __fastcall (__closure * TEditedFileReloadEvent)
(const UnicodeString & FileName, TEditedFileData * Data);
typedef void __fastcall (__closure * TEditedFileEarlyClosedEvent)
(const TEditedFileData * Data, bool & KeepOpen);
typedef void __fastcall (__closure * TEditedFileUploadComplete)
(TObject * Token);
//---------------------------------------------------------------------------
typedef void __fastcall (__closure * TEditedFileProcessEvent)
(const UnicodeString FileName, TEditedFileData * Data, TObject * Token, void * Arg);
//---------------------------------------------------------------------------
class TEditorManager
{
public:
__fastcall TEditorManager();
__fastcall ~TEditorManager();
bool __fastcall Empty(bool IgnoreClosed);
bool __fastcall CanAddFile(const UnicodeString RemoteDirectory,
const UnicodeString OriginalFileName, const UnicodeString SessionName,
TObject *& Token, UnicodeString & ExistingLocalRootDirectory,
UnicodeString & ExistingLocalDirectory);
bool __fastcall CloseInternalEditors(TNotifyEvent CloseCallback);
bool __fastcall CloseExternalFilesWithoutProcess();
void __fastcall AddFileInternal(const UnicodeString FileName,
TEditedFileData * Data, TObject * Token);
void __fastcall AddFileExternal(const UnicodeString FileName,
TEditedFileData * Data, HANDLE Process);
void __fastcall Check();
void __fastcall FileChanged(TObject * Token);
void __fastcall FileReload(TObject * Token);
void __fastcall FileClosed(TObject * Token, bool Forced);
void __fastcall ProcessFiles(TEditedFileProcessEvent Callback, void * Arg);
TEditedFileData * FindByUploadCompleteEvent(HANDLE UploadCompleteEvent);
__property TEditedFileChangedEvent OnFileChange = { read = FOnFileChange, write = FOnFileChange };
__property TEditedFileReloadEvent OnFileReload = { read = FOnFileReload, write = FOnFileReload };
__property TEditedFileEarlyClosedEvent OnFileEarlyClosed = { read = FOnFileEarlyClosed, write = FOnFileEarlyClosed };
__property TEditedFileUploadComplete OnFileUploadComplete = { read = FOnFileUploadComplete, write = FOnFileUploadComplete };
__property TCriticalSection * Section = { read = FSection };
private:
struct TFileData
{
UnicodeString FileName;
bool External;
HANDLE Process;
TObject * Token;
TDateTime Timestamp;
TEditedFileData * Data;
bool Closed;
HANDLE UploadCompleteEvent;
TDateTime Opened;
bool Reupload;
bool Reloading;
unsigned int Saves;
};
std::vector<TFileData> FFiles;
std::vector<HANDLE> FProcesses;
std::vector<HANDLE> FUploadCompleteEvents;
TEditedFileChangedEvent FOnFileChange;
TEditedFileReloadEvent FOnFileReload;
TEditedFileEarlyClosedEvent FOnFileEarlyClosed;
TEditedFileUploadComplete FOnFileUploadComplete;
TCriticalSection * FSection;
void __fastcall AddFile(TFileData & FileData, TEditedFileData * Data);
void UploadComplete(int Index, bool Retry);
bool __fastcall CloseFile(int Index, bool IgnoreErrors, bool Delete);
void __fastcall CloseProcess(int Index);
bool __fastcall EarlyClose(int Index);
bool __fastcall HasFileChanged(int Index, TDateTime & NewTimestamp);
void __fastcall CheckFileChange(int Index, bool Force);
int __fastcall FindFile(const TObject * Token);
void __fastcall ReleaseFile(int Index);
TDateTime NormalizeTimestamp(const TDateTime & Timestamp);
bool GetFileTimestamp(const UnicodeString & FileName, TDateTime & Timestamp);
enum TWaitHandle { PROCESS, EVENT };
int __fastcall WaitFor(unsigned int Count, const HANDLE * Handles,
TWaitHandle WaitFor);
};
//---------------------------------------------------------------------------
#endif