/// Version 1.0.0 /// Last modified 24.5.2014 /// /// Copyright (C) 2014 Ilkka Rautiainen /// /// Halyri-system is a prototype emergency call system. Its purpose is to /// demonstrate the use of the advanced capabilities available in the current /// generation smartphones in facilitating the emergency service dispatcher's /// capability to determine the nature of the emergency and to dispatch help. /// /// For more information, see the README file of this package. /// /// The MIT License (MIT) /// /// Permission is hereby granted, free of charge, to any person obtaining a copy /// of this software and associated documentation files (the "Software"), to /// deal in the Software without restriction, including without limitation the /// rights to use, copy, modify, merge, publish, distribute, sublicense, /// and/or sell copies of the Software, and to permit persons to whom the /// Software is furnished to do so, subject to the following conditions: /// /// The above copyright notice and this permission notice shall be included in /// all copies or substantial portions of the Software. /// /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING /// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS /// IN THE SOFTWARE. /// using System; using System.Windows.Threading; using System.ServiceModel; using System.Diagnostics; using System.Windows; namespace Hake_WPF.Network { /// Ilkka Rautiainen /// /// The class is used for sending keep-alive messages to the server. /// class Pinger { private int keepaliveIntervalSeconds; private Connection connection; private DispatcherTimer dispatcherTimer; /// /// The function creates the pinger. /// /// The interval of keep-alive messages in seconds. /// The connection. public Pinger(int interval, Connection connection) { this.keepaliveIntervalSeconds = interval; this.connection = connection; } /// /// The function starts the pinger by creating a new timer and an event handler. /// The keep-alive message interval is entered here. /// public void StartPinger() { dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Tick += new EventHandler(SendKeepalive); dispatcherTimer.Interval = new TimeSpan(0, 0, keepaliveIntervalSeconds); dispatcherTimer.Start(); } /// /// The function stops the pinger by removing the event handler. /// private void StopPinger() { dispatcherTimer.Tick -= SendKeepalive; } /// /// The function sends the keep-alive message on regular intervals. /// If the connection is lost, stops the pinger and shows /// a message box to the user. /// private async void SendKeepalive(object sender, EventArgs e) { try { await connection.PingAsync(keepaliveIntervalSeconds); } catch (CommunicationException ex) { StopPinger(); MessageBox.Show("Connection to server lost"); Debug.WriteLine(ex.ToString()); } } } }