#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;
}
}
}
}