1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/source/core/Script.h
Martin Prikryl 3dcb30ca22 Issue 2342 – Command-line interface for installing public key into server
https://winscp.net/tracker/2342

Source commit: 4dee00b059312367058fa5bcccac2cc187ad14a3
2025-01-25 01:04:17 +01:00

283 lines
14 KiB
C++

//---------------------------------------------------------------------------
#ifndef ScriptH
#define ScriptH
//---------------------------------------------------------------------------
#include <time.h>
#include "Option.h"
#include "Terminal.h"
#include "FileOperationProgress.h"
//---------------------------------------------------------------------------
class TTerminal;
class TScript;
class TScriptCommands;
class TStoredSessionList;
class TTerminalList;
//---------------------------------------------------------------------------
class TScriptProgress
{
public:
TFileOperation Operation;
TOperationSide Side;
UnicodeString FileName;
UnicodeString Directory;
unsigned int OverallProgress;
unsigned int FileProgress;
unsigned int CPS;
bool Cancel;
};
//---------------------------------------------------------------------------
typedef void __fastcall (__closure *TScriptPrintEvent)(TScript * Script, const UnicodeString Str, bool Error);
typedef void __fastcall (__closure *TScriptSynchronizeStartStop)(TScript * Script,
const UnicodeString LocalDirectory, const UnicodeString RemoteDirectory,
const TCopyParamType & CopyParam, int SynchronizeParams);
typedef void __fastcall (__closure *TScriptProgressEvent)(TScript * Script, TScriptProgress & Progress);
//---------------------------------------------------------------------------
class TScriptProcParams : public TOptions
{
public:
__fastcall TScriptProcParams(const UnicodeString & FullCommand, const UnicodeString & ParamsStr);
__property UnicodeString ParamsStr = { read = FParamsStr };
__property UnicodeString FullCommand = { read = FFullCommand };
private:
UnicodeString FParamsStr;
UnicodeString FFullCommand;
};
//---------------------------------------------------------------------------
class TScript
{
public:
enum TBatchMode { BatchOff, BatchOn, BatchAbort, BatchContinue };
__fastcall TScript(bool LimitedOutput);
virtual __fastcall ~TScript();
void __fastcall Command(UnicodeString Cmd);
void __fastcall Log(TLogLineType Type, const UnicodeString & Str, TTerminal * ATerminal = NULL);
void __fastcall PrintLine(const UnicodeString Str, bool Error = false, TTerminal * ATerminal = NULL);
void __fastcall StartInteractive();
void __fastcall Synchronize(const UnicodeString LocalDirectory,
const UnicodeString RemoteDirectory, const TCopyParamType & CopyParam,
int SynchronizeParams, TSynchronizeChecklist ** Checklist);
static void __fastcall RequireParams(TScriptProcParams * Parameters, int MinParams);
__property TScriptPrintEvent OnPrint = { read = FOnPrint, write = FOnPrint };
__property TExtendedExceptionEvent OnShowExtendedException = { read = FOnShowExtendedException, write = FOnShowExtendedException };
__property TSynchronizeDirectory OnTerminalSynchronizeDirectory = { read = FOnTerminalSynchronizeDirectory, write = FOnTerminalSynchronizeDirectory };
__property TScriptSynchronizeStartStop OnSynchronizeStartStop = { read = FOnSynchronizeStartStop, write = FOnSynchronizeStartStop };
__property TScriptProgressEvent OnProgress = { read = FOnProgress, write = FOnProgress };
__property TCopyParamType CopyParam = { read = FCopyParam, write = SetCopyParam };
__property int SynchronizeParams = { read = FSynchronizeParams, write = SetSynchronizeParams };
__property TBatchMode Batch = { read = FBatch };
__property TTerminal * Terminal = { read = FTerminal };
__property bool Groups = { read = FGroups, write = FGroups };
__property bool WantsProgress = { read = FWantsProgress, write = FWantsProgress };
__property bool UsageWarnings = { read = FUsageWarnings, write = FUsageWarnings };
__property TTransferOutEvent OnTransferOut = { read = FOnTransferOut, write = FOnTransferOut };
__property TTransferInEvent OnTransferIn = { read = FOnTransferIn, write = FOnTransferIn };
protected:
TTerminal * FTerminal;
TTerminal * FLoggingTerminal;
TScriptCommands * FCommands;
TScriptPrintEvent FOnPrint;
TExtendedExceptionEvent FOnShowExtendedException;
TSynchronizeDirectory FOnTerminalSynchronizeDirectory;
TScriptSynchronizeStartStop FOnSynchronizeStartStop;
TScriptProgressEvent FOnProgress;
TCopyParamType FCopyParam;
bool FIncludeFileMaskOptionUsed;
TBatchMode FBatch;
TBatchMode FInteractiveBatch;
bool FConfirm;
bool FInteractiveConfirm;
bool FEcho;
bool FFailOnNoMatch;
int FSynchronizeParams;
int FSynchronizeMode;
bool FKeepingUpToDate;
UnicodeString FSynchronizeIntro;
bool FLimitedOutput;
int FSessionReopenTimeout;
int FInteractiveSessionReopenTimeout;
bool FGroups;
bool FWantsProgress;
bool FUsageWarnings;
TTransferOutEvent FOnTransferOut;
TTransferInEvent FOnTransferIn;
TStrings * FPendingLogLines;
bool FWarnNonDefaultCopyParam;
bool FWarnNonDefaultSynchronizeParams;
bool FPrintInformation;
virtual void __fastcall ResetTransfer();
virtual void __fastcall ConnectTerminal(TTerminal * ATerminal);
bool __fastcall EnsureCommandSessionFallback(
TFSCapability Capability, TSessionAction * Action);
void __fastcall Print(const UnicodeString Str, bool Error = false);
void __fastcall CheckSession();
void __fastcall CheckParams(TScriptProcParams * Parameters);
void __fastcall CopyParamParams(TCopyParamType & CopyParam, TScriptProcParams * Parameters);
void __fastcall TransferParamParams(int & Params, TScriptProcParams * Parameters);
enum TFileListType
{
fltDefault = 0x00,
fltDirectories = 0x01,
fltQueryServer = 0x02,
fltMask = 0x04,
fltLatest = 0x08,
fltOnlyFile = 0x10,
};
TStrings * __fastcall CreateFileList(TScriptProcParams * Parameters, int Start,
int End, TFileListType ListType = fltDefault);
TStrings * __fastcall CreateLocalFileList(TScriptProcParams * Parameters,
int Start, int End, TFileListType ListType);
void __fastcall FreeFiles(TStrings * FileList);
void __fastcall FreeFileList(TStrings * FileList);
void __fastcall LogPendingLines(TTerminal * ATerminal);
void __fastcall HelpProc(TScriptProcParams * Parameters);
void __fastcall CallProc(TScriptProcParams * Parameters);
void __fastcall PwdProc(TScriptProcParams * Parameters);
void __fastcall CdProc(TScriptProcParams * Parameters);
void __fastcall LsProc(TScriptProcParams * Parameters);
void __fastcall RmProc(TScriptProcParams * Parameters);
void __fastcall RmDirProc(TScriptProcParams * Parameters);
void __fastcall MvProc(TScriptProcParams * Parameters);
void __fastcall CpProc(TScriptProcParams * Parameters);
void __fastcall ChModProc(TScriptProcParams * Parameters);
void __fastcall LnProc(TScriptProcParams * Parameters);
void __fastcall MkDirProc(TScriptProcParams * Parameters);
void __fastcall GetProc(TScriptProcParams * Parameters);
void __fastcall PutProc(TScriptProcParams * Parameters);
void __fastcall OptionProc(TScriptProcParams * Parameters);
void __fastcall AsciiProc(TScriptProcParams * Parameters);
void __fastcall BinaryProc(TScriptProcParams * Parameters);
void __fastcall SynchronizeProc(TScriptProcParams * Parameters);
void __fastcall KeepUpToDateProc(TScriptProcParams * Parameters);
void __fastcall EchoProc(TScriptProcParams * Parameters);
void __fastcall StatProc(TScriptProcParams * Parameters);
void __fastcall ChecksumProc(TScriptProcParams * Parameters);
void __fastcall CopyIdProc(TScriptProcParams * Parameters);
void __fastcall OptionImpl(UnicodeString OptionName, UnicodeString ValueName);
void __fastcall SynchronizeDirectories(TScriptProcParams * Parameters,
UnicodeString & LocalDirectory, UnicodeString & RemoteDirectory, int FirstParam);
virtual bool __fastcall HandleExtendedException(Exception * E,
TTerminal * Terminal = NULL);
void __fastcall TerminalCaptureLog(const UnicodeString & AddedLine, TCaptureOutputType OutputType);
virtual UnicodeString __fastcall GetLogCmd(const UnicodeString & FullCommand,
const UnicodeString & Command, const UnicodeString & Params);
void __fastcall SynchronizePreview(
UnicodeString LocalDirectory, UnicodeString RemoteDirectory,
TSynchronizeChecklist * Checklist);
UnicodeString __fastcall SynchronizeFileRecord(
const UnicodeString & RootDirectory, const TSynchronizeChecklist::TItem * Item,
bool Local);
UnicodeString __fastcall ListingSysErrorMessage();
void __fastcall NoMatch(const UnicodeString & Mask, const UnicodeString & Error);
void __fastcall NoMatch(const UnicodeString & Message);
private:
void __fastcall Init();
void __fastcall SetCopyParam(const TCopyParamType & value);
void __fastcall SetSynchronizeParams(int value);
TTransferMode __fastcall ParseTransferModeName(UnicodeString Name);
inline bool __fastcall IsTerminalLogging(TTerminal * ATerminal);
void __fastcall CheckDefaultCopyParam();
bool __fastcall HasNonDefaultCopyParams();
void __fastcall CheckDefaultSynchronizeParams();
void __fastcall CheckMultiFilesToOne(TStrings * FileList, const UnicodeString & Target, bool Unix);
void __fastcall LogOption(const UnicodeString & LogStr);
void __fastcall DoMvOrCp(TScriptProcParams * Parameters, TFSCapability Capability, bool Cp);
void __fastcall DoCalculatedChecksum(
const UnicodeString & FileName, const UnicodeString & Alg, const UnicodeString & Hash);
};
//---------------------------------------------------------------------------
typedef void __fastcall (__closure *TScriptInputEvent)(TScript * Script, const UnicodeString Prompt, UnicodeString & Str);
typedef void __fastcall (__closure *TScriptQueryCancelEvent)(TScript * Script, bool & Cancel);
typedef void __fastcall (__closure *TScriptPrintProgressEvent)(TScript * Script, bool First, const UnicodeString Str);
//---------------------------------------------------------------------------
class TManagementScript : public TScript
{
public:
__fastcall TManagementScript(TStoredSessionList * StoredSessions, bool LimitedOutput);
virtual __fastcall ~TManagementScript();
void __fastcall Connect(const UnicodeString Session, TOptions * Options, bool CheckParams);
void __fastcall ReflectSettings();
void __fastcall MaskPasswordInCommandLine(UnicodeString & Command, bool Recurse);
__property TScriptInputEvent OnInput = { read = FOnInput, write = FOnInput };
__property TScriptQueryCancelEvent OnQueryCancel = { read = FOnQueryCancel, write = FOnQueryCancel };
__property TPromptUserEvent OnTerminalPromptUser = { read = FOnTerminalPromptUser, write = FOnTerminalPromptUser };
__property TQueryUserEvent OnTerminalQueryUser = { read = FOnTerminalQueryUser, write = FOnTerminalQueryUser };
__property TScriptPrintProgressEvent OnPrintProgress = { read = FOnPrintProgress, write = FOnPrintProgress };
__property bool Continue = { read = FContinue };
protected:
TScriptInputEvent FOnInput;
TScriptQueryCancelEvent FOnQueryCancel;
TPromptUserEvent FOnTerminalPromptUser;
TQueryUserEvent FOnTerminalQueryUser;
TScriptPrintProgressEvent FOnPrintProgress;
TStoredSessionList * FStoredSessions;
TTerminalList * FTerminalList;
UnicodeString FLastProgressFile;
UnicodeString FLastProgressMessage;
time_t FLastProgressTime;
time_t FLastProgressEventTime;
UnicodeString FLastProgressEventDoneFileName;
bool FLastProgressOverallDone;
bool FContinue;
virtual void __fastcall ResetTransfer();
void __fastcall Input(const UnicodeString Prompt, UnicodeString & Str, bool AllowEmpty);
void __fastcall TerminalInformation(
TTerminal * Terminal, const UnicodeString & Str, int Phase, const UnicodeString & Additional);
void __fastcall TerminalOperationProgress(TFileOperationProgressType & ProgressData);
void __fastcall TerminalOperationFinished(TFileOperation Operation, TOperationSide Side,
bool Temp, const UnicodeString & FileName, bool Success, bool NotCancelled,
TOnceDoneOperation & OnceDoneOperation);
void __fastcall PrintActiveSession();
TTerminal * __fastcall FindSession(const UnicodeString Index);
void __fastcall FreeTerminal(TTerminal * Terminal);
void __fastcall PrintProgress(bool First, const UnicodeString Str);
bool __fastcall QueryCancel();
void __fastcall TerminalSynchronizeDirectory(
const UnicodeString & LocalDirectory, const UnicodeString & RemoteDirectory,
bool & Continue, bool Collect, const TSynchronizeOptions * Options);
void __fastcall DoChangeLocalDirectory(UnicodeString Directory);
void __fastcall DoClose(TTerminal * Terminal);
virtual bool __fastcall HandleExtendedException(Exception * E,
TTerminal * Terminal = NULL);
void __fastcall TerminalPromptUser(TTerminal * Terminal, TPromptKind Kind,
UnicodeString Name, UnicodeString Instructions, TStrings * Prompts,
TStrings * Results, bool & Result, void * Arg);
void __fastcall TerminalInitializeLog(TObject * Sender);
inline bool __fastcall Synchronizing();
inline void __fastcall ShowPendingProgress();
virtual UnicodeString __fastcall GetLogCmd(const UnicodeString & FullCommand,
const UnicodeString & Command, const UnicodeString & Params);
UnicodeString __fastcall MaskPasswordInCommand(const UnicodeString & FullCommand,
const UnicodeString & Command);
void __fastcall ExitProc(TScriptProcParams * Parameters);
void __fastcall OpenProc(TScriptProcParams * Parameters);
void __fastcall CloseProc(TScriptProcParams * Parameters);
void __fastcall SessionProc(TScriptProcParams * Parameters);
void __fastcall LPwdProc(TScriptProcParams * Parameters);
void __fastcall LCdProc(TScriptProcParams * Parameters);
void __fastcall LLsProc(TScriptProcParams * Parameters);
};
//---------------------------------------------------------------------------
#define COPYID_COMMAND L"copyid"
#define EXIT_COMMAND L"exit"
//---------------------------------------------------------------------------
#endif