/// <summary>
        /// Führt eine Anfrage aus.
        /// </summary>
        /// <typeparam name="TResult">Die Art des erwarteten Ergebnisses.</typeparam>
        /// <param name="uri">Die aufzurufende Adresse.</param>
        /// <param name="method">Die Methode zum Aufruf.</param>
        /// <returns>Das Ergebnis des Aufrufs.</returns>
        private static TResult CallServer <TResult>(string uri, string method = "GET")
        {
            // Be safe
            try
            {
                // Create request
                var request = WebRequest.Create(uri);

                // Configure
                request.UseDefaultCredentials = true;
                request.ContentLength         = 0;
                request.Timeout = 10000;
                request.Method  = method;

                // Load the response
                var response = request.GetResponse();
                try
                {
                    // Process
                    using (var status = response.GetResponseStream())
                        using (var reader = new StreamReader(status))
                            return((TResult)s_Deserializer.Deserialize(reader, typeof(TResult)));
                }
                finally
                {
                    // Done
                    response.Close();
                }
            }
            catch (Exception e)
            {
                // See if this is a timeout
                var webException = e as WebException;
                if (webException != null)
                {
                    if (webException.Status == WebExceptionStatus.Timeout)
                    {
                        VCRNETControl.Log("Timeout calling {1} ({0})", method, uri);
                    }
                }

                // Forward
                throw;
            }
        }
        /// <summary>
        /// Wird periodisch aufgerufen und frage den aktuellen Zustand des Dienstes auf einem Rechner ab.
        /// </summary>
        /// <param name="state">Wird ignoriert.</param>
        public void CheckServer(object state)
        {
            // Create a processing clone
            var settings   = new VCRNETRestProxy.ServiceInformation();
            var serverInfo = View.ServerInfo;

            // Safe process
            try
            {
                // Report
                VCRNETControl.Log("Checking {0}:{1}", ServerName, ServerPort);

                // Try to resolve MAC
                View.Settings.DetectMAC();

                // Read the server settings
                settings = VCRNETRestProxy.GetInformation(EndPoint);

                // Load version once
                if (string.IsNullOrEmpty(serverInfo.Version))
                {
                    serverInfo.Version = settings.version;
                }

                // Check mode
                bool hasNext = false, near = false;

                // Find all activities
                var activities = VCRNETRestProxy.GetActivities(EndPoint);

                // All profiles
                foreach (var profile in settings.profileNames)
                {
                    // Report
                    VCRNETControl.Log("Processing Profile {2} for {0}:{1}", ServerName, ServerPort, profile);

                    // Attach to the profile
                    var info = serverInfo[profile];
                    var profileActivities = activities.Where(activity => StringComparer.InvariantCultureIgnoreCase.Equals(activity.device, profile)).ToArray();
                    var profileCurrent    = profileActivities.Where(activity => activity.IsActive).ToArray();

                    // Check for a current recording
                    if (profileCurrent.Length > 0)
                    {
                        // Remember
                        info.CurrentRecordings = profileCurrent;

                        // Done
                        continue;
                    }

                    // Find the next recording
                    var next = profileActivities.FirstOrDefault();
                    if (next == null)
                    {
                        continue;
                    }
                    if (!next.start.HasValue)
                    {
                        continue;
                    }
                    if (next.start.Value == DateTime.MinValue)
                    {
                        continue;
                    }

                    // At least there are recordings
                    hasNext = true;

                    // Check delta
                    var delta = next.start.Value - DateTime.UtcNow;
                    if (delta.TotalMinutes < Math.Max(5, settings.sleepMinimum))
                    {
                        near = true;
                    }
                }

                // Check mode
                if (serverInfo.State == TrayColors.Red)
                {
                    if (near)
                    {
                        serverInfo.State = TrayColors.Yellow;
                    }
                    else if (hasNext)
                    {
                        serverInfo.State = TrayColors.Green;
                    }
                    else
                    {
                        serverInfo.State = TrayColors.Standard;
                    }
                }
            }
            catch
            {
            }

            // Update
            View.ServerInfo = serverInfo;

            // Report
            if (!m_Context.ProcessStateAndCheckHibernation(this, serverInfo.State, settings.hibernationPending, View.Settings.IsLocal && settings.extensionsRunning))
            {
                return;
            }

            // Safe tell the server that we take over hibernation control.
            try
            {
                // Process
                VCRNETRestProxy.ResetPendingHibernation(EndPoint);
            }
            catch
            {
            }
        }