Martin Prikryl 17 years ago
parent
commit
a6b86840e8

+ 4 - 4
Console.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 2,1,1,96
-PRODUCTVERSION 2,1,1,96
+FILEVERSION 2,1,1,97
+PRODUCTVERSION 2,1,1,97
 FILEOS 0x4
 FILETYPE 0x1
 {
@@ -10,13 +10,13 @@ FILETYPE 0x1
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "Console interface for WinSCP\0"
-            VALUE "FileVersion", "2.1.1.96\0"
+            VALUE "FileVersion", "2.1.1.97\0"
             VALUE "InternalName", "console\0"
             VALUE "LegalCopyright", "(c) 2000-2008 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "winscp.com\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.1.5.0\0"
+            VALUE "ProductVersion", "4.1.6.0\0"
             VALUE "WWW", "http://winscp.net/\0"
         }
     }

+ 1 - 1
DScpComp.bpk

@@ -27,7 +27,7 @@
     <MAINSOURCE value="DScpComp.cpp"/>
     <INCLUDEPATH value="components;core;packages\filemng;packages\dragndrop;packages\my;$(BCB)\include;$(BCB)\include\vcl"/>
     <LIBPATH value="components;$(BCB)\lib\obj;$(BCB)\lib"/>
-    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig 
+    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig
       -wpin -w-par -wnod -wnak -wdef -wcln -wbbf -wasm -wamp -wamb"/>
     <OTHERFILES value=""/>
   </MACROS>

+ 4 - 4
DragExt.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 1,1,8,90
-PRODUCTVERSION 1,1,8,90
+FILEVERSION 1,1,8,91
+PRODUCTVERSION 1,1,8,91
 FILEOS 0x4
 FILETYPE 0x2
 {
@@ -10,13 +10,13 @@ FILETYPE 0x2
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "Drag&Drop shell extension for WinSCP (32-bit)\0"
-            VALUE "FileVersion", "1.1.8.90\0"
+            VALUE "FileVersion", "1.1.8.91\0"
             VALUE "InternalName", "dragext32\0"
             VALUE "LegalCopyright", "(c) 2000-2008 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "dragext.dll\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.1.5.0\0"
+            VALUE "ProductVersion", "4.1.6.0\0"
             VALUE "WWW", "http://winscp.net/\0"
         }
     }

+ 4 - 4
DragExt64.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 1,1,8,90
-PRODUCTVERSION 1,1,8,90
+FILEVERSION 1,1,8,91
+PRODUCTVERSION 1,1,8,91
 FILEOS 0x4
 FILETYPE 0x2
 {
@@ -10,13 +10,13 @@ FILETYPE 0x2
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "Drag&Drop shell extension for WinSCP (64-bit)\0"
-            VALUE "FileVersion", "1.1.8.90\0"
+            VALUE "FileVersion", "1.1.8.91\0"
             VALUE "InternalName", "dragext64\0"
             VALUE "LegalCopyright", "(c) 2000-2008 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "dragext64.dll\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.1.5.0\0"
+            VALUE "ProductVersion", "4.1.6.0\0"
             VALUE "WWW", "http://winscp.net/\0"
         }
     }

+ 2 - 2
FileZilla.bpr

@@ -31,8 +31,8 @@
     <MAINSOURCE value="FileZilla.bpf"/>
     <INCLUDEPATH value="filezilla;filezilla\misc;resource;$(BCB)\include;$(BCB)\include\vcl;$(BCB)\include\mfc"/>
     <LIBPATH value="filezilla;filezilla\misc;$(BCB)\lib\obj;$(BCB)\lib"/>
-    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wucp -w-sus -wstu -w-rch -w-pia -w-par 
-      -wnod -wnak -w-hid -w-dup -w-csu -w-com -wcln -w-ccc -wbbf -w-aus -wasm 
+    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wucp -w-sus -wstu -w-rch -w-pia -w-par
+      -wnod -wnak -w-hid -w-dup -w-csu -w-com -wcln -w-ccc -wbbf -w-aus -wasm
       -wamp -wamb"/>
     <LISTFILE value=""/>
     <OTHERFILES value=""/>

+ 2 - 2
Putty.bpr

