/// <summary> /// Raises the <see cref="E:CircuitChanged" /> event. /// </summary> /// <param name="e">The <see cref="CircuitEventArgs"/> instance containing the event data.</param> internal void OnCircuitChanged(CircuitEventArgs e) { if (circuitChangedHandlers != null) { circuitChangedHandlers(client, e); } }
/// <summary> /// Called when a circuit changes within the tor service. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="CircuitEventArgs"/> instance containing the event data.</param> private void OnCircuitChanged(object sender, CircuitEventArgs e) { if (e.Circuit == null) { return; } lock (synchronizeCircuits) { Circuit existing = circuits.Where(c => c.ID == e.Circuit.ID).FirstOrDefault(); if (existing == null) { if (Status.MaximumRecords <= circuits.Count) { Circuit removal = circuits.Where(c => c.Status == CircuitStatus.Closed || c.Status == CircuitStatus.Failed).FirstOrDefault(); if (removal == null) { return; } circuits.Remove(removal); } existing = e.Circuit; existing.GetRouters(); circuits.Add(existing); } else { bool update = existing.Paths.Count != e.Circuit.Paths.Count || e.Circuit.Status == CircuitStatus.Extended; existing.BuildFlags = e.Circuit.BuildFlags; existing.HSState = e.Circuit.HSState; existing.Paths = e.Circuit.Paths; existing.Purpose = e.Circuit.Purpose; existing.Reason = e.Circuit.Reason; existing.Status = e.Circuit.Status; existing.TimeCreated = e.Circuit.TimeCreated; if (update) { existing.GetRouters(); } } } if (CircuitsChanged != null) { CircuitsChanged(client, EventArgs.Empty); } }