1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00
Files
winscp/source/core/ScpFileSystem.h
Martin Prikryl 700baf45ee Restoring consistent behavior of failing, between duplicating and moving/renaming files over existing file with WebDAV protocol in scripting and .NET assembly
The discrepancy was introduced by Bug 2120 cb021fe3.
This restores the mv/MoveFile behavior to fail, if the target file exists with WebDAV protocol (but still allows overwrite in the GUI).
The cp/DuplicateFile behavior is unchanged, but the internal API was modified to match that of mv/MoveFile, in anticipation of aligning move/duplicate command behavior in GUI and need to keep current scripting/.NET behavior.

Source commit: 4661a3ea7ec8123231e376aae9913ce8457750dd
2023-10-25 01:43:14 +02:00

161 lines
8.6 KiB
C++

//---------------------------------------------------------------------------
#ifndef ScpFileSystemH
#define ScpFileSystemH
#include <FileSystems.h>
#include <CopyParam.h>
//---------------------------------------------------------------------------
class TCommandSet;
class TSecureShell;
struct TOverwriteFileParams;
//---------------------------------------------------------------------------
class TSCPFileSystem : public TCustomFileSystem
{
public:
__fastcall TSCPFileSystem(TTerminal * ATerminal, TSecureShell * SecureShell);
virtual __fastcall ~TSCPFileSystem();
virtual void __fastcall Open();
virtual void __fastcall Close();
virtual bool __fastcall GetActive();
virtual void __fastcall CollectUsage();
virtual void __fastcall Idle();
virtual UnicodeString __fastcall AbsolutePath(UnicodeString Path, bool Local);
virtual void __fastcall AnyCommand(const UnicodeString Command,
TCaptureOutputEvent OutputEvent);
virtual void __fastcall ChangeDirectory(const UnicodeString Directory);
virtual void __fastcall CachedChangeDirectory(const UnicodeString Directory);
virtual void __fastcall AnnounceFileListOperation();
virtual void __fastcall ChangeFileProperties(const UnicodeString FileName,
const TRemoteFile * File, const TRemoteProperties * Properties,
TChmodSessionAction & Action);
virtual bool __fastcall LoadFilesProperties(TStrings * FileList);
virtual UnicodeString CalculateFilesChecksumInitialize(const UnicodeString & Alg);
virtual void __fastcall CalculateFilesChecksum(
const UnicodeString & Alg, TStrings * FileList, TCalculatedChecksumEvent OnCalculatedChecksum,
TFileOperationProgressType * OperationProgress, bool FirstLevel);
virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
const UnicodeString TargetDir, const TCopyParamType * CopyParam,
int Params, TFileOperationProgressType * OperationProgress,
TOnceDoneOperation & OnceDoneOperation);
virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
const UnicodeString TargetDir, const TCopyParamType * CopyParam,
int Params, TFileOperationProgressType * OperationProgress,
TOnceDoneOperation & OnceDoneOperation);
virtual void __fastcall Source(
TLocalFileHandle & Handle, const UnicodeString & TargetDir, UnicodeString & DestFileName,
const TCopyParamType * CopyParam, int Params,
TFileOperationProgressType * OperationProgress, unsigned int Flags,
TUploadSessionAction & Action, bool & ChildError);
virtual void __fastcall Sink(
const UnicodeString & FileName, const TRemoteFile * File,
const UnicodeString & TargetDir, UnicodeString & DestFileName, int Attrs,
const TCopyParamType * CopyParam, int Params, TFileOperationProgressType * OperationProgress,
unsigned int Flags, TDownloadSessionAction & Action);
virtual void __fastcall CreateDirectory(const UnicodeString & DirName, bool Encrypt);
virtual void __fastcall CreateLink(const UnicodeString FileName, const UnicodeString PointTo, bool Symbolic);
virtual void __fastcall DeleteFile(const UnicodeString FileName,
const TRemoteFile * File, int Params, TRmSessionAction & Action);
virtual void __fastcall CustomCommandOnFile(const UnicodeString FileName,
const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
virtual void __fastcall DoStartup();
virtual void __fastcall HomeDirectory();
virtual bool __fastcall IsCapable(int Capability) const;
virtual void __fastcall LookupUsersGroups();
virtual void __fastcall ReadCurrentDirectory();
virtual void __fastcall ReadDirectory(TRemoteFileList * FileList);
virtual void __fastcall ReadFile(const UnicodeString FileName,
TRemoteFile *& File);
virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
TRemoteFile *& File);
virtual void __fastcall RenameFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual void __fastcall CopyFile(
const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
virtual TStrings * __fastcall GetFixedPaths();
virtual void __fastcall SpaceAvailable(const UnicodeString Path,
TSpaceAvailable & ASpaceAvailable);
virtual const TSessionInfo & __fastcall GetSessionInfo();
virtual const TFileSystemInfo & __fastcall GetFileSystemInfo(bool Retrieve);
virtual bool __fastcall TemporaryTransferFile(const UnicodeString & FileName);
virtual bool __fastcall GetStoredCredentialsTried();
virtual UnicodeString __fastcall GetUserName();
virtual void __fastcall GetSupportedChecksumAlgs(TStrings * Algs);
virtual void __fastcall LockFile(const UnicodeString & FileName, const TRemoteFile * File);
virtual void __fastcall UnlockFile(const UnicodeString & FileName, const TRemoteFile * File);
virtual void __fastcall UpdateFromMain(TCustomFileSystem * MainFileSystem);
virtual void __fastcall ClearCaches();
protected:
__property TStrings * Output = { read = FOutput };
__property int ReturnCode = { read = FReturnCode };
virtual UnicodeString __fastcall GetCurrentDirectory();
private:
TSecureShell * FSecureShell;
TCommandSet * FCommandSet;
TFileSystemInfo FFileSystemInfo;
UnicodeString FCurrentDirectory;
TStrings * FOutput;
int FReturnCode;
UnicodeString FCachedDirectoryChange;
bool FProcessingCommand;
int FLsFullTime;
TCaptureOutputEvent FOnCaptureOutput;
bool FScpFatalError;
void __fastcall DetectUtf();
void __fastcall ClearAliases();
void __fastcall ClearAlias(UnicodeString Alias);
void __fastcall CustomReadFile(const UnicodeString FileName,
TRemoteFile *& File, TRemoteFile * ALinkedByFile);
void __fastcall DetectReturnVar();
bool __fastcall IsLastLine(UnicodeString & Line);
static bool __fastcall IsTotalListingLine(const UnicodeString Line);
void __fastcall EnsureLocation();
void __fastcall ExecCommand(const UnicodeString & Cmd, int Params,
const UnicodeString & CmdString);
void __fastcall ExecCommand(TFSCommand Cmd, const TVarRec * args = NULL,
int size = 0, int Params = -1);
void InvalidOutputError(const UnicodeString & Command);
void __fastcall ReadCommandOutput(int Params, const UnicodeString * Cmd = NULL);
void __fastcall SCPResponse(bool * GotLastLine = NULL);
void __fastcall SCPDirectorySource(const UnicodeString DirectoryName,
const UnicodeString TargetDir, const TCopyParamType * CopyParam, int Params,
TFileOperationProgressType * OperationProgress, int Level);
void __fastcall SCPError(const UnicodeString Message, bool Fatal);
void __fastcall SCPSendError(const UnicodeString Message, bool Fatal);
void __fastcall SCPSink(const UnicodeString TargetDir,
const UnicodeString FileName, const UnicodeString SourceDir,
const TCopyParamType * CopyParam, bool & Success,
TFileOperationProgressType * OperationProgress, int Params, int Level);
void __fastcall SCPSource(const UnicodeString FileName,
const UnicodeString TargetDir, const TCopyParamType * CopyParam, int Params,
TFileOperationProgressType * OperationProgress, int Level);
void __fastcall SendCommand(const UnicodeString Cmd);
void __fastcall SkipFirstLine();
void __fastcall SkipStartupMessage();
void __fastcall UnsetNationalVars();
TRemoteFile * __fastcall CreateRemoteFile(const UnicodeString & ListingStr,
TRemoteFile * LinkedByFile = NULL);
void __fastcall CaptureOutput(const UnicodeString & AddedLine, TCaptureOutputType OutputType);
void __fastcall ChangeFileToken(const UnicodeString & DelimitedName,
const TRemoteToken & Token, TFSCommand Cmd, const UnicodeString & RecursiveStr);
unsigned int __fastcall ConfirmOverwrite(
const UnicodeString & SourceFullFileName, const UnicodeString & TargetFileName,
TOperationSide Side,
const TOverwriteFileParams * FileParams, const TCopyParamType * CopyParam,
int Params, TFileOperationProgressType * OperationProgress);
UnicodeString ParseFileChecksum(
const UnicodeString & Line, const UnicodeString & FileName, const UnicodeString & Command);
void ProcessFileChecksum(
TCalculatedChecksumEvent OnCalculatedChecksum, TChecksumSessionAction & Action, TFileOperationProgressType * OperationProgress,
bool FirstLevel, const UnicodeString & FileName, const UnicodeString & Alg, const UnicodeString & Checksum);
static bool __fastcall RemoveLastLine(UnicodeString & Line,
int & ReturnCode, UnicodeString LastLine = L"");
};
//---------------------------------------------------------------------------
#endif // ScpFileSystemH