private static void LevelOrderTraverseFolder(RootCompareObject root, int numOfPaths, IVisitor visitor, Progress syncProgress) { Queue<BaseCompareObject> levelQueue = new Queue<BaseCompareObject>(); RootCompareObject rt; FolderCompareObject folder = null; levelQueue.Enqueue(root); while (levelQueue.Count > 0) { if (syncProgress != null && syncProgress.State == SyncState.Cancelled) return; BaseCompareObject currObj = levelQueue.Dequeue(); if ((rt = currObj as RootCompareObject) != null) visitor.Visit(rt); else if ((folder = currObj as FolderCompareObject) != null) visitor.Visit(folder, numOfPaths); else visitor.Visit(currObj as FileCompareObject, numOfPaths); Dictionary<string, BaseCompareObject>.ValueCollection values; if (rt != null) { values = rt.Contents.Values; foreach (BaseCompareObject o in values) levelQueue.Enqueue(o); } else if (folder != null) { values = folder.Contents.Values; foreach (BaseCompareObject o in values) levelQueue.Enqueue(o); } } }
/// <summary> /// Instantiates an instance of <c>SyncerVisitor</c> with the sync configuration and progress object passed in. /// </summary> /// <param name="syncConfig">The sync configuration to pass in.</param> /// <param name="progress">The progress object to pass in.</param> public SyncerVisitor(SyncConfig syncConfig, Progress progress) { _syncConfig = syncConfig; _syncProgress = progress; }
/// <summary> /// Traverse the tree in post-order, starting from the <see cref="RootCompareObject"/>. /// </summary> /// <param name="root">The <see cref="RootCompareObject"/> to start level-traversal from.</param> /// <param name="visitor">The <see cref="IVisitor"/> that will be used to visit the tree.</param> /// <param name="syncProgress">The <see cref="Progress"/> object to pass in.</param> public static void PostTraverseFolder(RootCompareObject root, IVisitor visitor, Progress syncProgress) { TraverseFolderHelper(root, visitor, TraverseType.Post, syncProgress); }
/// <summary> /// Traverse the tree in level order, starting from the <see cref="RootCompareObject"/>. /// </summary> /// <param name="root">The <see cref="RootCompareObject"/> to start level-traversal from.</param> /// <param name="visitor">The <see cref="IVisitor"/> that will be used to visit the tree.</param> /// <param name="syncProgress">The <see cref="Progress"/> object to pass in.</param> public static void LevelOrderTraverseFolder(RootCompareObject root, IVisitor visitor, Progress syncProgress) { LevelOrderTraverseFolder(root, root.Paths.Length, visitor, syncProgress); }
// Method will return any time the state of the sync progress becomes cancelled. private static void TraverseFolderHelper(FolderCompareObject folder, int numOfPaths, IVisitor visitor, TraverseType type, Progress syncProgress) { if (syncProgress != null && syncProgress.State == SyncState.Cancelled) return; if (type == TraverseType.Pre) visitor.Visit(folder, numOfPaths); Dictionary<string, BaseCompareObject>.ValueCollection values = folder.Contents.Values; foreach (BaseCompareObject o in values) { if (syncProgress != null && syncProgress.State == SyncState.Cancelled) return; FolderCompareObject fco; if ((fco = o as FolderCompareObject) != null) TraverseFolderHelper(fco, numOfPaths, visitor, type, syncProgress); else visitor.Visit(o as FileCompareObject, numOfPaths); } if (type == TraverseType.Post) visitor.Visit(folder, numOfPaths); }