This object represents a DNS Cache Entry
        /// <summary>
        /// This method ping's the gamepsy services and verifies that the HOSTS
        /// file redirects are working correctly
        /// </summary>
        protected void VerifyDnsCache()
        {
            // Loop through each service
            for (int i = 0; i < Services.Length; i++)
            {
                // Quit on cancel
                if (TaskSource.IsCancellationRequested)
                    return;

                // Make sure this service exists in the hosts file
                if (i < 4 && Redirector.GamespyServerAddress == null || Redirector.StatsServerAddress == null)
                {
                    SetStatus(i, "Skipped", Resources.question_button, "Entry not found in HOSTS file. Assumed redirect was not desired by user");
                    continue;
                }

                // Prepare for next service
                SetStatus(i, "Checking, Please Wait...", Resources.loading);

                // Ping server to get the IP address in the dns cache
                try
                {
                    IPAddress HostsIp = (i == 4) ? Redirector.StatsServerAddress : Redirector.GamespyServerAddress;
                    DnsCacheResult Result = new DnsCacheResult(Services[i], HostsIp);

                    // Update Gamespy Redirector Cache
                    Redirector.DnsCacheReport.AddOrUpdate(Result);

                    // Throw bad result
                    if (Result.IsFaulted)
                    {
                        // No such hosts is known?
                        if (Result.Error.InnerException != null)
                            SetStatus(i, "Error Occured", Resources.error, Result.Error.InnerException.Message);
                        else
                            SetStatus(i, "Error Occured", Resources.error, Result.Error.Message);
                    }

                    // Check for cancel before setting a form value
                    if (TaskSource.IsCancellationRequested)
                        return;

                    // Verify correct address 
                    if (Result.GotExpectedResult)
                        SetStatus(i, HostsIp.ToString(), Resources.check);
                    else
                        SetStatus(i, Result.ResultAddresses[0].ToString(), Resources.warning, "Address expected: " + HostsIp.ToString());
                }
                catch
                {
                    // Check for cancel before setting a form value
                    if (TaskSource.IsCancellationRequested)
                        return;
                }
            }

            // Enable refresh btn
            if(IsHandleCreated)
                Invoke((Action)delegate { RefreshBtn.Enabled = true; });
        }
 /// <summary>
 /// Adds or Updates a Dns Cache Result to the list of entries
 /// </summary>
 /// <param name="Result"></param>
 public void AddOrUpdate(DnsCacheResult Result)
 {
     // Add if the entry already exists
     if (Entries.ContainsKey(Result.HostName))
     {
         Entries[Result.HostName] = Result;
     }
     else // Update entry
     {
         Entries.Add(Result.HostName, Result);
     }
 }
        /// <summary>
        /// This method ping's the gamepsy services and verifies that the Redirect
        /// services are working. This method effectivly replaces the <see cref="Redirector.VerifyDNSCache()"/>
        /// method.
        /// </summary>
        protected bool VerifyDnsCache()
        {
            // Set default as success
            bool DiagnosticResult = true;

            // Set the System.Net DNS Cache refresh timeout to 1 millisecond
            ServicePointManager.DnsRefreshTimeout = 1;

            // If using System Hosts, Wait 10 seconds to allow the Windows DNS Client to catch up
            if (SelectedMode == RedirectMode.HostsFile)
            {
                for (int i = 0; i < 10; i++)
                {
                    // Get second count
                    int o = 10 - i;

                    // Make sure form wasn't cancelled
                    if (!IsHandleCreated) return false;

                    // Tell the main form thread to update the second count
                    Invoke((Action)delegate
                    {
                        labelDnsText.Text = "Verifying DNS Cache Settings in " + o + " seconds...";
                    });

                    // Wait one
                    Thread.Sleep(1000);
                }

                // Make sure form wasn't cancelled
                if (!IsHandleCreated) return false;

                // Fix header to display no time
                Invoke((Action)delegate
                {
                    labelDnsText.Text = "Verifying DNS Cache Settings";
                });
            }

            // Clear Old Entries
            Redirector.DnsCacheReport.Entries.Clear();

            // Loop through each service
            for (int i = 0; i < Services.Length; i++)
            {
                // Make sure this service is enabled
                if ((!Bf2webCheckbox.Checked && i == 3) || (!GpcmCheckbox.Checked && i != 3))
                {
                    SetStatus(i, "Skipped", Resources.question_button, "Redirect was not enabled by user");
                    continue;
                }

                // Prepare for next service
                SetStatus(i, "Checking, Please Wait...", Resources.loading);
                Thread.Sleep(300);

                // Ping server to get the IP address in the dns cache
                try
                {
                    IPAddress HostsIp = (i == 3) ? StatsServerAddress : GamespyServerAddress;
                    DnsCacheResult Result = new DnsCacheResult(Services[i], HostsIp);

                    // Update Gamespy Redirector Cache
                    Redirector.DnsCacheReport.AddOrUpdate(Result);

                    // Throw bad result
                    if (Result.IsFaulted)
                    {
                        // No such hosts is known?
                        if (Result.Error.InnerException != null)
                            SetStatus(i, "Error Occured", Resources.error, Result.Error.InnerException.Message);
                        else
                            SetStatus(i, "Error Occured", Resources.error, Result.Error.Message);

                        // Flag error
                        DiagnosticResult = false;
                        continue;
                    }

                    // Verify correct address 
                    if (!Result.GotExpectedResult)
                    {
                        SetStatus(i, Result.ResultAddresses[0].ToString(), Resources.warning, "Address expected: " + HostsIp.ToString());

                        // Flag error
                        DiagnosticResult = false;
                    }
                    else
                        SetStatus(i, HostsIp.ToString(), Resources.check);
                }
                catch (Exception e)
                {
                    // No such hosts is known?
                    if (e.InnerException != null)
                        SetStatus(i, "Error Occured", Resources.error, e.InnerException.Message);
                    else
                        SetStatus(i, "Error Occured", Resources.error, e.Message);

                    // Flag error
                    DiagnosticResult = false;
                }
            }

            return DiagnosticResult;
        }
        /// <summary>
        /// Queries the DNS Cache for the Gamespy hosts, and verifies that the
        /// IP addresses in the DNS Cache match that of the desired redirect IP
        /// </summary>
        public static bool VerifyDNSCache(IProgress<DnsCacheResult> Progress = null)
        {
            // Nothing to do here if redirects are disabled
            if (!RedirectsEnabled) return false;

            // Grab our saved hosts file IP addresses
            if (RedirectMethod != RedirectMode.DnsServer)
            {
                // Grab hosts file base
                HostsFile hFile = (RedirectMethod == RedirectMode.HostsFile)
                    ? HostsFileSys as HostsFile
                    : HostsFileIcs as HostsFile;

                // Fetch our saved IPAddresses
                GamespyServerAddress = (hFile.HasEntry("master.gamespy.com")) ? hFile.Get("master.gamespy.com") : null;
                StatsServerAddress = (hFile.HasEntry(Bf2StatsHost)) ? hFile.Get(Bf2StatsHost) : null;
            }

            // Flush our cache report
            DnsCacheReport.Entries.Clear();

            // Verify Gamespy Server IP addresses
            if (GamespyServerAddress != null)
            {
                foreach (string address in GamespyHosts)
                {
                    // Create new report
                    DnsCacheResult Result = new DnsCacheResult(address, GamespyServerAddress);

                    // Add the result to the report
                    DnsCacheReport.AddOrUpdate(Result);

                    // Report progress if we have a progress object
                    if (Progress != null)
                        Progress.Report(Result);
                }
            }

            // Verify Stats Server address
            if (StatsServerAddress != null)
            {
                // Create new report
                DnsCacheResult Result = new DnsCacheResult(Bf2StatsHost, StatsServerAddress);

                // Add the result to the report
                DnsCacheReport.AddOrUpdate(Result);

                // Report progress if we have a progress object
                if (Progress != null)
                    Progress.Report(Result);
            }

            // Set internal
            DnsCacheReport.LastRefresh = DateTime.Now;
            return DnsCacheReport.ErrorFree;
        }