Browse Source

Custom command pattern !E preserves session name + Added SessionOptions.Name and SessionOptions.ToString (returning the .Name)

Source commit: ea39798fc71918a420fa69fc33c66e8748789f39
Martin Prikryl 6 năm trước cách đây
mục cha
commit
754f418e57
3 tập tin đã thay đổi với 63 bổ sung9 xóa
  1. 41 1
      dotnet/SessionOptions.cs
  2. 21 7
      source/core/SessionData.cpp
  3. 1 1
      source/core/SessionData.h

+ 41 - 1
dotnet/SessionOptions.cs

@@ -46,6 +46,7 @@ namespace WinSCP
             RawSettings = new Dictionary<string,string>();
         }
 
+        public string Name { get { return GetName(); } set { _name = value; } }
         public Protocol Protocol { get { return _protocol; } set { SetProtocol(value); } }
         public string HostName { get; set; }
         public int PortNumber { get { return _portNumber; } set { SetPortNumber(value); } }
@@ -217,7 +218,15 @@ namespace WinSCP
                     }
                     else if (parameterName.StartsWith(RawSettingsPrefix, StringComparison.OrdinalIgnoreCase))
                     {
-                        AddRawSettings(UriUnescape(parameterName.Substring(RawSettingsPrefix.Length)), parameter);
+                        parameterName = UriUnescape(parameterName.Substring(RawSettingsPrefix.Length));
+                        if (parameterName.Equals("name", StringComparison.OrdinalIgnoreCase))
+                        {
+                            Name = parameter;
+                        }
+                        else
+                        {
+                            AddRawSettings(parameterName, parameter);
+                        }
                     }
                     else
                     {
@@ -427,6 +436,36 @@ namespace WinSCP
             }
         }
 
+        private string GetName()
+        {
+            string result;
+            if (_name != null)
+            {
+                result = _name;
+            }
+            else
+            {
+                if (!string.IsNullOrEmpty(HostName) && !string.IsNullOrEmpty(UserName))
+                {
+                    result = $"{UserName}@{HostName}";
+                }
+                else if (!string.IsNullOrEmpty(HostName))
+                {
+                    result = HostName;
+                }
+                else
+                {
+                    result = "session";
+                }
+            }
+            return result;
+        }
+
+        public override string ToString()
+        {
+            return Name;
+        }
+
         private SecureString _securePassword;
         private SecureString _secureNewPassword;
         private SecureString _securePrivateKeyPassphrase;
@@ -436,6 +475,7 @@ namespace WinSCP
         private int _portNumber;
         private string _webdavRoot;
         private Protocol _protocol;
+        private string _name;
 
         private const string _listPattern = @"{0}(;{0})*";
         private const string _sshHostKeyPattern = @"((ssh-rsa|ssh-dss|ssh-ed25519|ecdsa-sha2-nistp(256|384|521))( |-))?(\d+ )?(([0-9a-fA-F]{2}(:|-)){15}[0-9a-fA-F]{2}|[0-9a-zA-Z+/\-_]{43}=?)";

+ 21 - 7
source/core/SessionData.cpp

@@ -1179,10 +1179,14 @@ void __fastcall TSessionData::DoSave(THierarchicalStorage * Storage,
   SavePasswords(Storage, PuttyExport, DoNotEncryptPasswords);
 }
 //---------------------------------------------------------------------
-TStrings * __fastcall TSessionData::SaveToOptions(const TSessionData * Default)
+TStrings * __fastcall TSessionData::SaveToOptions(const TSessionData * Default, bool SaveName)
 {
   std::unique_ptr<TStringList> Options(new TStringList());
   std::unique_ptr<TOptionsStorage> OptionsStorage(new TOptionsStorage(Options.get(), true));
+  if (SaveName)
+  {
+    OptionsStorage->WriteString(L"Name", Name);
+  }
   DoSave(OptionsStorage.get(), false, Default, true);
   return Options.release();
 }
@@ -2051,9 +2055,17 @@ bool __fastcall TSessionData::ParseUrl(UnicodeString Url, TOptions * Options,
         }
         else if (StartsText(UrlRawSettingsParamNamePrefix, ConnectionParamName))
         {
-          UnicodeString Name = RightStr(ConnectionParamName, ConnectionParamName.Length() - UrlRawSettingsParamNamePrefix.Length());
-          Name = DecodeUrlChars(Name);
-          RawSettings->Values[Name] = DecodeUrlChars(ConnectionParam);
+          UnicodeString AName = RightStr(ConnectionParamName, ConnectionParamName.Length() - UrlRawSettingsParamNamePrefix.Length());
+          AName = DecodeUrlChars(AName);
+          UnicodeString Value = DecodeUrlChars(ConnectionParam);
+          if (SameText(AName, L"Name"))
+          {
+            Name = Value;
+          }
+          else
+          {
+            RawSettings->Values[AName] = Value;
+          }
         }
       }
 
@@ -3064,7 +3076,9 @@ TStrings * __fastcall TSessionData::GetRawSettingsForUrl()
   SessionData->Ftps = FactoryDefaults->Ftps;
   SessionData->HostKey = FactoryDefaults->HostKey;
   SessionData->CopyNonCoreData(FactoryDefaults.get());
-  return SessionData->SaveToOptions(FactoryDefaults.get());
+  // Cannot be decided in SaveToOptions as it does not have HostName and UserName, so it cannot calculate DefaultSessionName.
+  bool SaveName = HasSessionName() && (Name != DefaultSessionName);
+  return SessionData->SaveToOptions(FactoryDefaults.get(), SaveName);
 }
 //---------------------------------------------------------------------
 bool __fastcall TSessionData::HasRawSettingsForUrl()
@@ -3240,7 +3254,7 @@ UnicodeString __fastcall TSessionData::GenerateOpenCommandArgs(bool Rtf)
     SessionData->Timeout = FactoryDefaults->Timeout;
   }
 
-  std::unique_ptr<TStrings> RawSettings(SessionData->SaveToOptions(FactoryDefaults.get()));
+  std::unique_ptr<TStrings> RawSettings(SessionData->SaveToOptions(FactoryDefaults.get(), false));
 
   if (RawSettings->Count > 0)
   {
@@ -3454,7 +3468,7 @@ void __fastcall TSessionData::GenerateAssemblyCode(
 
   Head += AssemblyNewClassInstanceEnd(Language, false);
 
-  std::unique_ptr<TStrings> RawSettings(SessionData->SaveToOptions(FactoryDefaults.get()));
+  std::unique_ptr<TStrings> RawSettings(SessionData->SaveToOptions(FactoryDefaults.get(), false));
 
   UnicodeString SessionOptionsVariableName = AssemblyVariableName(Language, SessionOptionsClassName);
 

+ 1 - 1
source/core/SessionData.h

@@ -444,7 +444,7 @@ private:
   void __fastcall AddAssemblyProperty(
     UnicodeString & Result, TAssemblyLanguage Language,
     const UnicodeString & Name, bool Value);
-  TStrings * __fastcall SaveToOptions(const TSessionData * Default);
+  TStrings * __fastcall SaveToOptions(const TSessionData * Default, bool SaveName);
   void __fastcall ApplyRawSettings(TStrings * RawSettings);
   TStrings * __fastcall GetRawSettingsForUrl();
   void __fastcall DoCopyData(TSessionData * SourceData, bool NoRecrypt);