Преглед на файлове

Bug 2203: Handling download URL does not work when another idle instance is running

https://winscp.net/tracker/2203

Source commit: 93e13a59b293a22a2f9ba15e4dedbe880fa3a564
Martin Prikryl преди 2 години
родител
ревизия
a861304c62
променени са 3 файла, в които са добавени 41 реда и са изтрити 8 реда
  1. 5 3
      source/core/SessionData.cpp
  2. 1 0
      source/core/SessionData.h
  3. 35 5
      source/windows/WinMain.cpp

+ 5 - 3
source/core/SessionData.cpp

@@ -2209,9 +2209,11 @@ bool __fastcall TSessionData::ParseUrl(UnicodeString Url, TOptions * Options,
 
     UnicodeString ARemoteDirectory;
 
+    bool ParseOnly = FLAGSET(Flags, pufParseOnly);
     if (Data != NULL)
     {
-      Assign(Data);
+      DoCopyData(Data, ParseOnly);
+      FSource = Data->FSource;
       int P = 1;
       while (!AnsiSameText(DecodeUrlChars(Url.SubString(1, P)), Data->Name))
       {
@@ -2220,7 +2222,7 @@ bool __fastcall TSessionData::ParseUrl(UnicodeString Url, TOptions * Options,
       }
       ARemoteDirectory = Url.SubString(P + 1, Url.Length() - P);
 
-      if (Data->Hidden)
+      if (Data->Hidden && !ParseOnly)
       {
         Data->Remove();
         StoredSessions->Remove(Data);
@@ -2242,7 +2244,7 @@ bool __fastcall TSessionData::ParseUrl(UnicodeString Url, TOptions * Options,
       // This happens when pasting URL on Login dialog
       if (StoredSessions != NULL)
       {
-        CopyData(StoredSessions->DefaultSettings);
+        DoCopyData(StoredSessions->DefaultSettings, ParseOnly);
       }
       Name = L"";
 

+ 1 - 0
source/core/SessionData.h

@@ -55,6 +55,7 @@ enum TParseUrlFlags
   pufAllowStoredSiteWithProtocol = 0x01,
   pufUnsafe = 0x02,
   pufPreferProtocol = 0x04,
+  pufParseOnly = 0x08,
 };
 //---------------------------------------------------------------------------
 extern const UnicodeString CipherNames[CIPHER_COUNT];

+ 35 - 5
source/windows/WinMain.cpp

@@ -23,13 +23,24 @@
 //---------------------------------------------------------------------------
 #pragma package(smart_init)
 //---------------------------------------------------------------------------
+UnicodeString GetFolderOrWorkspaceName(const UnicodeString & SessionName)
+{
+  UnicodeString FolderOrWorkspaceName = DecodeUrlChars(SessionName);
+  UnicodeString Result;
+  if (StoredSessions->IsFolderOrWorkspace(FolderOrWorkspaceName))
+  {
+    Result = FolderOrWorkspaceName;
+  }
+  return Result;
+}
+//---------------------------------------------------------------------------
 void __fastcall GetLoginData(UnicodeString SessionName, TOptions * Options,
   TObjectList * DataList, UnicodeString & DownloadFile, bool NeedSession, TForm * LinkedForm, int Flags)
 {
   bool DefaultsOnly = false;
 
-  UnicodeString FolderOrWorkspaceName = DecodeUrlChars(SessionName);
-  if (StoredSessions->IsFolderOrWorkspace(FolderOrWorkspaceName))
+  UnicodeString FolderOrWorkspaceName = GetFolderOrWorkspaceName(SessionName);
+  if (!FolderOrWorkspaceName.IsEmpty())
   {
     StoredSessions->GetFolderOrWorkspace(FolderOrWorkspaceName, DataList);
   }
@@ -1164,9 +1175,28 @@ int __fastcall Execute()
       {
         AutoStartSession = Params->ConsumeParam();
 
-        if ((ParamCommand == pcNone) &&
-            (WinConfiguration->ExternalSessionInExistingInstance != OpenInNewWindow()) &&
-            !NewInstance &&
+        bool TrySendToAnotherInstance =
+          (ParamCommand == pcNone) &&
+          (WinConfiguration->ExternalSessionInExistingInstance != OpenInNewWindow()) &&
+          !NewInstance;
+
+        if (TrySendToAnotherInstance &&
+            !AutoStartSession.IsEmpty() &&
+            (AutoStartSession.Pos(L"/") > 0) && // optimization
+            GetFolderOrWorkspaceName(AutoStartSession).IsEmpty())
+        {
+          bool DummyDefaultsOnly = false;
+          UnicodeString DownloadFile2;
+          int Flags = GetCommandLineParseUrlFlags(Params) | pufParseOnly;
+          std::unique_ptr<TSessionData> SessionData(
+            StoredSessions->ParseUrl(AutoStartSession, Params, DummyDefaultsOnly, &DownloadFile2, NULL, NULL, Flags));
+          if (!DownloadFile2.IsEmpty())
+          {
+            TrySendToAnotherInstance = false;
+          }
+        }
+
+        if (TrySendToAnotherInstance &&
             SendToAnotherInstance())
         {
           Configuration->Usage->Inc(L"SendToAnotherInstance");