private static void Thread_ProgressChanged(object sender, ProgressChangedEventArgs e) { if (ApplicationOptions.PopupOption == ApplicationOptions.PopupNotificationOption.Always || (ApplicationOptions.PopupOption == ApplicationOptions.PopupNotificationOption.WhenMinimized && Application.Current.MainWindow.WindowState == WindowState.Minimized)) { if (!Application.Current.Windows.OfType <PopupNotificationWindow>().Any()) { // Mark all existing status changes as read. for (int i = 0; i < StatusChangeLog.Count; ++i) { StatusChangeLog[i].HasStatusBeenCleared = true; } } StatusChangeLog.Add(e.UserState as StatusChangeLog); if (StatusWindow != null && StatusWindow.IsLoaded) { if (StatusWindow.WindowState == WindowState.Minimized) { StatusWindow.WindowState = WindowState.Normal; } StatusWindow.Focus(); } else if (!Application.Current.Windows.OfType <PopupNotificationWindow>().Any()) { var wnd = new PopupNotificationWindow(StatusChangeLog); wnd.Show(); } } else { StatusChangeLog.Add(e.UserState as StatusChangeLog); } }
public void StartStop() { if (string.IsNullOrEmpty(Hostname)) { return; } if (IsActive) { // Stopping probe. StopProbe(ProbeStatus.Inactive); } else { // Starting probe. CancelSource = new CancellationTokenSource(); if (Hostname.StartsWith("#")) { Type = ProbeType.Comment; } else if (Hostname.StartsWith("D/")) { Type = ProbeType.Dns; Hostname = Hostname.Substring(2); PerformDnsLookup(CancelSource.Token); } else if (Hostname.StartsWith("T/")) { Type = ProbeType.Traceroute; Hostname = Hostname.Substring(2); PerformTraceroute(CancelSource.Token); } else if (Hostname.Count(f => f == ':') == 1 || Hostname.Contains("]:")) { Type = ProbeType.Ping; Task.Run(() => PerformTcpProbe(CancelSource.Token), CancelSource.Token); Application.Current.Dispatcher.BeginInvoke(new Action(() => { mutex.WaitOne(); StatusChangeLog.Add(new StatusChangeLog { Timestamp = DateTime.Now, Hostname = Hostname, Alias = Alias, Status = ProbeStatus.Start }); mutex.ReleaseMutex(); })); } else { Type = ProbeType.Ping; Task.Run(() => PerformIcmpProbe(CancelSource.Token), CancelSource.Token); Application.Current.Dispatcher.BeginInvoke(new Action(() => { mutex.WaitOne(); StatusChangeLog.Add(new StatusChangeLog { Timestamp = DateTime.Now, Hostname = Hostname, Alias = Alias, Status = ProbeStatus.Start }); mutex.ReleaseMutex(); })); } } }
private void TriggerStatusChange(StatusChangeLog status) { if (ApplicationOptions.PopupOption == ApplicationOptions.PopupNotificationOption.Always || (ApplicationOptions.PopupOption == ApplicationOptions.PopupNotificationOption.WhenMinimized && Application.Current.MainWindow.WindowState == WindowState.Minimized)) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { mutex.WaitOne(); if (!Application.Current.Windows.OfType <PopupNotificationWindow>().Any()) { // Mark all existing status changes as read. for (int i = 0; i < StatusChangeLog.Count; ++i) { StatusChangeLog[i].HasStatusBeenCleared = true; } } StatusChangeLog.Add(status); mutex.ReleaseMutex(); if (StatusWindow != null && StatusWindow.IsLoaded) { if (StatusWindow.WindowState == WindowState.Minimized) { StatusWindow.WindowState = WindowState.Normal; } StatusWindow.Focus(); } else if (!Application.Current.Windows.OfType <PopupNotificationWindow>().Any()) { new PopupNotificationWindow(StatusChangeLog).Show(); } })); } else { mutex.WaitOne(); StatusChangeLog.Add(status); mutex.ReleaseMutex(); } if (ApplicationOptions.IsLogStatusChangesEnabled && ApplicationOptions.LogStatusChangesPath.Length > 0) { WriteToStatusChangesLog(status); } if ((status.Status == ProbeStatus.Down) && (ApplicationOptions.IsAudioAlertEnabled)) { SoundPlayer player = new SoundPlayer(ApplicationOptions.AudioFilePath); player.Play(); } }
private void StopProbe(ProbeStatus status) { CancelSource.Cancel(); Status = status; IsActive = false; Application.Current.Dispatcher.BeginInvoke(new Action(() => { mutex.WaitOne(); if (status != ProbeStatus.Error) { WriteFinalStatisticsToHistory(); } StatusChangeLog.Add(new StatusChangeLog { Timestamp = DateTime.Now, Hostname = Hostname, Alias = Alias, Status = ProbeStatus.Stop }); mutex.ReleaseMutex(); })); }
private void WriteToStatusChangesLog(StatusChangeLog status) { // If logging is enabled, write the status change to a file. if (ApplicationOptions.IsLogStatusChangesEnabled && ApplicationOptions.LogStatusChangesPath.Length > 0) { try { using (System.IO.StreamWriter outputFile = new System.IO.StreamWriter(ApplicationOptions.LogStatusChangesPath, true)) { outputFile.WriteLine($"{DateTime.Now.ToShortDateString()} {DateTime.Now.ToLongTimeString()}\t{status.Hostname}\t{status.Alias}\t{status.StatusAsString}"); } } catch (Exception ex) { ApplicationOptions.IsLogStatusChangesEnabled = false; Application.Current.Dispatcher.BeginInvoke(new Action(() => { DialogWindow.ErrorWindow($"Failed writing to log file. Logging has been disabled. {ex.Message}").ShowDialog(); })); } } }
private void TriggerStatusChange(StatusChangeLog status) { Application.Current.Dispatcher.BeginInvoke(new Action(() => { if (ApplicationOptions.PopupOption == ApplicationOptions.PopupNotificationOption.Always || (ApplicationOptions.PopupOption == ApplicationOptions.PopupNotificationOption.WhenMinimized && Application.Current.MainWindow.WindowState == WindowState.Minimized)) { mutex.WaitOne(); if (!Application.Current.Windows.OfType <PopupNotificationWindow>().Any()) { // Mark all existing status changes as read. for (int i = 0; i < StatusChangeLog.Count; ++i) { StatusChangeLog[i].HasStatusBeenCleared = true; } } StatusChangeLog.Add(status); mutex.ReleaseMutex(); if (StatusWindow != null && StatusWindow.IsLoaded) { if (StatusWindow.WindowState == WindowState.Minimized) { StatusWindow.WindowState = WindowState.Normal; } StatusWindow.Focus(); } else if (!Application.Current.Windows.OfType <PopupNotificationWindow>().Any()) { new PopupNotificationWindow(StatusChangeLog).Show(); } } else { mutex.WaitOne(); StatusChangeLog.Add(status); mutex.ReleaseMutex(); } })); if (ApplicationOptions.IsLogStatusChangesEnabled && ApplicationOptions.LogStatusChangesPath.Length > 0) { mutex.WaitOne(); WriteToStatusChangesLog(status); mutex.ReleaseMutex(); } if ((ApplicationOptions.IsAudioDownAlertEnabled) && (status.Status == ProbeStatus.Down)) { try { using (SoundPlayer player = new SoundPlayer(ApplicationOptions.AudioDownFilePath)) { player.Play(); } } catch (Exception ex) { ApplicationOptions.IsAudioDownAlertEnabled = false; Application.Current.Dispatcher.BeginInvoke(new Action(() => { DialogWindow.ErrorWindow($"Failed to play audio file. Audio alerts have been disabled. {ex.Message}").ShowDialog(); })); } } else if ((ApplicationOptions.IsAudioUpAlertEnabled) && (status.Status == ProbeStatus.Up)) { try { using (SoundPlayer player = new SoundPlayer(ApplicationOptions.AudioUpFilePath)) { player.Play(); } } catch (Exception ex) { ApplicationOptions.IsAudioUpAlertEnabled = false; Application.Current.Dispatcher.BeginInvoke(new Action(() => { DialogWindow.ErrorWindow($"Failed to play audio file. Audio alerts have been disabled. {ex.Message}").ShowDialog(); })); } } }