#region Disclaimer / License // Copyright (C) 2010, Kenneth Skovhede // http://www.hexad.dk, opensource@hexad.dk // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // #endregion using System; using System.Collections.Generic; using System.Text; namespace Duplicati.GUI { /// /// This class keeps track of the users modifications regarding /// throttling and pause/resume /// public class LiveControls { /// /// An event that is activated when the pause state changes /// public event EventHandler StateChanged; /// /// An event that is activated when the thread priority changes /// public event EventHandler ThreadPriorityChanged; /// /// An event that is activated when the throttle speed changes /// public event EventHandler ThrottleSpeedChanged; /// /// The possible states for the live control /// public enum LiveControlState { /// /// Indicates that the backups are running /// Running, /// /// Indicates that the backups are currently suspended /// Paused } /// /// The current control state /// private LiveControlState m_state; /// /// Gets the current state for the control /// public LiveControlState State { get { return m_state; } } /// /// The internal variable that tracks the the priority /// private System.Threading.ThreadPriority? m_priority; /// /// The internal variable that tracks the upload limit /// private long? m_uploadLimit; /// /// The internal variable that tracks the download limit /// private long? m_downloadLimit; /// /// Gets the current overridden thread priority /// public System.Threading.ThreadPriority? ThreadPriority { get { return m_priority; } set { if (m_priority != value) { m_priority = value; if (ThreadPriorityChanged != null) ThreadPriorityChanged(this, null); } } } /// /// Gets the current upload limit in bps /// public long? UploadLimit { get { return m_uploadLimit; } set { if (m_uploadLimit != value) { m_uploadLimit = value; if (ThrottleSpeedChanged != null) ThrottleSpeedChanged(this, null); } } } /// /// Gets the download limit in bps /// public long? DownloadLimit { get { return m_downloadLimit; } set { if (m_downloadLimit != value) { m_downloadLimit = value; if (ThrottleSpeedChanged != null) ThrottleSpeedChanged(this, null); } } } /// /// The timer that is activated after a pause period. /// We use a Windows.Forms timer to ensure that the event is raised /// in the correct thread (the UI thread). /// private System.Windows.Forms.Timer m_waitTimer; /// /// Constructs a new instance of the LiveControl /// /// The duration that the backups should be initially suspended public LiveControls(Datamodel.ApplicationSettings settings) { m_state = LiveControlState.Running; m_waitTimer = new System.Windows.Forms.Timer(); m_waitTimer.Tick += new EventHandler(m_waitTimer_Tick); if (!string.IsNullOrEmpty(settings.StartupDelayDuration) && settings.StartupDelayDuration != "0") { m_waitTimer.Interval = (int)Duplicati.Library.Core.Timeparser.ParseTimeSpan(settings.StartupDelayDuration).TotalMilliseconds; m_waitTimer.Enabled = true; m_state = LiveControlState.Paused; } m_priority = settings.ThreadPriorityOverride; if (!string.IsNullOrEmpty(settings.DownloadSpeedLimit)) m_downloadLimit = Library.Core.Sizeparser.ParseSize(settings.DownloadSpeedLimit, "kb"); if (!string.IsNullOrEmpty(settings.UploadSpeedLimit)) m_uploadLimit = Library.Core.Sizeparser.ParseSize(settings.UploadSpeedLimit, "kb"); } /// /// Event that occurs when the timeout duration is exceeded /// /// The sender of the event /// An unused event argument private void m_waitTimer_Tick(object sender, EventArgs e) { Resume(); } /// /// Internal helper to reset the timeout timer /// /// The time to wait private void ResetTimer(string timeout) { m_waitTimer.Enabled = false; if (!string.IsNullOrEmpty(timeout)) { m_waitTimer.Interval = ((int)Duplicati.Library.Core.Timeparser.ParseTimeSpan(timeout).TotalMilliseconds); m_waitTimer.Enabled = true; } } /// /// Pauses the backups until resumed /// public void Pause() { if (m_state == LiveControlState.Running) { m_state = LiveControlState.Paused; if (StateChanged != null) StateChanged(this, null); } } /// /// Resumes a backups to the running state /// public void Resume() { if (m_state == LiveControlState.Paused) { //Make sure that the timer is cleared m_waitTimer.Enabled = false; m_state = LiveControlState.Running; if (StateChanged != null) StateChanged(this, null); } } /// /// Suspends the backups for a given period /// /// The duration to wait public void Pause(string timeout) { if (m_state == LiveControlState.Running) { Pause(); m_waitTimer.Enabled = false; m_waitTimer.Interval = ((int)Duplicati.Library.Core.Timeparser.ParseTimeSpan(timeout).TotalMilliseconds); m_waitTimer.Enabled = true; } } } }