WebDAVFileSystem.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. //------------------------------------------------------------------------------
  2. #ifndef WebDavFileSystemH
  3. #define WebDavFileSystemH
  4. //------------------------------------------------------------------------------
  5. #include <ne_uri.h>
  6. #include <ne_utils.h>
  7. #include <ne_string.h>
  8. #include <ne_request.h>
  9. #include <FileSystems.h>
  10. //------------------------------------------------------------------------------
  11. struct TWebDAVCertificateData;
  12. struct ne_ssl_certificate_s;
  13. struct ne_session_s;
  14. struct ne_prop_result_set_s;
  15. struct TOverwriteFileParams;
  16. struct ssl_st;
  17. //------------------------------------------------------------------------------
  18. class TWebDAVFileSystem : public TCustomFileSystem
  19. {
  20. public:
  21. explicit TWebDAVFileSystem(TTerminal * ATerminal);
  22. virtual __fastcall ~TWebDAVFileSystem();
  23. virtual void __fastcall Open();
  24. virtual void __fastcall Close();
  25. virtual bool __fastcall GetActive();
  26. virtual void __fastcall CollectUsage();
  27. virtual void __fastcall Idle();
  28. virtual UnicodeString __fastcall AbsolutePath(UnicodeString Path, bool Local);
  29. virtual void __fastcall AnyCommand(const UnicodeString Command,
  30. TCaptureOutputEvent OutputEvent);
  31. virtual void __fastcall ChangeDirectory(const UnicodeString Directory);
  32. virtual void __fastcall CachedChangeDirectory(const UnicodeString Directory);
  33. virtual void __fastcall AnnounceFileListOperation();
  34. virtual void __fastcall ChangeFileProperties(const UnicodeString FileName,
  35. const TRemoteFile * File, const TRemoteProperties * Properties,
  36. TChmodSessionAction & Action);
  37. virtual bool __fastcall LoadFilesProperties(TStrings * FileList);
  38. virtual void __fastcall CalculateFilesChecksum(const UnicodeString & Alg,
  39. TStrings * FileList, TStrings * Checksums,
  40. TCalculatedChecksumEvent OnCalculatedChecksum);
  41. virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
  42. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  43. int Params, TFileOperationProgressType * OperationProgress,
  44. TOnceDoneOperation & OnceDoneOperation);
  45. virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
  46. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  47. int Params, TFileOperationProgressType * OperationProgress,
  48. TOnceDoneOperation & OnceDoneOperation);
  49. virtual void __fastcall CreateDirectory(const UnicodeString DirName);
  50. virtual void __fastcall CreateLink(const UnicodeString FileName, const UnicodeString PointTo, bool Symbolic);
  51. virtual void __fastcall DeleteFile(const UnicodeString FileName,
  52. const TRemoteFile * File, int Params, TRmSessionAction & Action);
  53. virtual void __fastcall CustomCommandOnFile(const UnicodeString FileName,
  54. const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
  55. virtual void __fastcall DoStartup();
  56. virtual void __fastcall HomeDirectory();
  57. virtual bool __fastcall IsCapable(int Capability) const;
  58. virtual void __fastcall LookupUsersGroups();
  59. virtual void __fastcall ReadCurrentDirectory();
  60. virtual void __fastcall ReadDirectory(TRemoteFileList * FileList);
  61. virtual void __fastcall ReadFile(const UnicodeString FileName,
  62. TRemoteFile *& File);
  63. virtual void __fastcall ReadSymlink(TRemoteFile * SymlinkFile,
  64. TRemoteFile *& File);
  65. virtual void __fastcall RenameFile(const UnicodeString FileName,
  66. const UnicodeString NewName);
  67. virtual void __fastcall CopyFile(const UnicodeString FileName,
  68. const UnicodeString NewName);
  69. virtual TStrings * __fastcall GetFixedPaths();
  70. virtual void __fastcall SpaceAvailable(const UnicodeString Path,
  71. TSpaceAvailable & ASpaceAvailable);
  72. virtual const TSessionInfo & __fastcall GetSessionInfo();
  73. virtual const TFileSystemInfo & __fastcall GetFileSystemInfo(bool Retrieve);
  74. virtual bool __fastcall TemporaryTransferFile(const UnicodeString & FileName);
  75. virtual bool __fastcall GetStoredCredentialsTried();
  76. virtual UnicodeString __fastcall GetUserName();
  77. virtual void __fastcall GetSupportedChecksumAlgs(TStrings * Algs);
  78. void __fastcall NeonDebug(const UnicodeString & Message);
  79. void __fastcall InitSslSession(ssl_st * Ssl);
  80. protected:
  81. virtual UnicodeString __fastcall GetCurrentDirectory();
  82. void __fastcall Sink(const UnicodeString FileName,
  83. const TRemoteFile * File, const UnicodeString TargetDir,
  84. const TCopyParamType * CopyParam, int Params,
  85. TFileOperationProgressType * OperationProgress, unsigned int Flags,
  86. TDownloadSessionAction & Action, bool & ChildError);
  87. void __fastcall SinkRobust(const UnicodeString FileName,
  88. const TRemoteFile * File, const UnicodeString TargetDir,
  89. const TCopyParamType * CopyParam, int Params,
  90. TFileOperationProgressType * OperationProgress, unsigned int Flags);
  91. void __fastcall SinkFile(const UnicodeString FileName, const TRemoteFile * File, void * Param);
  92. void __fastcall SourceRobust(const UnicodeString FileName,
  93. const UnicodeString TargetDir, const TCopyParamType * CopyParam, int Params,
  94. TFileOperationProgressType * OperationProgress, unsigned int Flags);
  95. void __fastcall Source(const UnicodeString FileName,
  96. const UnicodeString TargetDir, const TCopyParamType * CopyParam, int Params,
  97. TFileOperationProgressType * OperationProgress, unsigned int Flags,
  98. TUploadSessionAction & Action, bool & ChildError);
  99. void __fastcall DirectorySource(const UnicodeString DirectoryName,
  100. const UnicodeString TargetDir, int Attrs, const TCopyParamType * CopyParam,
  101. int Params, TFileOperationProgressType * OperationProgress, unsigned int Flags);
  102. void __fastcall ConfirmOverwrite(const UnicodeString & FullFileName, UnicodeString & FileName,
  103. TFileOperationProgressType * OperationProgress,
  104. const TOverwriteFileParams * FileParams, const TCopyParamType * CopyParam,
  105. int Params);
  106. void __fastcall CheckStatus(int NeonStatus);
  107. void __fastcall ClearNeonError();
  108. static void NeonPropsResult(
  109. void * UserData, const ne_uri * Uri, const ne_prop_result_set_s * Results);
  110. void __fastcall ParsePropResultSet(TRemoteFile * File,
  111. const UnicodeString & Path, const ne_prop_result_set_s * Results);
  112. void __fastcall TryOpenDirectory(UnicodeString Directory);
  113. static int NeonBodyReader(void * UserData, const char * Buf, size_t Len);
  114. static void NeonPreSend(ne_request * Request, void * UserData, ne_buffer * Header);
  115. static int NeonBodyAccepter(void * UserData, ne_request * Request, const ne_status * Status);
  116. static void NeonCreateRequest(ne_request * Request, void * UserData, const char * Method, const char * Uri);
  117. static int NeonRequestAuth(void * UserData, const char * Realm, int Attempt, char * UserName, char * Password);
  118. void NeonOpen(UnicodeString & CorrectedUrl, const UnicodeString & Url);
  119. void NeonClientOpenSessionInternal(UnicodeString & CorrectedUrl, UnicodeString Url);
  120. static int NeonProxyAuth(
  121. void * UserData, const char * Realm, int Attempt, char * UserName, char * Password);
  122. static void NeonNotifier(void * UserData, ne_session_status Status, const ne_session_status_info * StatusInfo);
  123. static ssize_t NeonUploadBodyProvider(void * UserData, char * Buffer, size_t BufLen);
  124. static int NeonPostSend(ne_request * Req, void * UserData, const ne_status * Status);
  125. void ExchangeCapabilities(const char * Path, UnicodeString & CorrectedUrl);
  126. static int NeonServerSSLCallback(void * UserData, int Failures, const struct ne_ssl_certificate_s * Certificate);
  127. void __fastcall CloseNeonSession();
  128. bool __fastcall CancelTransfer();
  129. UnicodeString __fastcall GetNeonError();
  130. static void NeonQuotaResult(void * UserData, const ne_uri * Uri, const ne_prop_result_set_s * Results);
  131. static const char * __fastcall GetProp(const ne_prop_result_set_s * Results, const char * Name);
  132. private:
  133. TFileSystemInfo FFileSystemInfo;
  134. UnicodeString FCurrentDirectory;
  135. UnicodeString FCachedDirectoryChange;
  136. TSessionInfo FSessionInfo;
  137. UnicodeString FUserName;
  138. bool FActive;
  139. bool FHasTrailingSlash;
  140. bool FCancelled;
  141. bool FStoredPasswordTried;
  142. bool FUploading;
  143. bool FDownloading;
  144. ne_session_s * FNeonSession;
  145. bool FInitialHandshake;
  146. bool FAuthenticationRequested;
  147. ne_provide_body FUploadBodyProvider;
  148. void * FUploadBodyProviderUserData;
  149. UnicodeString FResponse;
  150. RawByteString FPassword;
  151. UnicodeString FTlsVersionStr;
  152. enum TIgnoreAuthenticationFailure { iafNo, iafWaiting, iafPasswordFailed } FIgnoreAuthenticationFailure;
  153. void __fastcall CustomReadFile(UnicodeString FileName,
  154. TRemoteFile *& File, TRemoteFile * ALinkedByFile);
  155. int __fastcall CustomReadFileInternal(const UnicodeString FileName,
  156. TRemoteFile *& File, TRemoteFile * ALinkedByFile);
  157. void __fastcall RegisterForDebug();
  158. void __fastcall UnregisterFromDebug();
  159. bool VerifyCertificate(
  160. const TWebDAVCertificateData & Data);
  161. void OpenUrl(const UnicodeString & Url);
  162. void __fastcall CollectTLSSessionInfo();
  163. UnicodeString __fastcall GetRedirectUrl();
  164. UnicodeString __fastcall ParsePathFromUrl(const UnicodeString & Url);
  165. int __fastcall ReadDirectoryInternal(const UnicodeString & Path, TRemoteFileList * FileList);
  166. int __fastcall RenameFileInternal(const UnicodeString & FileName, const UnicodeString & NewName);
  167. bool __fastcall IsValidRedirect(int NeonStatus, UnicodeString & Path);
  168. UnicodeString __fastcall DirectoryPath(UnicodeString Path);
  169. };
  170. //------------------------------------------------------------------------------
  171. void __fastcall NeonInitialize();
  172. void __fastcall NeonFinalize();
  173. //------------------------------------------------------------------------------
  174. #endif