瀏覽代碼

Bug 1395: When FTP server does not provide precise timestamp, but the timestamp otherwise matches timestamp of the last uploaded version of the file, using precise timestamp of the uploaded version instead

https://winscp.net/tracker/1395

Source commit: 826551d8f310d264718d925ee305247982ebaebb
Martin Prikryl 9 年之前
父節點
當前提交
68dae07d6e
共有 2 個文件被更改,包括 28 次插入0 次删除
  1. 26 0
      source/core/FtpFileSystem.cpp
  2. 2 0
      source/core/FtpFileSystem.h

+ 26 - 0
source/core/FtpFileSystem.cpp

@@ -1987,6 +1987,11 @@ void __fastcall TFTPFileSystem::Source(const UnicodeString FileName,
          ((FServerCapabilities->GetCapability(mdtm_command) == yes))))
     {
       TTouchSessionAction TouchAction(FTerminal->ActionLog, DestFullName, Modification);
+
+      if (!FFileZillaIntf->UsingMlsd())
+      {
+        FUploadedTimes[DestFullName] = Modification;
+      }
     }
 
     FTerminal->LogFileDone(OperationProgress);
@@ -4487,6 +4492,27 @@ bool __fastcall TFTPFileSystem::HandleListData(const wchar_t * Path,
         TDateTime Modification;
         TModificationFmt ModificationFmt;
         RemoteFileTimeToDateTimeAndPrecision(Entry->Time, Modification, ModificationFmt);
+
+        if (ModificationFmt != mfFull)
+        {
+          UnicodeString FullPath = UnixIncludeTrailingBackslash(Path) + File->FileName;
+          TUploadedTimes::iterator Iterator = FUploadedTimes.find(FullPath);
+          if (Iterator != FUploadedTimes.end())
+          {
+            TDateTime UploadModification = Iterator->second;
+            TDateTime UploadModificationReduced = ReduceDateTimePrecision(UploadModification, ModificationFmt);
+            if (UploadModificationReduced == Modification)
+            {
+              Modification = UploadModification;
+              ModificationFmt = mfFull;
+            }
+            else
+            {
+              FUploadedTimes.erase(Iterator);
+            }
+          }
+        }
+
         File->Modification = Modification;
         File->ModificationFmt = ModificationFmt;
         File->LastAccess = File->Modification;

+ 2 - 0
source/core/FtpFileSystem.h

@@ -268,6 +268,8 @@ private:
   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;