Sfoglia il codice sorgente

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 10 anni fa
parent
commit
68dae07d6e
2 ha cambiato i file con 28 aggiunte e 0 eliminazioni
  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;