SftpFileSystem.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //---------------------------------------------------------------------------
  2. #ifndef SftpFileSystemH
  3. #define SftpFileSystemH
  4. #include <FileSystems.h>
  5. //---------------------------------------------------------------------------
  6. class TSFTPPacket;
  7. class TOverwriteFileParams;
  8. struct TSFTPSupport;
  9. class TSecureShell;
  10. class TEncryption;
  11. //---------------------------------------------------------------------------
  12. enum TSFTPOverwriteMode { omOverwrite, omAppend, omResume };
  13. extern const int SFTPMaxVersion;
  14. //---------------------------------------------------------------------------
  15. class TSFTPFileSystem : public TCustomFileSystem
  16. {
  17. friend class TSFTPPacket;
  18. friend class TSFTPQueue;
  19. friend class TSFTPAsynchronousQueue;
  20. friend class TSFTPUploadQueue;
  21. friend class TSFTPDownloadQueue;
  22. friend class TSFTPLoadFilesPropertiesQueue;
  23. friend class TSFTPCalculateFilesChecksumQueue;
  24. friend class TSFTPBusy;
  25. public:
  26. __fastcall TSFTPFileSystem(TTerminal * ATerminal, TSecureShell * SecureShell);
  27. virtual __fastcall ~TSFTPFileSystem();
  28. virtual void __fastcall Open();
  29. virtual void __fastcall Close();
  30. virtual bool __fastcall GetActive();
  31. virtual void __fastcall CollectUsage();
  32. virtual void __fastcall Idle();
  33. virtual UnicodeString __fastcall AbsolutePath(UnicodeString Path, bool Local);
  34. virtual void __fastcall AnyCommand(const UnicodeString Command,
  35. TCaptureOutputEvent OutputEvent);
  36. virtual void __fastcall ChangeDirectory(const UnicodeString Directory);
  37. virtual void __fastcall CachedChangeDirectory(const UnicodeString Directory);
  38. virtual void __fastcall AnnounceFileListOperation();
  39. virtual void __fastcall ChangeFileProperties(const UnicodeString FileName,
  40. const TRemoteFile * File, const TRemoteProperties * Properties,
  41. TChmodSessionAction & Action);
  42. virtual bool __fastcall LoadFilesProperties(TStrings * FileList);
  43. virtual UnicodeString CalculateFilesChecksumInitialize(const UnicodeString & Alg);
  44. virtual void __fastcall CalculateFilesChecksum(
  45. const UnicodeString & Alg, TStrings * FileList, TCalculatedChecksumEvent OnCalculatedChecksum,
  46. TFileOperationProgressType * OperationProgress, bool FirstLevel);
  47. virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
  48. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  49. int Params, TFileOperationProgressType * OperationProgress,
  50. TOnceDoneOperation & OnceDoneOperation);
  51. virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
  52. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  53. int Params, TFileOperationProgressType * OperationProgress,
  54. TOnceDoneOperation & OnceDoneOperation);
  55. virtual void __fastcall Source(
  56. TLocalFileHandle & Handle, const UnicodeString & TargetDir, UnicodeString & DestFileName,
  57. const TCopyParamType * CopyParam, int Params,
  58. TFileOperationProgressType * OperationProgress, unsigned int Flags,
  59. TUploadSessionAction & Action, bool & ChildError);
  60. virtual void __fastcall DirectorySunk(
  61. const UnicodeString & DestFullName, const TRemoteFile * File, const TCopyParamType * CopyParam);
  62. virtual void __fastcall Sink(
  63. const UnicodeString & FileName, const TRemoteFile * File,
  64. const UnicodeString & TargetDir, UnicodeString & DestFileName, int Attrs,
  65. const TCopyParamType * CopyParam, int Params, TFileOperationProgressType * OperationProgress,
  66. unsigned int Flags, TDownloadSessionAction & Action);
  67. virtual void __fastcall CreateDirectory(const UnicodeString & DirName, bool Encrypt);
  68. virtual void __fastcall CreateLink(const UnicodeString FileName, const UnicodeString PointTo, bool Symbolic);
  69. virtual void __fastcall DeleteFile(const UnicodeString FileName,
  70. const TRemoteFile * File, int Params, TRmSessionAction & Action);
  71. virtual void __fastcall CustomCommandOnFile(const UnicodeString FileName,
  72. const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
  73. virtual void __fastcall DoStartup();
  74. virtual void __fastcall HomeDirectory();
  75. virtual UnicodeString __fastcall GetHomeDirectory();
  76. virtual bool __fastcall IsCapable(int Capability) const;
  77. virtual void __fastcall LookupUsersGroups();
  78. virtual void __fastcall ReadCurrentDirectory();
  79. virtual void __fastcall ReadDirectory(TRemoteFileList * FileList);
  80. virtual void __fastcall ReadFile(const UnicodeString FileName,
  81. TRemoteFile *& File);
  82. virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
  83. TRemoteFile *& File);
  84. virtual void __fastcall RenameFile(
  85. const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
  86. virtual void __fastcall CopyFile(
  87. const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
  88. virtual TStrings * __fastcall GetFixedPaths();
  89. virtual void __fastcall SpaceAvailable(const UnicodeString Path,
  90. TSpaceAvailable & ASpaceAvailable);
  91. virtual const TSessionInfo & __fastcall GetSessionInfo();
  92. virtual const TFileSystemInfo & __fastcall GetFileSystemInfo(bool Retrieve);
  93. virtual bool __fastcall TemporaryTransferFile(const UnicodeString & FileName);
  94. virtual bool __fastcall GetStoredCredentialsTried();
  95. virtual UnicodeString __fastcall GetUserName();
  96. virtual void __fastcall GetSupportedChecksumAlgs(TStrings * Algs);
  97. virtual void __fastcall LockFile(const UnicodeString & FileName, const TRemoteFile * File);
  98. virtual void __fastcall UnlockFile(const UnicodeString & FileName, const TRemoteFile * File);
  99. virtual void __fastcall UpdateFromMain(TCustomFileSystem * MainFileSystem);
  100. virtual void __fastcall ClearCaches();
  101. protected:
  102. TSecureShell * FSecureShell;
  103. TFileSystemInfo FFileSystemInfo;
  104. bool FFileSystemInfoValid;
  105. int FVersion;
  106. UnicodeString FCurrentDirectory;
  107. UnicodeString FDirectoryToChangeTo;
  108. UnicodeString FHomeDirectory;
  109. AnsiString FEOL;
  110. TList * FPacketReservations;
  111. Variant FPacketNumbers;
  112. char FPreviousLoggedPacket;
  113. int FNotLoggedWritePackets, FNotLoggedReadPackets, FNotLoggedStatusPackets, FNotLoggedDataPackets;
  114. std::set<unsigned int> FNotLoggedRequests;
  115. int FBusy;
  116. void * FBusyToken;
  117. bool FAvoidBusy;
  118. UnicodeString FExtensions;
  119. std::unique_ptr<TStrings> FSupportedExtensions;
  120. TSFTPSupport * FSupport;
  121. TAutoSwitch FUtfStrings;
  122. bool FUtfDisablingAnnounced;
  123. bool FSignedTS;
  124. TStrings * FFixedPaths;
  125. unsigned long FMaxPacketSize;
  126. bool FSupportsStatVfsV2;
  127. bool FSupportsHardlink;
  128. std::unique_ptr<TStringList> FChecksumAlgs;
  129. std::unique_ptr<TStringList> FChecksumSftpAlgs;
  130. void __fastcall SendCustomReadFile(TSFTPPacket * Packet, TSFTPPacket * Response,
  131. unsigned long Flags);
  132. void __fastcall CustomReadFile(const UnicodeString FileName,
  133. TRemoteFile *& File, unsigned char Type, TRemoteFile * ALinkedByFile = NULL,
  134. int AllowStatus = -1);
  135. virtual UnicodeString __fastcall GetCurrentDirectory();
  136. unsigned long __fastcall GotStatusPacket(TSFTPPacket * Packet, int AllowStatus, bool DoNotForceLog);
  137. bool __fastcall RemoteFileExists(const UnicodeString FullPath, TRemoteFile ** File = NULL);
  138. TRemoteFile * __fastcall LoadFile(TSFTPPacket * Packet,
  139. TRemoteFile * ALinkedByFile, const UnicodeString FileName,
  140. TRemoteFileList * TempFileList = NULL, bool Complete = true);
  141. void __fastcall LoadFile(TRemoteFile * File, TSFTPPacket * Packet,
  142. bool Complete = true);
  143. UnicodeString __fastcall LocalCanonify(const UnicodeString & Path);
  144. UnicodeString __fastcall Canonify(const UnicodeString & Path);
  145. UnicodeString __fastcall RealPath(const UnicodeString & Path);
  146. UnicodeString __fastcall RealPath(const UnicodeString & Path, const UnicodeString & BaseDir);
  147. void __fastcall ReserveResponse(const TSFTPPacket * Packet,
  148. TSFTPPacket * Response);
  149. int __fastcall ReceivePacket(TSFTPPacket * Packet, int ExpectedType = -1,
  150. int AllowStatus = -1, bool TryOnly = false);
  151. bool __fastcall PeekPacket();
  152. void __fastcall RemoveReservation(int Reservation);
  153. void __fastcall SendPacket(const TSFTPPacket * Packet);
  154. int __fastcall ReceiveResponse(const TSFTPPacket * Packet,
  155. TSFTPPacket * Response, int ExpectedType = -1, int AllowStatus = -1, bool TryOnly = false);
  156. int __fastcall SendPacketAndReceiveResponse(const TSFTPPacket * Packet,
  157. TSFTPPacket * Response, int ExpectedType = -1, int AllowStatus = -1);
  158. void __fastcall UnreserveResponse(TSFTPPacket * Response);
  159. void LogPacket(const TSFTPPacket * Packet, TLogLineType Type);
  160. void __fastcall TryOpenDirectory(const UnicodeString Directory);
  161. bool __fastcall SupportsExtension(const UnicodeString & Extension) const;
  162. void __fastcall ResetConnection();
  163. void __fastcall RegisterChecksumAlg(const UnicodeString & Alg, const UnicodeString & SftpAlg);
  164. void __fastcall DoDeleteFile(const UnicodeString FileName, unsigned char Type);
  165. void __fastcall SFTPSource(const UnicodeString FileName,
  166. const UnicodeString TargetDir, const TCopyParamType * CopyParam, int Params,
  167. TFileOperationProgressType * OperationProgress, unsigned int Flags,
  168. TUploadSessionAction & Action, bool & ChildError);
  169. RawByteString __fastcall SFTPOpenRemoteFile(const UnicodeString & FileName,
  170. unsigned int OpenType, bool EncryptNewFiles = false, __int64 Size = -1);
  171. int __fastcall SFTPOpenRemote(void * AOpenParams, void * Param2);
  172. void __fastcall SFTPCloseRemote(const RawByteString Handle,
  173. const UnicodeString FileName, TFileOperationProgressType * OperationProgress,
  174. bool TransferFinished, bool Request, TSFTPPacket * Packet);
  175. void __fastcall SFTPConfirmOverwrite(const UnicodeString & FullFileName, UnicodeString & FileName,
  176. const TCopyParamType * CopyParam, int Params, TFileOperationProgressType * OperationProgress,
  177. TSFTPOverwriteMode & Mode, const TOverwriteFileParams * FileParams);
  178. bool SFTPConfirmResume(const UnicodeString DestFileName, bool PartialBiggerThanSource,
  179. TFileOperationProgressType * OperationProgress);
  180. char * __fastcall GetEOL() const;
  181. inline void __fastcall BusyStart();
  182. inline void __fastcall BusyEnd();
  183. inline unsigned long __fastcall TransferBlockSize(
  184. unsigned long Overhead, TFileOperationProgressType * OperationProgress);
  185. inline unsigned long __fastcall UploadBlockSize(const RawByteString & Handle,
  186. TFileOperationProgressType * OperationProgress);
  187. inline unsigned long __fastcall DownloadBlockSize(
  188. TFileOperationProgressType * OperationProgress);
  189. inline int __fastcall PacketLength(unsigned char * LenBuf, int ExpectedType);
  190. void __fastcall Progress(TFileOperationProgressType * OperationProgress);
  191. void AddPathString(TSFTPPacket & Packet, const UnicodeString & Value, bool EncryptNewFiles = false);
  192. void __fastcall WriteLocalFile(
  193. const TCopyParamType * CopyParam, TStream * FileStream, TFileBuffer & BlockBuf, const UnicodeString & LocalFileName,
  194. TFileOperationProgressType * OperationProgress);
  195. bool __fastcall DoesFileLookLikeSymLink(TRemoteFile * File);
  196. void DoCloseRemoteIfOpened(const RawByteString & Handle);
  197. void NoPacketReservations();
  198. };
  199. //---------------------------------------------------------------------------
  200. #endif // SftpFileSystemH