示例#1
0
        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);
            }
        }
示例#2
0
 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();
             }));
         }
     }
 }
示例#3
0
        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();
            }
        }
示例#4
0
        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();
            }));
        }
示例#5
0
 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();
             }));
         }
     }
 }
示例#6
0
        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();
                    }));
                }
            }
        }