@@ -32,8 +32,8 @@
     <MAINSOURCE value="Putty.bpf"/>
     <INCLUDEPATH value="putty;putty\CHARSET;putty\WINDOWS;$(BCB)\include;$(BCB)\include\vcl"/>
     <LIBPATH value="putty;putty\CHARSET;putty\WINDOWS;$(BCB)\lib\obj;$(BCB)\lib"/>
-    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -w-sus -wstv -wstu -w-rvl -w-rch -w-pia 
-      -w-pck -w-pch -w-par -wnod -wnak -w-8027 -w-eff -w-csu -wcln -w-ccc -wbbf 
+    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -w-sus -wstv -wstu -w-rvl -w-rch -w-pia
+      -w-pck -w-pch -w-par -wnod -wnak -w-8027 -w-eff -w-csu -wcln -w-ccc -wbbf
       -w-aus -wasm -wamp -wamb"/>
     <LISTFILE value=""/>
     <OTHERFILES value=""/>

+ 1 - 1
RScpComp.bpr

@@ -23,7 +23,7 @@
     <MAINSOURCE value="RScpComp.bpf"/>
     <INCLUDEPATH value="components;core;windows;packages\filemng;packages\dragndrop;packages\my;$(BCB)\include;$(BCB)\include\vcl"/>
     <LIBPATH value="components;$(BCB)\lib\obj;$(BCB)\lib"/>
-    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig 
+    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig
       -wpin -wnod -wnak -wdef -wcln -wbbf -wasm -wamp -wamb"/>
     <LISTFILE value=""/>
     <OTHERFILES value=""/>

+ 1 - 1
ScpCore.bpr

@@ -29,7 +29,7 @@
     <MAINSOURCE value="ScpCore.bpf"/>
     <INCLUDEPATH value="windows;core;putty;putty\windows;filezilla;resource;$(BCB)\include;$(BCB)\include\vcl;$(BCB)\include\mfc"/>
     <LIBPATH value="core;$(BCB)\lib\obj;$(BCB)\lib"/>
-    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig 
+    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig
       -wpin -wnod -wnak -wdef -wcln -wbbf -wasm -wamp -wamb"/>
     <LISTFILE value=""/>
     <OTHERFILES value=""/>

+ 13 - 13
ScpForms.bpr

@@ -20,18 +20,18 @@
       forms\SynchronizeProgress.obj"/>
     <RESFILES value=""/>
     <DEFFILE value=""/>
-    <RESDEPEN value="$(RESFILES) forms\About.dfm forms\Authenticate.dfm forms\Cleanup.dfm 
-      forms\ComboInput.dfm forms\Console.dfm forms\Copy.dfm forms\CopyParams.dfm 
-      forms\CopyParamCustom.dfm forms\CopyParamPreset.dfm 
-      forms\CreateDirectory.dfm forms\CustomCommand.dfm forms\Editor.dfm 
-      forms\EditorPreferences.dfm forms\FileSystemInfo.dfm 
-      forms\FullSynchronize.dfm forms\GeneralSettings.dfm forms\Glyphs.dfm 
-      forms\ImportSessions.dfm forms\License.dfm forms\LocationProfiles.dfm 
-      forms\Log.dfm forms\Login.dfm forms\LogSettings.dfm 
-      forms\OpenDirectory.dfm forms\Preferences.dfm forms\Progress.dfm 
-      forms\Properties.dfm forms\RemoteTransfer.dfm forms\Rights.dfm 
-      forms\RightsExt.dfm forms\SaveSession.dfm forms\SelectMask.dfm 
-      forms\Symlink.dfm forms\Synchronize.dfm forms\SynchronizeChecklist.dfm 
+    <RESDEPEN value="$(RESFILES) forms\About.dfm forms\Authenticate.dfm forms\Cleanup.dfm
+      forms\ComboInput.dfm forms\Console.dfm forms\Copy.dfm forms\CopyParams.dfm
+      forms\CopyParamCustom.dfm forms\CopyParamPreset.dfm
+      forms\CreateDirectory.dfm forms\CustomCommand.dfm forms\Editor.dfm
+      forms\EditorPreferences.dfm forms\FileSystemInfo.dfm
+      forms\FullSynchronize.dfm forms\GeneralSettings.dfm forms\Glyphs.dfm
+      forms\ImportSessions.dfm forms\License.dfm forms\LocationProfiles.dfm
+      forms\Log.dfm forms\Login.dfm forms\LogSettings.dfm
+      forms\OpenDirectory.dfm forms\Preferences.dfm forms\Progress.dfm
+      forms\Properties.dfm forms\RemoteTransfer.dfm forms\Rights.dfm
+      forms\RightsExt.dfm forms\SaveSession.dfm forms\SelectMask.dfm
+      forms\Symlink.dfm forms\Synchronize.dfm forms\SynchronizeChecklist.dfm
       forms\SynchronizeProgress.dfm"/>
     <LIBFILES value=""/>
     <LIBRARIES value=""/>
