/// <summary> /// process a status-changed-event /// </summary> /// <param name="sce">status-changed-event</param> public void ProcessStatusChangedEventAsync(StatusChangedEvent sce) { SyncElementInfo sei = sce.SyncElementInfo; bool isFile = typeof(SyncFileInfo) == sei.GetType(); switch (sce.CreateStatus) { case SyncElementStatus.ElementFound: UpdateTreeNodeIfVisible(sei.ElementInfo, true); break; case SyncElementStatus.ChangeDetectingStarted: break; case SyncElementStatus.NoChangeFound: UpdateTreeNodeIfVisible(sei.ElementInfo, true); break; case SyncElementStatus.ChangeFound: UpdateTreeNodeIfVisible(sei.ElementInfo, true); break; case SyncElementStatus.ChangeApplied: UpdateTreeNodeIfVisible(sei.ElementInfo, true); break; case SyncElementStatus.Conflicted: string elementType = isFile ? "file" : "dir"; string conflictType = ""; switch (sei.ConflictInfo.Type) { case ConflictType.IO: conflictType = "IO"; break; case ConflictType.UA: conflictType = "Access Denied"; break; case ConflictType.DirNotEmpty: conflictType = "Dir Not Empty"; break; case ConflictType.Unknown: conflictType = "Unknown"; break; } Invoke(new Action(() => AddLogLine($"Conflict ({conflictType}) at {elementType} in {sei.ConflictInfo.Context}: {sei.ConflictInfo.GetAbsolutePath()}") )); UpdateTreeNodeIfVisible(sei.ElementInfo, true); break; } }
/// <summary> /// is called when the status of a sync-element has changed /// </summary> /// <param name="sei"></param> public void OnSyncElementStatusChanged(SyncElementInfo sei) { //parallel access management _statusChangedEventsSetAccessRequested = true; if (_statusChangedEventsGetAccessRequested && _statusChangedEvents.Count >= maxPendingStatusChangedEventsToProcess) { _statusChangedEventsGetAccess = true; } while (_statusChangedEventsGetAccess) { Thread.Sleep(1); } _statusChangedEventsSetAccessRequested = false; // Add events to list, in order to process them in another thread. // So the sync execution is not delayed. _statusChangedEvents.Add(new StatusChangedEvent(sei, sei.SyncStatus)); }
/// <summary> /// create StatusChangedEvent /// </summary> /// <param name="syncElementInfo">reference to the element, whose status has been changed</param> /// <param name="createStatus">the status of the element, which should be preserved</param> public StatusChangedEvent(SyncElementInfo syncElementInfo, SyncElementStatus createStatus) { SyncElementInfo = syncElementInfo; CreateStatus = createStatus; }
public void OnSyncElementStatusChanged(SyncElementInfo sei) { bool isFile = typeof(SyncFileInfo) == sei.GetType(); switch (sei.SyncStatus) { case SyncElementStatus.ElementFound: //update treeview TreeNodeCollection tnc = treeView1.Nodes; TreeNode treeNode; for (int i = 0; i < sei.ElementInfo.TreePath.Count; i++) { treeNode = tnc[sei.ElementInfo.TreePath[i].Info.Name]; if (treeNode == null) { return; } tnc = treeNode.Nodes; } treeView1.Invoke(new Action(() => { if (isFile) { AddFileTreeNode(tnc, (MyFileInfo)sei.ElementInfo); } else { AddDirTreeNode(tnc, (MyDirInfo)sei.ElementInfo); } })); break; case SyncElementStatus.ChangeDetectingStarted: Console.WriteLine("Start detecting file:" + sei.ElementInfo.FullPath); break; case SyncElementStatus.NoChangeFound: break; case SyncElementStatus.ChangeFound: TreeNode tn1 = getTreeNode(sei.ElementInfo); if (tn1 == null) { break; } tn1.ForeColor = Color.Blue; if (tn1 != null) { treeView1.Invoke(new Action(() => { foreach (TreeNode ptn in NextParentNode(tn1)) { ptn.Text = ptn.Text + " - #cf"; } })); } if (isFile) { Console.WriteLine("file change detected:" + sei.SyncExecutionInfo.AbsoluteDestPath); } else { Console.WriteLine("directory change detected:" + sei.SyncExecutionInfo.AbsoluteDestPath); } break; case SyncElementStatus.ChangeApplied: TreeNode tn2 = getTreeNode(sei.ElementInfo); if (tn2 != null) { treeView1.Invoke(new Action(() => { foreach (TreeNode ptn in NextParentNode(tn2)) { ptn.Text = ptn.Text + " - #ca"; } })); } if (isFile) { if (sei.SyncExecutionInfo.Remove) { Console.WriteLine("file deleted:" + sei.SyncExecutionInfo.AbsoluteDestPath); } else { Console.WriteLine("file copied:" + sei.SyncExecutionInfo.AbsoluteDestPath); } } else { if (sei.SyncExecutionInfo.Remove) { Console.WriteLine("directory removed:" + sei.SyncExecutionInfo.AbsoluteDestPath); } else { Console.WriteLine("Directory created:" + sei.SyncExecutionInfo.AbsoluteDestPath); } } break; case SyncElementStatus.Conflicted: string elementType = isFile ? "file" : "dir"; string conflictType = ""; switch (sei.ConflictInfo.Type) { case ConflictType.IO: conflictType = "IO"; break; case ConflictType.UA: conflictType = "Access Denied"; break; case ConflictType.Unknown: conflictType = "Unknown"; break; } AddLogLine($"Conflict ({conflictType}) at {elementType}: {sei.ConflictInfo.GetAbsolutePath()}"); break; } }