Browse Source

Bug 1737: Do not scan unvisited network folders (2nd)

https://winscp.net/tracker/1737
(cherry picked from commit 6c4b5cf15fdf071e23d6779e9370bd6dd666d125)

# Conflicts:
#	source/packages/filemng/DriveView.pas

Source commit: 0738367024f51985c4b036d570d2c74324c42726
Martin Prikryl 6 năm trước cách đây
mục cha
commit
94f764472c
1 tập tin đã thay đổi với 47 bổ sung34 xóa
  1. 47 34
      source/packages/filemng/DriveView.pas

+ 47 - 34
source/packages/filemng/DriveView.pas

@@ -175,8 +175,7 @@ type
     procedure SetShowVolLabel(ShowIt: Boolean);
     procedure SetDirView(Value: TDirView);
     procedure SetDirectory(Value: string); override;
-    procedure GetNodeShellAttr(ParentFolder: IShellFolder; NodeData: TNodeData;
-      Path: string; ContentMask: Boolean = True);
+    procedure GetNodeShellAttr(ParentNode: TTreeNode; NodeData: TNodeData; GetAttr: Boolean);
     function  DoScanDir(FromNode: TTreeNode): Boolean;
     function  AddChildNode(ParentNode: TTreeNode; SRec: TSearchRec): TTreeNode;
     procedure CreateWatchThread(Drive: string);
@@ -1200,17 +1199,42 @@ begin
   end;
 end; {GetDriveText}
 
-procedure TDriveView.GetNodeShellAttr(ParentFolder: IShellFolder;
-  NodeData: TNodeData; Path: string; ContentMask: Boolean = True);
+procedure TDriveView.GetNodeShellAttr(ParentNode: TTreeNode; NodeData: TNodeData; GetAttr: Boolean);
+var
+  ParentFolder: IShellFolder;
+  ParentData: TNodeData;
 begin
   NodeData.shAttr := 0;
-  if Assigned(ParentFolder) and Assigned(NodeData) then
+
+  if GetAttr then
   begin
-    if not Assigned(NodeData.PIDL) then
-      NodeData.PIDL := PIDL_GetFromParentFolder(ParentFolder, PChar(Path));
-    if Assigned(NodeData.PIDL) then
+    if Assigned(ParentNode) then
+    begin
+      ParentData := TNodeData(ParentNode.Data);
+      if not Assigned(ParentData) then
+      begin
+        Assert(False);
+        ParentFolder := nil;
+      end
+        else
+      begin
+        if not Assigned(ParentData.ShellFolder) then
+        begin
+          GetNodeShellAttr(ParentNode.Parent, ParentData, GetAttr);
+        end;
+        ParentFolder := ParentData.ShellFolder;
+      end;
+    end
+      else
     begin
-      if ContentMask then
+      ParentFolder := FDesktop;
+    end;
+
+    if Assigned(ParentFolder) and Assigned(NodeData) then
+    begin
+      if not Assigned(NodeData.PIDL) then
+        NodeData.PIDL := PIDL_GetFromParentFolder(ParentFolder, PChar(NodeData.DirName));
+      if Assigned(NodeData.PIDL) then
       begin
         NodeData.shAttr := SFGAO_CONTENTSMASK;
 
@@ -1222,18 +1246,13 @@ begin
         begin
           NodeData.shAttr := 0;
         end;
-      end
-        else
-      begin
-        NodeData.shAttr := 0;
-      end;
 
-      if not Assigned(NodeData.ShellFolder) then
-      begin
-        ParentFolder.BindToObject(NodeData.PIDL, nil, IID_IShellFolder,
-          Pointer(NodeData.ShellFolder));
-      end;
-    end
+        if not Assigned(NodeData.ShellFolder) then
+        begin
+          ParentFolder.BindToObject(NodeData.PIDL, nil, IID_IShellFolder, Pointer(NodeData.ShellFolder));
+        end;
+      end
+    end;
   end;
 
   if NodeData.shAttr = 0 then
@@ -1296,6 +1315,7 @@ var
   NextDriveNode: TTreeNode;
   Index: Integer;
   Drive: string;
+  GetAttr: Boolean;
 begin
   SaveCursor := Screen.Cursor;
   Screen.Cursor := crHourGlass;
@@ -1332,11 +1352,10 @@ begin
               NodeData.ShortName := NodeData.DirName;
 
               {Get the shared attributes:}
-              if DriveInfo.IsFixedDrive(Drive) and (DriveType <> DRIVE_REMOVABLE) and
-                 ((DriveType <> DRIVE_REMOTE) or GetNetWorkConnected(Drive)) then
-              begin
-                GetNodeShellAttr(FDesktop, NodeData, NodeData.DirName);
-              end;
+              GetAttr :=
+                DriveInfo.IsFixedDrive(Drive) and (DriveType <> DRIVE_REMOVABLE) and
+                ((DriveType <> DRIVE_REMOTE) or GetNetWorkConnected(Drive));
+              GetNodeShellAttr(nil, NodeData, GetAttr);
 
               if Assigned(NextDriveNode) then
                 RootNode := Items.InsertObject(NextDriveNode, '', NodeData)
@@ -1419,7 +1438,7 @@ function TDriveView.AddChildNode(ParentNode: TTreeNode; SRec: TSearchRec): TTree
 var
   NewNode: TTreeNode;
   NodeData: TNodeData;
-  ContentMask: Boolean;
+  GetAttr: Boolean;
 begin
   NodeData := TNodeData.Create;
   NodeData.Attr := SRec.Attr;
@@ -1434,16 +1453,10 @@ begin
   { query content attributes ("has subfolder") only if tree view is visible }
   { to avoid unnecessary scan of subfolders (which may take some time) }
   { if tree view is not visible anyway }
-  ContentMask :=
+  GetAttr :=
     Visible and
     (GetDriveTypeToNode(ParentNode) <> DRIVE_REMOTE);
-
-  if not Assigned(TNodeData(ParentNode.Data).ShellFolder) then
-  begin
-    GetNodeShellAttr(FDesktop, TNodeData(ParentNode.Data), NodePathName(ParentNode), ContentMask);
-  end;
-
-  GetNodeShellAttr(TNodeData(ParentNode.Data).ShellFolder, NodeData, SRec.Name, ContentMask);
+  GetNodeShellAttr(ParentNode, NodeData, GetAttr);
 
   NewNode := Self.Items.AddChildObject(ParentNode, '', NodeData);
   NewNode.Text := GetDisplayName(NewNode);