浏览代码

Optimization in anticipation of having to parse commandline URL one more time

Source commit: bf2531704d0091b8015811da8ef58374c7516d71
Martin Prikryl 2 年之前
父节点
当前提交
247565d23b
共有 5 个文件被更改,包括 51 次插入49 次删除
  1. 16 16
      source/core/RemoteFiles.cpp
  2. 14 14
      source/core/RemoteFiles.h
  3. 17 15
      source/core/SessionData.cpp
  4. 3 2
      source/core/SessionData.h
  5. 1 2
      source/windows/WinMain.cpp

+ 16 - 16
source/core/RemoteFiles.cpp

@@ -30,7 +30,7 @@ bool __fastcall UnixIsAbsolutePath(const UnicodeString & Path)
     IsUnixStyleWindowsPath(Path);
     IsUnixStyleWindowsPath(Path);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall UnixIncludeTrailingBackslash(const UnicodeString Path)
+UnicodeString __fastcall UnixIncludeTrailingBackslash(const UnicodeString & Path)
 {
 {
   // it used to return "/" when input path was empty
   // it used to return "/" when input path was empty
   if (!Path.IsEmpty() && !Path.IsDelimiter(L"/", Path.Length()))
   if (!Path.IsEmpty() && !Path.IsDelimiter(L"/", Path.Length()))
@@ -44,7 +44,7 @@ UnicodeString __fastcall UnixIncludeTrailingBackslash(const UnicodeString Path)
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 // Keeps "/" for root path
 // Keeps "/" for root path
-UnicodeString __fastcall UnixExcludeTrailingBackslash(const UnicodeString Path, bool Simple)
+UnicodeString __fastcall UnixExcludeTrailingBackslash(const UnicodeString & Path, bool Simple)
 {
 {
   if (Path.IsEmpty() ||
   if (Path.IsEmpty() ||
       (Path == L"/") ||
       (Path == L"/") ||
@@ -59,7 +59,7 @@ UnicodeString __fastcall UnixExcludeTrailingBackslash(const UnicodeString Path,
   }
   }
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall SimpleUnixExcludeTrailingBackslash(const UnicodeString Path)
+UnicodeString __fastcall SimpleUnixExcludeTrailingBackslash(const UnicodeString & Path)
 {
 {
   return UnixExcludeTrailingBackslash(Path, true);
   return UnixExcludeTrailingBackslash(Path, true);
 }
 }
@@ -69,19 +69,19 @@ UnicodeString __fastcall UnixCombinePaths(const UnicodeString & Path1, const Uni
   return UnixIncludeTrailingBackslash(Path1) + Path2;
   return UnixIncludeTrailingBackslash(Path1) + Path2;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-Boolean __fastcall UnixSamePath(const UnicodeString Path1, const UnicodeString Path2)
+Boolean __fastcall UnixSamePath(const UnicodeString & Path1, const UnicodeString & Path2)
 {
 {
   return (UnixIncludeTrailingBackslash(Path1) == UnixIncludeTrailingBackslash(Path2));
   return (UnixIncludeTrailingBackslash(Path1) == UnixIncludeTrailingBackslash(Path2));
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-bool __fastcall UnixIsChildPath(UnicodeString Parent, UnicodeString Child)
+bool __fastcall UnixIsChildPath(const UnicodeString & AParent, const UnicodeString & AChild)
 {
 {
-  Parent = UnixIncludeTrailingBackslash(Parent);
-  Child = UnixIncludeTrailingBackslash(Child);
+  UnicodeString Parent = UnixIncludeTrailingBackslash(AParent);
+  UnicodeString Child = UnixIncludeTrailingBackslash(AChild);
   return (Child.SubString(1, Parent.Length()) == Parent);
   return (Child.SubString(1, Parent.Length()) == Parent);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall UnixExtractFileDir(const UnicodeString Path)
+UnicodeString __fastcall UnixExtractFileDir(const UnicodeString & Path)
 {
 {
   int Pos = Path.LastDelimiter(L'/');
   int Pos = Path.LastDelimiter(L'/');
   // it used to return Path when no slash was found
   // it used to return Path when no slash was found
@@ -96,7 +96,7 @@ UnicodeString __fastcall UnixExtractFileDir(const UnicodeString Path)
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 // must return trailing backslash
 // must return trailing backslash
-UnicodeString __fastcall UnixExtractFilePath(const UnicodeString Path)
+UnicodeString __fastcall UnixExtractFilePath(const UnicodeString & Path)
 {
 {
   int Pos = Path.LastDelimiter(L'/');
   int Pos = Path.LastDelimiter(L'/');
   // it used to return Path when no slash was found
   // it used to return Path when no slash was found
@@ -110,7 +110,7 @@ UnicodeString __fastcall UnixExtractFilePath(const UnicodeString Path)
   }
   }
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall UnixExtractFileName(const UnicodeString Path)
+UnicodeString __fastcall UnixExtractFileName(const UnicodeString & Path)
 {
 {
   int Pos = Path.LastDelimiter(L'/');
   int Pos = Path.LastDelimiter(L'/');
   UnicodeString Result;
   UnicodeString Result;
@@ -125,7 +125,7 @@ UnicodeString __fastcall UnixExtractFileName(const UnicodeString Path)
   return Result;
   return Result;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall UnixExtractFileExt(const UnicodeString Path)
+UnicodeString __fastcall UnixExtractFileExt(const UnicodeString & Path)
 {
 {
   UnicodeString FileName = UnixExtractFileName(Path);
   UnicodeString FileName = UnixExtractFileName(Path);
   int Pos = FileName.LastDelimiter(L".");
   int Pos = FileName.LastDelimiter(L".");
@@ -222,12 +222,12 @@ bool __fastcall UnixExtractCommonPath(TStrings * Files, UnicodeString & Path)
   return Result;
   return Result;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-bool __fastcall IsUnixRootPath(const UnicodeString Path)
+bool __fastcall IsUnixRootPath(const UnicodeString & Path)
 {
 {
   return Path.IsEmpty() || (Path == ROOTDIRECTORY);
   return Path.IsEmpty() || (Path == ROOTDIRECTORY);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-bool __fastcall IsUnixHiddenFile(const UnicodeString FileName)
+bool __fastcall IsUnixHiddenFile(const UnicodeString & FileName)
 {
 {
   return IsRealFile(FileName) && !FileName.IsEmpty() && (FileName[1] == L'.');
   return IsRealFile(FileName) && !FileName.IsEmpty() && (FileName[1] == L'.');
 }
 }
@@ -272,12 +272,12 @@ UnicodeString __fastcall AbsolutePath(const UnicodeString & Base, const UnicodeS
   return Result;
   return Result;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall FromUnixPath(const UnicodeString Path)
+UnicodeString __fastcall FromUnixPath(const UnicodeString & Path)
 {
 {
   return ReplaceStr(Path, L"/", L"\\");
   return ReplaceStr(Path, L"/", L"\\");
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall ToUnixPath(const UnicodeString Path)
+UnicodeString __fastcall ToUnixPath(const UnicodeString & Path)
 {
 {
   return ReplaceStr(Path, L"\\", L"/");
   return ReplaceStr(Path, L"\\", L"/");
 }
 }
@@ -323,7 +323,7 @@ static void __fastcall CutFirstDirectory(UnicodeString & S, bool Unix)
   }
   }
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-UnicodeString __fastcall MinimizeName(const UnicodeString FileName, int MaxLen, bool Unix)
+UnicodeString __fastcall MinimizeName(const UnicodeString & FileName, int MaxLen, bool Unix)
 {
 {
   UnicodeString Drive, Dir, Name, Result;
   UnicodeString Drive, Dir, Name, Result;
   UnicodeString Sep = Unix ? L"/" : L"\\";
   UnicodeString Sep = Unix ? L"/" : L"\\";

+ 14 - 14
source/core/RemoteFiles.h

@@ -560,26 +560,26 @@ private:
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 bool __fastcall IsUnixStyleWindowsPath(const UnicodeString & Path);
 bool __fastcall IsUnixStyleWindowsPath(const UnicodeString & Path);
 bool __fastcall UnixIsAbsolutePath(const UnicodeString & Path);
 bool __fastcall UnixIsAbsolutePath(const UnicodeString & Path);
-UnicodeString __fastcall UnixIncludeTrailingBackslash(const UnicodeString Path);
-UnicodeString __fastcall UnixExcludeTrailingBackslash(const UnicodeString Path, bool Simple = false);
-UnicodeString __fastcall SimpleUnixExcludeTrailingBackslash(const UnicodeString Path);
+UnicodeString __fastcall UnixIncludeTrailingBackslash(const UnicodeString & Path);
+UnicodeString __fastcall UnixExcludeTrailingBackslash(const UnicodeString & Path, bool Simple = false);
+UnicodeString __fastcall SimpleUnixExcludeTrailingBackslash(const UnicodeString & Path);
 UnicodeString __fastcall UnixCombinePaths(const UnicodeString & Path1, const UnicodeString & Path2);
 UnicodeString __fastcall UnixCombinePaths(const UnicodeString & Path1, const UnicodeString & Path2);
-UnicodeString __fastcall UnixExtractFileDir(const UnicodeString Path);
-UnicodeString __fastcall UnixExtractFilePath(const UnicodeString Path);
-UnicodeString __fastcall UnixExtractFileName(const UnicodeString Path);
+UnicodeString __fastcall UnixExtractFileDir(const UnicodeString & Path);
+UnicodeString __fastcall UnixExtractFilePath(const UnicodeString & Path);
+UnicodeString __fastcall UnixExtractFileName(const UnicodeString & Path);
 UnicodeString ExtractShortName(const UnicodeString & Path, bool Unix);
 UnicodeString ExtractShortName(const UnicodeString & Path, bool Unix);
-UnicodeString __fastcall UnixExtractFileExt(const UnicodeString Path);
-Boolean __fastcall UnixSamePath(const UnicodeString Path1, const UnicodeString Path2);
-bool __fastcall UnixIsChildPath(UnicodeString Parent, UnicodeString Child);
+UnicodeString __fastcall UnixExtractFileExt(const UnicodeString & Path);
+Boolean __fastcall UnixSamePath(const UnicodeString & Path1, const UnicodeString & Path2);
+bool __fastcall UnixIsChildPath(const UnicodeString & Parent, const UnicodeString & Child);
 bool __fastcall ExtractCommonPath(TStrings * Files, UnicodeString & Path);
 bool __fastcall ExtractCommonPath(TStrings * Files, UnicodeString & Path);
 bool __fastcall UnixExtractCommonPath(TStrings * Files, UnicodeString & Path);
 bool __fastcall UnixExtractCommonPath(TStrings * Files, UnicodeString & Path);
 UnicodeString __fastcall ExtractFileName(const UnicodeString & Path, bool Unix);
 UnicodeString __fastcall ExtractFileName(const UnicodeString & Path, bool Unix);
-bool __fastcall IsUnixRootPath(const UnicodeString Path);
-bool __fastcall IsUnixHiddenFile(const UnicodeString Path);
+bool __fastcall IsUnixRootPath(const UnicodeString & Path);
+bool __fastcall IsUnixHiddenFile(const UnicodeString & Path);
 UnicodeString __fastcall AbsolutePath(const UnicodeString & Base, const UnicodeString & Path);
 UnicodeString __fastcall AbsolutePath(const UnicodeString & Base, const UnicodeString & Path);
-UnicodeString __fastcall FromUnixPath(const UnicodeString Path);
-UnicodeString __fastcall ToUnixPath(const UnicodeString Path);
-UnicodeString __fastcall MinimizeName(const UnicodeString FileName, int MaxLen, bool Unix);
+UnicodeString __fastcall FromUnixPath(const UnicodeString & Path);
+UnicodeString __fastcall ToUnixPath(const UnicodeString & Path);
+UnicodeString __fastcall MinimizeName(const UnicodeString & FileName, int MaxLen, bool Unix);
 UnicodeString __fastcall MakeFileList(TStrings * FileList);
 UnicodeString __fastcall MakeFileList(TStrings * FileList);
 TDateTime __fastcall ReduceDateTimePrecision(TDateTime DateTime,
 TDateTime __fastcall ReduceDateTimePrecision(TDateTime DateTime,
   TModificationFmt Precision);
   TModificationFmt Precision);

+ 17 - 15
source/core/SessionData.cpp

@@ -654,7 +654,7 @@ bool __fastcall TSessionData::IsSameSite(const TSessionData * Other)
     (UserName == Other->UserName);
     (UserName == Other->UserName);
 }
 }
 //---------------------------------------------------------------------
 //---------------------------------------------------------------------
-bool __fastcall TSessionData::IsInFolderOrWorkspace(UnicodeString AFolder)
+bool __fastcall TSessionData::IsInFolderOrWorkspace(const UnicodeString & AFolder)
 {
 {
   return StartsText(UnixIncludeTrailingBackslash(AFolder), Name);
   return StartsText(UnixIncludeTrailingBackslash(AFolder), Name);
 }
 }
@@ -5447,37 +5447,39 @@ void TStoredSessionList::SelectKnownHostsForSelectedSessions(
   }
   }
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
-bool __fastcall TStoredSessionList::IsFolderOrWorkspace(
-  const UnicodeString & Name, bool Workspace)
+TSessionData * TStoredSessionList::GetFirstFolderOrWorkspaceSession(const UnicodeString & Name)
 {
 {
-  bool Result = false;
-  TSessionData * FirstData = NULL;
+  TSessionData * Result = NULL;
   if (!Name.IsEmpty())
   if (!Name.IsEmpty())
   {
   {
-    for (int Index = 0; !Result && (Index < Count); Index++)
+    UnicodeString NameWithSlash = UnixIncludeTrailingBackslash(Name); // optimization
+    for (int Index = 0; (Result == NULL) && (Index < Count); Index++)
     {
     {
-      Result = Sessions[Index]->IsInFolderOrWorkspace(Name);
-      if (Result)
+      if (Sessions[Index]->IsInFolderOrWorkspace(NameWithSlash))
       {
       {
-        FirstData = Sessions[Index];
+        Result = Sessions[Index];
       }
       }
     }
     }
   }
   }
 
 
-  return
-    Result &&
-    DebugAlwaysTrue(FirstData != NULL) &&
-    (FirstData->IsWorkspace == Workspace);
+  return Result;
+}
+//---------------------------------------------------------------------------
+bool __fastcall TStoredSessionList::IsFolderOrWorkspace(const UnicodeString & Name)
+{
+  return (GetFirstFolderOrWorkspaceSession(Name) != NULL);
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 bool __fastcall TStoredSessionList::IsFolder(const UnicodeString & Name)
 bool __fastcall TStoredSessionList::IsFolder(const UnicodeString & Name)
 {
 {
-  return IsFolderOrWorkspace(Name, false);
+  TSessionData * SessionData = GetFirstFolderOrWorkspaceSession(Name);
+  return (SessionData != NULL) && !SessionData->IsWorkspace;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 bool __fastcall TStoredSessionList::IsWorkspace(const UnicodeString & Name)
 bool __fastcall TStoredSessionList::IsWorkspace(const UnicodeString & Name)
 {
 {
-  return IsFolderOrWorkspace(Name, true);
+  TSessionData * SessionData = GetFirstFolderOrWorkspaceSession(Name);
+  return (SessionData != NULL) && SessionData->IsWorkspace;
 }
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 TSessionData * __fastcall TStoredSessionList::CheckIsInFolderOrWorkspaceAndResolve(
 TSessionData * __fastcall TStoredSessionList::CheckIsInFolderOrWorkspaceAndResolve(

+ 3 - 2
source/core/SessionData.h

@@ -527,7 +527,7 @@ public:
   bool __fastcall IsSame(const TSessionData * Default, bool AdvancedOnly);
   bool __fastcall IsSame(const TSessionData * Default, bool AdvancedOnly);
   bool __fastcall IsSameDecrypted(const TSessionData * Default);
   bool __fastcall IsSameDecrypted(const TSessionData * Default);
   bool __fastcall IsSameSite(const TSessionData * Default);
   bool __fastcall IsSameSite(const TSessionData * Default);
-  bool __fastcall IsInFolderOrWorkspace(UnicodeString Name);
+  bool __fastcall IsInFolderOrWorkspace(const UnicodeString & Name);
   UnicodeString __fastcall GenerateSessionUrl(unsigned int Flags);
   UnicodeString __fastcall GenerateSessionUrl(unsigned int Flags);
   bool __fastcall HasRawSettingsForUrl();
   bool __fastcall HasRawSettingsForUrl();
   bool __fastcall HasSessionName();
   bool __fastcall HasSessionName();
@@ -754,6 +754,7 @@ public:
   void __fastcall NewWorkspace(UnicodeString Name, TList * DataList);
   void __fastcall NewWorkspace(UnicodeString Name, TList * DataList);
   bool __fastcall IsFolder(const UnicodeString & Name);
   bool __fastcall IsFolder(const UnicodeString & Name);
   bool __fastcall IsWorkspace(const UnicodeString & Name);
   bool __fastcall IsWorkspace(const UnicodeString & Name);
+  bool __fastcall IsFolderOrWorkspace(const UnicodeString & Name);
   TSessionData * __fastcall ParseUrl(UnicodeString Url, TOptions * Options, bool & DefaultsOnly,
   TSessionData * __fastcall ParseUrl(UnicodeString Url, TOptions * Options, bool & DefaultsOnly,
     UnicodeString * FileName = NULL, bool * ProtocolDefined = NULL, UnicodeString * MaskedUrl = NULL, int Flags = 0);
     UnicodeString * FileName = NULL, bool * ProtocolDefined = NULL, UnicodeString * MaskedUrl = NULL, int Flags = 0);
   bool __fastcall IsUrl(UnicodeString Url);
   bool __fastcall IsUrl(UnicodeString Url);
@@ -788,7 +789,7 @@ private:
     TSessionData * Data, bool All, bool RecryptPasswordOnly,
     TSessionData * Data, bool All, bool RecryptPasswordOnly,
     TSessionData * FactoryDefaults);
     TSessionData * FactoryDefaults);
   TSessionData * __fastcall ResolveWorkspaceData(TSessionData * Data);
   TSessionData * __fastcall ResolveWorkspaceData(TSessionData * Data);
-  bool __fastcall IsFolderOrWorkspace(const UnicodeString & Name, bool Workspace);
+  TSessionData * GetFirstFolderOrWorkspaceSession(const UnicodeString & Name);
   TSessionData * __fastcall CheckIsInFolderOrWorkspaceAndResolve(
   TSessionData * __fastcall CheckIsInFolderOrWorkspaceAndResolve(
     TSessionData * Data, const UnicodeString & Name);
     TSessionData * Data, const UnicodeString & Name);
   void __fastcall ImportLevelFromFilezilla(_di_IXMLNode Node, const UnicodeString & Path, _di_IXMLNode SettingsNode);
   void __fastcall ImportLevelFromFilezilla(_di_IXMLNode Node, const UnicodeString & Path, _di_IXMLNode SettingsNode);

+ 1 - 2
source/windows/WinMain.cpp

@@ -29,8 +29,7 @@ void __fastcall GetLoginData(UnicodeString SessionName, TOptions * Options,
   bool DefaultsOnly = false;
   bool DefaultsOnly = false;
 
 
   UnicodeString FolderOrWorkspaceName = DecodeUrlChars(SessionName);
   UnicodeString FolderOrWorkspaceName = DecodeUrlChars(SessionName);
-  if (StoredSessions->IsFolder(FolderOrWorkspaceName) ||
-      StoredSessions->IsWorkspace(FolderOrWorkspaceName))
+  if (StoredSessions->IsFolderOrWorkspace(FolderOrWorkspaceName))
   {
   {
     StoredSessions->GetFolderOrWorkspace(FolderOrWorkspaceName, DataList);
     StoredSessions->GetFolderOrWorkspace(FolderOrWorkspaceName, DataList);
   }
   }