@@ -48,7 +48,7 @@
     <MAINSOURCE value="ScpForms.bpf"/>
     <INCLUDEPATH value="forms;core;components;windows;resource;packages\filemng;packages\dragndrop;packages\my;packages\tb2k;packages\tbx;packages\theme;$(BCB)\include;$(BCB)\include\vcl"/>
     <LIBPATH value="windows;forms;$(BCB)\lib\obj;$(BCB)\lib"/>
-    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig 
+    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig
       -wpin -wnod -wnak -wdef -wcln -wbbf -wasm -wamp -wamb"/>
     <LISTFILE value=""/>
     <OTHERFILES value=""/>

+ 3 - 3
WinSCP.bpr

@@ -15,9 +15,9 @@
       windows\WinMain.obj"/>
     <RESFILES value="windows\Windows.res WinSCP.res"/>
     <DEFFILE value=""/>
-    <RESDEPEN value="$(RESFILES) forms\CustomScpExplorer.dfm forms\NonVisual.dfm 
+    <RESDEPEN value="$(RESFILES) forms\CustomScpExplorer.dfm forms\NonVisual.dfm
       forms\ScpCommander.dfm forms\ScpExplorer.dfm"/>
-    <LIBFILES value="lib\FileZilla.lib lib\Putty.lib lib\RScpComp.lib lib\ScpCore.lib 
+    <LIBFILES value="lib\FileZilla.lib lib\Putty.lib lib\RScpComp.lib lib\ScpCore.lib
       lib\ScpForms.lib"/>
     <LIBRARIES value="DragDrop_B5.lib DriveDir_B5.lib Moje_B5.lib
       ThemeManagerC6.lib rtl.lib tb2k_cb6.lib tbx_cb6.lib vcl.lib vclx.lib
@@ -38,7 +38,7 @@
     <MAINSOURCE value="WinSCP.cpp"/>
     <INCLUDEPATH value="core;console;forms;windows;resource;components;dragext;packages\filemng;packages\dragndrop;packages\my;packages\tb2k;packages\tbx;packages\theme;$(BCB)\include;$(BCB)\include\vcl;$(BCB)\include\mfc"/>
     <LIBPATH value="lib;windows;forms;packages\filemng;packages\tbx;packages\theme;$(BCB)\lib;$(BCB)\lib\obj;$(BCB)\lib\psdk"/>
-    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig 
+    <WARNINGS value="-w8092 -w8091 -w8090 -w8089 -w8087 -wprc -wuse -wucp -wstv -wstu -wsig
       -wpin -wnod -wnak -wdef -wcln -wbbf -wasm -wamp -wamb"/>
     <OTHERFILES value=""/>
   </MACROS>

+ 5 - 5
WinSCP.rc

@@ -1,6 +1,6 @@
 1 VERSIONINFO
-FILEVERSION 4,1,5,410
-PRODUCTVERSION 4,1,5,410
+FILEVERSION 4,1,6,412
+PRODUCTVERSION 4,1,6,412
 FILEOS 0x4
 FILETYPE 0x1
 {
@@ -10,13 +10,13 @@ FILETYPE 0x1
         {
             VALUE "CompanyName", "Martin Prikryl\0"
             VALUE "FileDescription", "SFTP, FTP and SCP client\0"
-            VALUE "FileVersion", "4.1.5.410\0"
+            VALUE "FileVersion", "4.1.6.412\0"
             VALUE "InternalName", "winscp\0"
             VALUE "LegalCopyright", "(c) 2000-2008 Martin Prikryl\0"
             VALUE "LegalTrademarks", "\0"
-            VALUE "OriginalFilename", "winscp415.exe\0"
+            VALUE "OriginalFilename", "winscp416.exe\0"
             VALUE "ProductName", "WinSCP\0"
-            VALUE "ProductVersion", "4.1.5.0\0"
+            VALUE "ProductVersion", "4.1.6.0\0"
             VALUE "WWW", "http://winscp.net/\0"
         }
     }

