浏览代码

Bug 1508: Support duplication with WebDAV protocol

https://winscp.net/tracker/1508

Source commit: eca4cbf57aa182538174614073f5bb58938f53fb
Martin Prikryl 8 年之前
父节点
当前提交
be9c0b65f9
共有 2 个文件被更改,包括 19 次插入2 次删除
  1. 18 2
      source/core/WebDAVFileSystem.cpp
  2. 1 0
      source/core/WebDAVFileSystem.h

+ 18 - 2
source/core/WebDAVFileSystem.cpp

@@ -680,6 +680,7 @@ bool __fastcall TWebDAVFileSystem::IsCapable(int Capability) const
     case fcResolveSymlink:
     case fsSkipTransfer:
     case fsParallelTransfers:
+    case fcRemoteCopy:
       return true;
 
     case fcUserGroupListing:
@@ -702,7 +703,6 @@ bool __fastcall TWebDAVFileSystem::IsCapable(int Capability) const
     case fcGroupOwnerChangingByID:
     case fcRemoveCtrlZUpload:
     case fcRemoveBOMUpload:
-    case fcRemoteCopy:
     case fcPreservingTimestampDirs:
     case fcResumeSupport:
     case fcChangePassword:
@@ -1161,10 +1161,26 @@ void __fastcall TWebDAVFileSystem::RenameFile(const UnicodeString FileName,
   DiscardLock(PathToNeon(Path));
 }
 //---------------------------------------------------------------------------
+int __fastcall TWebDAVFileSystem::CopyFileInternal(const UnicodeString & FileName,
+  const UnicodeString & NewName)
+{
+  // 0 = no overwrite
+  return ne_copy(FNeonSession, 0, NE_DEPTH_INFINITE, PathToNeon(FileName), PathToNeon(NewName));
+}
+//---------------------------------------------------------------------------
 void __fastcall TWebDAVFileSystem::CopyFile(const UnicodeString FileName,
     const UnicodeString NewName)
 {
-  DebugFail();
+  ClearNeonError();
+  TOperationVisualizer Visualizer(FTerminal->UseBusyCursor);
+
+  UnicodeString Path = FileName;
+  int NeonStatus = CopyFileInternal(Path, NewName);
+  if (IsValidRedirect(NeonStatus, Path))
+  {
+    NeonStatus = CopyFileInternal(Path, NewName);
+  }
+  CheckStatus(NeonStatus);
 }
 //---------------------------------------------------------------------------
 void __fastcall TWebDAVFileSystem::CreateDirectory(const UnicodeString DirName)

+ 1 - 0
source/core/WebDAVFileSystem.h

@@ -194,6 +194,7 @@ private:
   UnicodeString __fastcall ParsePathFromUrl(const UnicodeString & Url);
   int __fastcall ReadDirectoryInternal(const UnicodeString & Path, TRemoteFileList * FileList);
   int __fastcall RenameFileInternal(const UnicodeString & FileName, const UnicodeString & NewName);
+  int __fastcall CopyFileInternal(const UnicodeString & FileName, const UnicodeString & NewName);
   bool __fastcall IsValidRedirect(int NeonStatus, UnicodeString & Path);
   UnicodeString __fastcall DirectoryPath(UnicodeString Path);
   UnicodeString __fastcall FilePath(const TRemoteFile * File);