| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298 | //---------------------------------------------------------------------------#ifndef FtpFileSystemH#define FtpFileSystemH//---------------------------------------------------------------------------#include <time.h>#include <FileSystems.h>//---------------------------------------------------------------------------class TFileZillaIntf;class TFileZillaImpl;class TMessageQueue;class TFTPServerCapabilities;struct TOverwriteFileParams;struct TListDataEntry;struct TFileTransferData;struct TFtpsCertificateData;struct TRemoteFileTime;//---------------------------------------------------------------------------class TFTPFileSystem : public TCustomFileSystem{friend class TFileZillaImpl;friend class TFileListHelper;public:  __fastcall TFTPFileSystem(TTerminal * ATerminal);  virtual __fastcall ~TFTPFileSystem();  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 void __fastcall CalculateFilesChecksum(const UnicodeString & Alg,    TStrings * FileList, TStrings * Checksums,    TCalculatedChecksumEvent OnCalculatedChecksum);  virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,    const UnicodeString TargetDir, const TCopyParamType * CopyParam,    int Params, TFileOperationProgressType * OperationProgress,    TOnceDoneOperation & OnceDoneOperation);  virtual void __fastcall TransferOnDirectory(    const UnicodeString & Directory, const TCopyParamType * CopyParam, int Params);  virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,    const UnicodeString TargetDir, const TCopyParamType * CopyParam,    int Params, TFileOperationProgressType * OperationProgress,    TOnceDoneOperation & OnceDoneOperation);  virtual void __fastcall CreateDirectory(const UnicodeString DirName);  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);  virtual void __fastcall CopyFile(const UnicodeString FileName, const TRemoteFile * File,    const UnicodeString NewName);  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:  enum TOverwriteMode { omOverwrite, omResume, omComplete };  virtual UnicodeString __fastcall GetCurrentDirectory();  const wchar_t * __fastcall GetOption(int OptionID) const;  int __fastcall GetOptionVal(int OptionID) const;  enum  {    REPLY_CONNECT =      0x01,    REPLY_2XX_CODE =     0x02,    REPLY_ALLOW_CANCEL = 0x04,    REPLY_3XX_CODE =     0x08,    REPLY_SINGLE_LINE =  0x10  };  bool __fastcall PostMessage(unsigned int Type, WPARAM wParam, LPARAM lParam);  bool __fastcall ProcessMessage();  void __fastcall DiscardMessages();  void __fastcall WaitForMessages();  unsigned int __fastcall WaitForReply(bool Command, bool WantLastCode);  unsigned int __fastcall WaitForCommandReply(bool WantLastCode = true);  void __fastcall WaitForFatalNonCommandReply();  void __fastcall PoolForFatalNonCommandReply();  void __fastcall GotNonCommandReply(unsigned int Reply);  UnicodeString __fastcall GotReply(unsigned int Reply, unsigned int Flags = 0,    UnicodeString Error = L"", unsigned int * Code = NULL,    TStrings ** Response = NULL);  void __fastcall ResetReply();  void __fastcall HandleReplyStatus(UnicodeString Response);  void __fastcall DoWaitForReply(unsigned int& ReplyToAwait, bool WantLastCode);  bool __fastcall KeepWaitingForReply(unsigned int& ReplyToAwait, bool WantLastCode);  inline bool __fastcall NoFinalLastCode();  bool __fastcall HandleStatus(const wchar_t * Status, int Type);  bool __fastcall HandleAsynchRequestOverwrite(    wchar_t * FileName1, size_t FileName1Len, const wchar_t * FileName2,    const wchar_t * Path1, const wchar_t * Path2,    __int64 Size1, __int64 Size2, time_t LocalTime,    bool HasLocalTime, const TRemoteFileTime & RemoteTime, void * UserData, int & RequestResult);  bool __fastcall HandleAsynchRequestVerifyCertificate(    const TFtpsCertificateData & Data, int & RequestResult);  bool __fastcall HandleAsynchRequestNeedPass(    struct TNeedPassRequestData & Data, int & RequestResult);  bool __fastcall HandleListData(const wchar_t * Path, const TListDataEntry * Entries,    unsigned int Count);  bool __fastcall HandleTransferStatus(bool Valid, __int64 TransferSize,    __int64 Bytes, bool FileTransfer);  bool __fastcall HandleReply(int Command, unsigned int Reply);  bool __fastcall HandleCapabilities(TFTPServerCapabilities * ServerCapabilities);  bool __fastcall CheckError(int ReturnCode, const wchar_t * Context);  void __fastcall PreserveDownloadFileTime(HANDLE Handle, void * UserData);  bool __fastcall GetFileModificationTimeInUtc(const wchar_t * FileName, struct tm & Time);  void __fastcall EnsureLocation(const UnicodeString & Directory, bool Log);  void __fastcall EnsureLocation();  UnicodeString __fastcall ActualCurrentDirectory();  void __fastcall Discard();  void __fastcall DoChangeDirectory(const UnicodeString & Directory);  void __fastcall Sink(const UnicodeString FileName,    const TRemoteFile * File, const UnicodeString TargetDir,    const TCopyParamType * CopyParam, int Params,    TFileOperationProgressType * OperationProgress, unsigned int Flags,    TDownloadSessionAction & Action);  void __fastcall SinkRobust(const UnicodeString FileName,    const TRemoteFile * File, const UnicodeString TargetDir,    const TCopyParamType * CopyParam, int Params,    TFileOperationProgressType * OperationProgress, unsigned int Flags);  void __fastcall SinkFile(UnicodeString FileName, const TRemoteFile * File, void * Param);  void __fastcall Source(    TLocalFileHandle & Handle, const UnicodeString & TargetDir, UnicodeString & DestFileName,    const TCopyParamType * CopyParam, int Params,    TFileOperationProgressType * OperationProgress, unsigned int Flags,    TUploadSessionAction & Action, bool & ChildError);  bool __fastcall ConfirmOverwrite(const UnicodeString & SourceFullFileName, UnicodeString & TargetFileName,    TOverwriteMode & OverwriteMode, TFileOperationProgressType * OperationProgress,    const TOverwriteFileParams * FileParams, const TCopyParamType * CopyParam,    int Params, bool AutoResume);  void __fastcall ReadDirectoryProgress(__int64 Bytes);  void __fastcall ResetFileTransfer();  void __fastcall DoFileTransferProgress(__int64 TransferSize, __int64 Bytes);  void __fastcall FileTransferProgress(__int64 TransferSize, __int64 Bytes);  void __fastcall ResetCaches();  void __fastcall CaptureOutput(const UnicodeString & Str);  void __fastcall DoReadDirectory(TRemoteFileList * FileList);  void __fastcall DoReadFile(const UnicodeString & FileName, TRemoteFile *& AFile);  void __fastcall FileTransfer(const UnicodeString & FileName, const UnicodeString & LocalFile,    const UnicodeString & RemoteFile, const UnicodeString & RemotePath, bool Get,    __int64 Size, int Type, TFileTransferData & UserData,    TFileOperationProgressType * OperationProgress);  TDateTime __fastcall ConvertLocalTimestamp(time_t Time);  void __fastcall RemoteFileTimeToDateTimeAndPrecision(const TRemoteFileTime & Source,    TDateTime & DateTime, TModificationFmt & ModificationFmt);  void __fastcall SetLastCode(int Code);  void __fastcall StoreLastResponse(const UnicodeString & Text);  void __fastcall SetCPSLimit(TFileOperationProgressType * OperationProgress);  bool __fastcall VerifyCertificateHostName(const TFtpsCertificateData & Data);  bool __fastcall SupportsReadingFile();  void __fastcall AutoDetectTimeDifference(TRemoteFileList * FileList);  void __fastcall AutoDetectTimeDifference(const UnicodeString & Directory, const TCopyParamType * CopyParam, int Params);  void __fastcall ApplyTimeDifference(TRemoteFile * File);  void __fastcall ApplyTimeDifference(    const UnicodeString & FileName, TDateTime & Modification, TModificationFmt & ModificationFmt);  void __fastcall DummyReadDirectory(const UnicodeString & Directory);  bool __fastcall IsEmptyFileList(TRemoteFileList * FileList);  void __fastcall CheckTimeDifference();  inline bool __fastcall NeedAutoDetectTimeDifference();  bool __fastcall LookupUploadModificationTime(    const UnicodeString & FileName, TDateTime & Modification, TModificationFmt ModificationFmt);  UnicodeString __fastcall DoCalculateFileChecksum(bool UsingHashCommand, const UnicodeString & Alg, TRemoteFile * File);  void __fastcall DoCalculateFilesChecksum(bool UsingHashCommand, const UnicodeString & Alg,    TStrings * FileList, TStrings * Checksums,    TCalculatedChecksumEvent OnCalculatedChecksum,    TFileOperationProgressType * OperationProgress, bool FirstLevel);  void __fastcall HandleFeatReply();  void __fastcall ResetFeatures();  bool __fastcall SupportsSiteCommand(const UnicodeString & Command) const;  bool __fastcall SupportsCommand(const UnicodeString & Command) const;  void __fastcall RegisterChecksumAlgCommand(const UnicodeString & Alg, const UnicodeString & Command);  void __fastcall SendCommand(const UnicodeString & Command);  bool __fastcall CanTransferSkipList(int Params, unsigned int Flags, const TCopyParamType * CopyParam);  static bool __fastcall Unquote(UnicodeString & Str);private:  enum TCommand  {    CMD_UNKNOWN,    PASS,    SYST,    FEAT  };  TFileZillaIntf * FFileZillaIntf;  TCriticalSection * FQueueCriticalSection;  TCriticalSection * FTransferStatusCriticalSection;  TMessageQueue * FQueue;  HANDLE FQueueEvent;  TSessionInfo FSessionInfo;  TFileSystemInfo FFileSystemInfo;  bool FFileSystemInfoValid;  unsigned int FReply;  unsigned int FCommandReply;  TCommand FLastCommand;  bool FPasswordFailed;  bool FStoredPasswordTried;  bool FMultineResponse;  int FLastCode;  int FLastCodeClass;  int FLastReadDirectoryProgress;  UnicodeString FTimeoutStatus;  UnicodeString FDisconnectStatus;  TStrings * FLastResponse;  TStrings * FLastErrorResponse;  TStrings * FLastError;  UnicodeString FSystem;  TStrings * FFeatures;  UnicodeString FCurrentDirectory;  bool FReadCurrentDirectory;  UnicodeString FHomeDirectory;  TRemoteFileList * FFileList;  TRemoteFileList * FFileListCache;  UnicodeString FFileListCachePath;  UnicodeString FWelcomeMessage;  bool FActive;  bool FOpening;  bool FWaitingForReply;  enum { ftaNone, ftaSkip, ftaCancel } FFileTransferAbort;  bool FIgnoreFileList;  bool FFileTransferCancelled;  __int64 FFileTransferResumed;  bool FFileTransferPreserveTime;  bool FFileTransferRemoveBOM;  bool FFileTransferNoList;  unsigned long FFileTransferCPSLimit;  bool FAwaitingProgress;  TCaptureOutputEvent FOnCaptureOutput;  UnicodeString FUserName;  TAutoSwitch FListAll;  bool FDoListAll;  TFTPServerCapabilities * FServerCapabilities;  TDateTime FLastDataSent;  bool FDetectTimeDifference;  __int64 FTimeDifference;  std::unique_ptr<TStrings> FChecksumAlgs;  std::unique_ptr<TStrings> FChecksumCommands;  std::unique_ptr<TStrings> FSupportedCommands;  std::unique_ptr<TStrings> FSupportedSiteCommands;  std::unique_ptr<TStrings> FHashAlgs;  typedef std::map<UnicodeString, TDateTime> TUploadedTimes;  TUploadedTimes FUploadedTimes;  bool FSupportsAnyChecksumFeature;  UnicodeString FLastCommandSent;  X509 * FCertificate;  EVP_PKEY * FPrivateKey;  bool FTransferActiveImmediately;  bool FWindowsServer;  __int64 FBytesAvailable;  bool FBytesAvailableSuppoted;  bool FMVS;  bool FVMS;  bool FFileTransferAny;  mutable UnicodeString FOptionScratch;};//---------------------------------------------------------------------------UnicodeString __fastcall GetOpenSSLVersionText();//---------------------------------------------------------------------------#endif // FtpFileSystemH
 |