+ 26 - 29
components/UnixDriveView.cpp

@@ -156,23 +156,23 @@ void __fastcall TCustomUnixDriveView::UpdatePath(TTreeNode * Node, bool Force,
     TStringList * ChildrenDirs = new TStringList();
     try
     {
-      ChildrenDirs->Sorted = true;
       ChildrenDirs->Duplicates = dupAccept;
       ChildrenDirs->CaseSensitive = true;
 
-      bool HadChildren = (Node->Count > 0);
-      if (HadChildren)
+      TTreeNode * ChildNode = Node->getFirstChild();
+      while (ChildNode != NULL)
       {
-        for (int i = 0; i < Node->Count; i++)
-        {
-          TTreeNode * ChildNode = Node->Item[i];
-          TNodeData * ChildData = NodeData(ChildNode);
-          ChildData->File = NULL;
-          ChildrenDirs->AddObject(UnixExtractFileName(ChildData->Directory),
-            ChildNode);
-        }
+        TNodeData * ChildData = NodeData(ChildNode);
+        ChildData->File = NULL;
+        ChildrenDirs->AddObject(UnixExtractFileName(ChildData->Directory),
+          ChildNode);
+        ChildNode = Node->GetNextChild(ChildNode);
       }
 
+      // sort only after adding all items.
+      // should be faster then keeping the list sorted since beginning
+      ChildrenDirs->Sorted = true;
+
       for (int i = 0; i < Data->FileList->Count; i++)
       {
         TRemoteFile * File = Data->FileList->Files[i];
@@ -199,16 +199,13 @@ void __fastcall TCustomUnixDriveView::UpdatePath(TTreeNode * Node, bool Force,
         }
       }
 
-      if (HadChildren)
+      for (int i = 0; i < ChildrenDirs->Count; i++)
       {
-        for (int i = 0; i < ChildrenDirs->Count; i++)
+        TTreeNode * ChildNode = dynamic_cast<TTreeNode *>(ChildrenDirs->Objects[i]);
+        TNodeData * ChildData = NodeData(ChildNode);
+        if ((ChildData->File == NULL) && NodeCanDelete(ChildNode))
         {
-          TTreeNode * ChildNode = dynamic_cast<TTreeNode *>(ChildrenDirs->Objects[i]);
-          TNodeData * ChildData = NodeData(ChildNode);
-          if ((ChildData->File == NULL) && NodeCanDelete(ChildNode))
-          {
-            ChildNode->Delete();
-          }
+          ChildNode->Delete();
         }
       }
 
@@ -221,9 +218,10 @@ void __fastcall TCustomUnixDriveView::UpdatePath(TTreeNode * Node, bool Force,
   }
   else if (Force)
   {
-    for (int i = Node->Count - 1; i >= 0; i--)
+    TTreeNode * ChildNode = Node->GetLastChild();
+    while (ChildNode != NULL)
     {
-      TTreeNode * ChildNode = Node->Item[i];
+      TTreeNode * PrevChildNode = Node->GetPrevChild(ChildNode);
       TRemoteFile * File = NodeFile(ChildNode);
       if (!NodeCanDelete(ChildNode) ||
           ((ShowHiddenDirs || !NodeIsHidden(ChildNode)) &&
@@ -235,6 +233,7 @@ void __fastcall TCustomUnixDriveView::UpdatePath(TTreeNode * Node, bool Force,
       {
         ChildNode->Delete();
       }
+      ChildNode = PrevChildNode;
     }
   }
   #endif
@@ -656,10 +655,7 @@ TTreeNode * __fastcall TCustomUnixDriveView::FindNodeToPath(AnsiString Path)
   #ifndef DESIGN_ONLY
   if (IsUnixRootPath(Path))
   {
-    if (Items->Count > 0)
-    {
-      Result = Items->Item[0];
-    }
+    Result = Items->GetFirstNode();
   }
   else
   {
@@ -671,7 +667,7 @@ TTreeNode * __fastcall TCustomUnixDriveView::FindNodeToPath(AnsiString Path)
       Parent = FindNodeToPath(UnixExtractFileDir(Path));
     }
 
-    if ((Parent != NULL) && (Parent->Count > 0))
+    if ((Parent != NULL) && (Parent->getFirstChild() != NULL))
     {
       AnsiString DirName = UnixExtractFileName(Path);
       int StartIndex = 0;
@@ -716,7 +712,7 @@ TTreeNode * __fastcall TCustomUnixDriveView::FindPathNode(AnsiString Path)
   TTreeNode * Result = NULL;
 
   #ifndef DESIGN_ONLY
-  if (Items->Count > 0)
+  if (Items->GetFirstNode() != NULL)
   {
     do
     {
@@ -742,9 +738,10 @@ void __fastcall TCustomUnixDriveView::ValidateDirectoryEx(TTreeNode * /*Node*/,
 //---------------------------------------------------------------------------
 void __fastcall TCustomUnixDriveView::RebuildTree()
 {
-  if (Items->Count > 0)
+  TTreeNode * First = Items->GetFirstNode();
+  if (First != NULL)
   {
-    UpdatePath(Items->Item[0], true);
+    UpdatePath(First, true);
   }
 }
 //---------------------------------------------------------------------------

+ 38 - 23
core/Option.cpp

@@ -24,35 +24,50 @@ void __fastcall TOptions::Add(AnsiString Value)
   {
     FNoMoreSwitches = true;
   }
-  else if (!FNoMoreSwitches &&
-    (Value.Length() >= 2) &&
-    (FSwitchMarks.Pos(Value[1]) > 0))
+  else
   {
-    int Index = 2;
-    while (Index <= Value.Length())
+    bool Switch = false;
+    int Index = 0; // shut up
+    if (!FNoMoreSwitches &&
+        (Value.Length() >= 2) &&
+        (FSwitchMarks.Pos(Value[1]) > 0))
     {
-      if (Value.IsDelimiter(FSwitchValueDelimiters, Index))
+      Index = 2;
+      Switch = true;
+      while (Switch && (Index <= Value.Length()))
       {
-        break;
+        if (Value.IsDelimiter(FSwitchValueDelimiters, Index))
+        {
+          break;
+        }
+        // this is to treat /home/martin as parameter, not as switch
+        else if ((Value[Index] != '?') && ((UpCase(Value[Index]) < 'A') || (UpCase(Value[Index]) > 'Z')))
+        {
+          Switch = false;
+          break;
+        }
+        ++Index;
       }
-      ++Index;
     }
 
-    TOption Option;
-    Option.Type = otSwitch;
-    Option.Name = Value.SubString(2, Index - 2);
-    Option.Value = Value.SubString(Index + 1, Value.Length());
-    Option.Used = false;
-    FOptions.push_back(Option);
-  }
-  else
-  {
-    TOption Option;
-    Option.Type = otParam;
-    Option.Value = Value;
-    Option.Used = false;
-    FOptions.push_back(Option);
-    ++FParamCount;
+    if (Switch)
+    {
+      TOption Option;
+      Option.Type = otSwitch;
+      Option.Name = Value.SubString(2, Index - 2);
+      Option.Value = Value.SubString(Index + 1, Value.Length());
+      Option.Used = false;
+      FOptions.push_back(Option);
+    }
+    else
+    {
+      TOption Option;
+      Option.Type = otParam;
+      Option.Value = Value;
+      Option.Used = false;
+      FOptions.push_back(Option);
+      ++FParamCount;
+    }
   }
 }
 //---------------------------------------------------------------------------

+ 13 - 9
core/Script.cpp

@@ -775,20 +775,24 @@ void __fastcall TScript::LsProc(TScriptProcParams * Parameters)
   }
 
   TRemoteFileList * FileList = FTerminal->ReadDirectoryListing(Directory, false);
-  try
+  // on error user may select "skip", then we get NULL
+  if (FileList != NULL)
   {
-    for (int i = 0; i < FileList->Count; i++)
+    try
     {
-      TRemoteFile * File = FileList->Files[i];
-      if (Mask.IsEmpty() || TFileMasks::SingleMaskMatch(Mask, File->FileName))
+      for (int i = 0; i < FileList->Count; i++)
       {
-        PrintLine(FileList->Files[i]->ListingStr);
+        TRemoteFile * File = FileList->Files[i];
+        if (Mask.IsEmpty() || TFileMasks::SingleMaskMatch(Mask, File->FileName))
+        {
+          PrintLine(FileList->Files[i]->ListingStr);
+        }
       }
     }
-  }
-  __finally
-  {
-    delete FileList;
+    __finally
+    {
+      delete FileList;
+    }
   }
 }
 //---------------------------------------------------------------------------

+ 58 - 29
core/SftpFileSystem.cpp

@@ -3232,24 +3232,30 @@ void __fastcall TSFTPFileSystem::CreateDirectory(const AnsiString DirName,
   Packet.AddProperties(NULL, 0, true, FVersion, FUtfStrings);
   SendPacketAndReceiveResponse(&Packet, &Packet, SSH_FXP_STATUS);
 
-  // explicitly set permissions after directory creation,
-  // permissions specified in SSH_FXP_MKDIR are ignored at least by OpenSSH
-  try
+  // Explicitly set permissions after directory creation,
+  // permissions specified in SSH_FXP_MKDIR are ignored at least by OpenSSH.
+  // But do nothing unless there was any properties change really required
+  // (saves bandwidth, and some servers does not allow SSH_FXP_SETSTAT on dirs,
+  // e.g. Serv-u)
+  if (!Properties->Valid.Empty())
   {
-    Packet.ChangeType(SSH_FXP_SETSTAT);
-    Packet.AddPathString(CanonifiedName, FUtfStrings);
-    Packet.AddProperties(Properties, 0, true, FVersion, FUtfStrings);
-    SendPacketAndReceiveResponse(&Packet, &Packet, SSH_FXP_STATUS);
-  }
-  catch(Exception & E)
-  {
-    if (FTerminal->Active)
+    try
     {
-      throw ECommand(&E, FMTLOAD(CHANGE_PROPERTIES_ERROR, (DirName)));
+      Packet.ChangeType(SSH_FXP_SETSTAT);
+      Packet.AddPathString(CanonifiedName, FUtfStrings);
+      Packet.AddProperties(Properties, 0, true, FVersion, FUtfStrings);
+      SendPacketAndReceiveResponse(&Packet, &Packet, SSH_FXP_STATUS);
     }
-    else
+    catch(Exception & E)
     {
-      throw;
+      if (FTerminal->Active)
+      {
+        throw ECommand(&E, FMTLOAD(CHANGE_PROPERTIES_ERROR, (DirName)));
+      }
+      else
+      {
+        throw;
+      }
     }
   }
 }
@@ -3598,8 +3604,8 @@ void __fastcall TSFTPFileSystem::SFTPConfirmOverwrite(AnsiString & FileName,
   TFileOperationProgressType * OperationProgress,
   TSFTPOverwriteMode & OverwriteMode, const TOverwriteFileParams * FileParams)
 {
-  bool TargetBiggerThanSource = (FileParams->DestSize > FileParams->SourceSize);
-  bool CanAlternateResume = !TargetBiggerThanSource && !OperationProgress->AsciiTransfer;
+  bool TargetSmallerThanSource = (FileParams->DestSize < FileParams->SourceSize);
+  bool CanAlternateResume = TargetSmallerThanSource && !OperationProgress->AsciiTransfer;
   if (OperationProgress->NoToAll)
   {
     THROW_SKIP_FILE_NULL;
@@ -4107,7 +4113,14 @@ void __fastcall TSFTPFileSystem::SFTPSource(const AnsiString FileName,
           FILE_OPERATION_LOOP(FMTLOAD(DELETE_ON_RESUME_ERROR,
               (UnixExtractFileName(DestFullName), DestFullName)),
 
-            DeleteFile(DestFullName);
+            if (FTerminal->SessionData->OverwrittenToRecycleBin)
+            {
+              FTerminal->RecycleFile(DestFullName, NULL);
+            }
+            else
+            {
+              DeleteFile(DestFullName);
+            }
           );
         }
 
@@ -4225,15 +4238,21 @@ int __fastcall TSFTPFileSystem::SFTPOpenRemote(void * AOpenParams, void * /*Para
 
   int OpenType;
   bool Success = false;
+  bool ConfirmOverwriting;
 
   do
   {
     try
     {
+      ConfirmOverwriting =
+        FTerminal->Configuration->ConfirmOverwriting &&
+        !OpenParams->Confirmed && !OperationProgress->YesToAll && !OpenParams->Resume &&
+        !(OpenParams->Params & cpNoConfirmation);
       OpenType = SSH_FXF_WRITE | SSH_FXF_CREAT;
-      if (FTerminal->Configuration->ConfirmOverwriting &&
-          !OpenParams->Confirmed && !OperationProgress->YesToAll && !OpenParams->Resume &&
-          !(OpenParams->Params & cpNoConfirmation) &&
+      // when we want to preserve overwritten files, we need to find out that
+      // they exist first... even if overwrite confirmation is disabled.
+      // but not when we already know we are not going to overwrite (but e.g. to append)
+      if ((ConfirmOverwriting || FTerminal->SessionData->OverwrittenToRecycleBin) &&
           (OpenParams->OverwriteMode == omOverwrite))
       {
         OpenType |= SSH_FXF_EXCL;
@@ -4293,18 +4312,28 @@ int __fastcall TSFTPFileSystem::SFTPOpenRemote(void * AOpenParams, void * /*Para
           throw;
         }
 
-        // confirmation duplicated in SFTPSource for resumable file transfers.
-        AnsiString RemoteFileNameOnly = UnixExtractFileName(OpenParams->RemoteFileName);
-        SFTPConfirmOverwrite(RemoteFileNameOnly,
-          OperationProgress, OpenParams->OverwriteMode, OpenParams->FileParams);
-        if (RemoteFileNameOnly != UnixExtractFileName(OpenParams->RemoteFileName))
+        // we may get here even if confirmation is disabled,
+        // when we have preserving of overwritten files enabled
+        if (ConfirmOverwriting)
+        {
+          // confirmation duplicated in SFTPSource for resumable file transfers.
+          AnsiString RemoteFileNameOnly = UnixExtractFileName(OpenParams->RemoteFileName);
+          SFTPConfirmOverwrite(RemoteFileNameOnly,
+            OperationProgress, OpenParams->OverwriteMode, OpenParams->FileParams);
+          if (RemoteFileNameOnly != UnixExtractFileName(OpenParams->RemoteFileName))
+          {
+            OpenParams->RemoteFileName =
+              UnixExtractFilePath(OpenParams->RemoteFileName) + RemoteFileNameOnly;
+          }
+          OpenParams->Confirmed = true;
+        }
+        else
         {
-          OpenParams->RemoteFileName =
-            UnixExtractFilePath(OpenParams->RemoteFileName) + RemoteFileNameOnly;
+          assert(FTerminal->SessionData->OverwrittenToRecycleBin);
         }
-        OpenParams->Confirmed = true;
 
-        if (FTerminal->SessionData->OverwrittenToRecycleBin)
+        if ((OpenParams->OverwriteMode == omOverwrite) &&
+            FTerminal->SessionData->OverwrittenToRecycleBin)
         {
           FTerminal->RecycleFile(OpenParams->RemoteFileName, NULL);
         }

+ 1 - 1
packages/ThemeManagerC6.bpk

@@ -31,7 +31,7 @@
     <OTHERFILES value=""/>
   </MACROS>
   <OPTIONS>
-    <IDLCFLAGS value="-Itheme -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG 
+    <IDLCFLAGS value="-Itheme -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG
       -boa"/>
     <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -a8 -b- -k- -vi -c -tWM"/>
     <PFLAGS value="-$YD -$T -$R -$Q -$A8 -v -JPHNE -M"/>

+ 1 - 1
packages/ThemeManagerC6D.bpk

@@ -30,7 +30,7 @@
     <OTHERFILES value=""/>
   </MACROS>
   <OPTIONS>
-    <IDLCFLAGS value="-Itheme -Itheme -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix 
+    <IDLCFLAGS value="-Itheme -Itheme -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix
       cpp -D_DEBUG -boa"/>
     <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -a8 -b- -k- -vi -c -tWM"/>
     <PFLAGS value="-$YD -$T -$R -$Q -$A8 -v -JPHNE -M"/>

+ 3 - 1
packages/my/IEListView.pas

@@ -489,7 +489,9 @@ begin
         end;
       end;
 
-      if ShowImage then
+      // for hidden columns, do not show the icon
+      // as on some systems it is still drawn, but on neighboring columns
+      if ShowImage and (Columns[Index].Width > 0) then
       begin
         HdItem.Mask := HDI_FORMAT or HDI_IMAGE;
         HdItem.fmt := Hditem.fmt or HDF_IMAGE;

+ 1 - 1
packages/tb2kdsgn_cb6.bpk

@@ -9,7 +9,7 @@
     <RESFILES value="tb2k\TB2Reg.dcr"/>
     <IDLFILES value=""/>
     <DEFFILE value=""/>
-    <RESDEPEN value="$(RESFILES) tb2k\TB2DsgnConverter.dfm tb2k\TB2DsgnItemEditor.dfm 
+    <RESDEPEN value="$(RESFILES) tb2k\TB2DsgnConverter.dfm tb2k\TB2DsgnItemEditor.dfm
       tb2k\TB2DsgnConvertOptions.dfm"/>
     <LIBFILES value=""/>
     <LIBRARIES value=""/>

+ 1 - 1
packages/tbx_cb6.bpk

@@ -33,7 +33,7 @@
     <OTHERFILES value=""/>
   </MACROS>
   <OPTIONS>
-    <IDLCFLAGS value="-Itbx\. -Itbx -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG 
+    <IDLCFLAGS value="-Itbx\. -Itbx -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG
       -boa"/>
     <CFLAG1 value="-O2 -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -a8 -b- -k- -vi -c -tWM"/>
     <PFLAGS value="-$Y- -$L- -$D- -$A8 -v -JPHNE -M"/>

+ 20 - 19
packages/theme/ThemeMgr.pas

@@ -1398,16 +1398,10 @@ function TThemeManager.MainWindowHook(var Message: TMessage): Boolean;
 
 var
   Form: TCustomForm;
-
+  I: Integer;
 begin
   Result := False;
 
-  // workaround for so far unknown bug on vista (bug 140)
-  if Message.Msg = WM_GETICON then
-  begin
-    Exit;
-  end;
-
   // If the main manager was destroyed then it posted this message to the application so all still existing
   // theme managers know a new election is due. Well, it is not purely democratic. The earlier a manager was created
   // the higher is the probability to get this message first and become the new main manager.
@@ -1428,19 +1422,26 @@ begin
   end;
 
   // Check first if there are still forms to subclass.
-  while FPendingFormsList.Count > 0 do
+  I := 0;
+  while I < FPendingFormsList.Count do
   begin
-    Form := TCustomForm(FPendingFormsList[0]);
-    FPendingFormsList.Delete(0);
-    FFormList.Add(Form);
-    // Since we don't know how many controls on this form already have been created we better collect everything
-    // which is already there. The window proc lists will take care not to add a control twice.
-    if MainManager = Self then
-      CollectControls(Form);
-    if [toResetMouseCapture, toSetTransparency] * FOptions <> [] then
-      FixControls(Form);
-    // Sometimes not all controls are visually updated. Force it to be correct.
-    RedrawWindow(Form.Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN or RDW_VALIDATE);
+    Form := TCustomForm(FPendingFormsList[I]);
+    // workaround for so far unknown bug on vista (bug 140)
+    // solves similar problem on WinXP
+    if not Form.HandleAllocated then Inc(I)
+      else
+    begin
+      FPendingFormsList.Delete(I);
+      FFormList.Add(Form);
+      // Since we don't know how many controls on this form already have been created we better collect everything
+      // which is already there. The window proc lists will take care not to add a control twice.
+      if MainManager = Self then
+        CollectControls(Form);
+      if [toResetMouseCapture, toSetTransparency] * FOptions <> [] then
+        FixControls(Form);
+      // Sometimes not all controls are visually updated. Force it to be correct.
+      RedrawWindow(Form.Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW or RDW_ALLCHILDREN or RDW_VALIDATE);
+    end;
   end;
 
   while FPendingRecreationList.Count > 0 do

+ 1 - 1
release/winscp.u3i

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <u3manifest version="1.0">
-  <application uuid="48b341d1-d411-4b5a-a82c-f3b5d65602fc" version="4.1.5">
+  <application uuid="48b341d1-d411-4b5a-a82c-f3b5d65602fc" version="4.1.6">
     <icon>winscp.ico</icon>
     <name>WinSCP</name>
     <description>Freeware SFTP (SSH File Transfer Protocol), FTP (File Transfer Protocol) and SCP (Secure CoPy) client for Windows using SSH (Secure SHell). Its main function is safe copying of files between a local and a remote computer.</description>