/// <summary> /// Builds a graph from the skeleton /// </summary> /// <param name="skel"></param> public SkeletonGraphNode(IEnumerable<InventorySkeletonEntry> skel) { Dictionary<Guid, List<InventorySkeletonEntry>> nodesByParent = new Dictionary<Guid, List<InventorySkeletonEntry>>(); foreach (var node in skel) { if (node.Level == FolderLevel.Root) { this.RootNode = true; this.Self = node; this.Parent = null; } List<InventorySkeletonEntry> childList; if (! nodesByParent.TryGetValue(node.ParentId, out childList)) { childList = new List<InventorySkeletonEntry>(); nodesByParent[node.ParentId] = childList; } childList.Add(node); } this.AllChildren = new Dictionary<Guid, SkeletonGraphNode>(); //start at the root and work down this.RecursiveBuild(nodesByParent, this.AllChildren); }
public void PurgeFolderContents(InventoryFolder folder) { //build a graph from the inventory skeleton var skel = this.GetInventorySkeleton(folder.OwnerId); var graph = new SkeletonGraphNode(skel); var thisNode = graph.AllChildren[folder.FolderId]; //to purge the contents of a folder, we need to collect all //the items and subfolders currently inside of it and delete everything //recursively Tuple <List <InventoryItem>, List <Guid> > itemsAndFolders = new Tuple <List <InventoryItem>, List <Guid> >(new List <InventoryItem>(), new List <Guid>()); RecursiveCollectFolderContents(thisNode, itemsAndFolders); //remove all the items foreach (var item in itemsAndFolders.Item1) { this.PurgeItem(item); } //remove the folders foreach (var folderid in itemsAndFolders.Item2) { if (folderid != folder.FolderId) { this.DeleteFolder(folder.OwnerId, folderid); } } VersionInc(folder.OwnerId, folder.FolderId); }
/// <summary> /// Builds a graph from the skeleton /// </summary> /// <param name="skel"></param> public SkeletonGraphNode(IEnumerable <InventorySkeletonEntry> skel) { Dictionary <Guid, List <InventorySkeletonEntry> > nodesByParent = new Dictionary <Guid, List <InventorySkeletonEntry> >(); foreach (var node in skel) { if (node.Level == FolderLevel.Root) { this.RootNode = true; this.Self = node; this.Parent = null; } List <InventorySkeletonEntry> childList; if (!nodesByParent.TryGetValue(node.ParentId, out childList)) { childList = new List <InventorySkeletonEntry>(); nodesByParent[node.ParentId] = childList; } childList.Add(node); } this.AllChildren = new Dictionary <Guid, SkeletonGraphNode>(); //start at the root and work down this.RecursiveBuild(nodesByParent, this.AllChildren); }
private void RecursiveCollectFolderContents(SkeletonGraphNode node, Tuple <List <InventoryItem>, List <Guid> > itemsAndFolders) { //add folder id itemsAndFolders.Item2.Add(node.Self.FolderId); //add items var folder = this.GetFolder(node.Self.FolderId); itemsAndFolders.Item1.AddRange(folder.Items); //subfolders foreach (var subfolder in node.DirectChildren) { this.RecursiveCollectFolderContents(subfolder, itemsAndFolders); } }
private void RecursiveBuild(Dictionary<Guid, List<InventorySkeletonEntry>> nodesByParent, Dictionary<Guid, SkeletonGraphNode> allChildren) { allChildren.Add(this.Self.FolderId, this); //find my direct children this.DirectChildren = new List<SkeletonGraphNode>(); List<InventorySkeletonEntry> children; if (nodesByParent.TryGetValue(this.Self.FolderId, out children)) { foreach (var child in children) { var newChild = new SkeletonGraphNode { Self = child, Parent = this, RootNode = false }; this.DirectChildren.Add(newChild); newChild.RecursiveBuild(nodesByParent, allChildren); } } }
private void RecursiveBuild(Dictionary <Guid, List <InventorySkeletonEntry> > nodesByParent, Dictionary <Guid, SkeletonGraphNode> allChildren) { allChildren.Add(this.Self.FolderId, this); //find my direct children this.DirectChildren = new List <SkeletonGraphNode>(); List <InventorySkeletonEntry> children; if (nodesByParent.TryGetValue(this.Self.FolderId, out children)) { foreach (var child in children) { var newChild = new SkeletonGraphNode { Self = child, Parent = this, RootNode = false }; this.DirectChildren.Add(newChild); newChild.RecursiveBuild(nodesByParent, allChildren); } } }
private void RecursiveCollectFolderContents(SkeletonGraphNode node, Tuple<List<InventoryItem>, List<Guid>> itemsAndFolders) { //add folder id itemsAndFolders.Item2.Add(node.Self.FolderId); //add items var folder = this.GetFolder(node.Self.FolderId); itemsAndFolders.Item1.AddRange(folder.Items); //subfolders foreach (var subfolder in node.DirectChildren) { this.RecursiveCollectFolderContents(subfolder, itemsAndFolders); } }
public void PurgeFolderContents(InventoryFolder folder) { //build a graph from the inventory skeleton var skel = this.GetInventorySkeleton(folder.OwnerId); var graph = new SkeletonGraphNode(skel); var thisNode = graph.AllChildren[folder.FolderId]; //to purge the contents of a folder, we need to collect all //the items and subfolders currently inside of it and delete everything //recursively Tuple<List<InventoryItem>, List<Guid>> itemsAndFolders = new Tuple<List<InventoryItem>, List<Guid>>(new List<InventoryItem>(), new List<Guid>()); RecursiveCollectFolderContents(thisNode, itemsAndFolders); //remove all the items foreach (var item in itemsAndFolders.Item1) { this.PurgeItem(item); } //remove the folders foreach (var folderid in itemsAndFolders.Item2) { if (folderid != folder.FolderId) { this.DeleteFolder(folder.OwnerId, folderid); } } VersionInc(folder.OwnerId, folder.FolderId); }