Stabilized everything, it is now thread safe.
git-svn-id: https://duplicati.googlecode.com/svn/trunk@3 59da171f-624f-0410-aa54-27559c288bec
This commit is contained in:
@@ -64,41 +64,44 @@ namespace Duplicati
|
||||
env["PATH"] = System.Environment.ExpandEnvironmentVariables(Program.ApplicationSettings.PGPPath) + System.IO.Path.PathSeparator + env["PATH"];
|
||||
|
||||
args.Add("\"" + System.Environment.ExpandEnvironmentVariables(Program.ApplicationSettings.DuplicityPath) + "\"");
|
||||
|
||||
|
||||
args.Add("incremental");
|
||||
args.Add("\"" + System.Environment.ExpandEnvironmentVariables(task.SourcePath) + "\"");
|
||||
args.Add("\"" + System.Environment.ExpandEnvironmentVariables(task.GetDestinationPath()) + "\"");
|
||||
|
||||
if (!string.IsNullOrEmpty(schedule.FullAfter))
|
||||
{
|
||||
args.Add("--full-if-older-than");
|
||||
args.Add(schedule.FullAfter);
|
||||
}
|
||||
|
||||
|
||||
if (string.IsNullOrEmpty(task.Encryptionkey))
|
||||
args.Add("--no-encryption");
|
||||
else
|
||||
env["PASSPHRASE"] = task.Encryptionkey;
|
||||
|
||||
if (!string.IsNullOrEmpty(task.Signaturekey))
|
||||
{
|
||||
args.Add("--sign-key");
|
||||
args.Add(task.Signaturekey);
|
||||
}
|
||||
|
||||
task.GetExtraSettings(args, env);
|
||||
|
||||
|
||||
psi.CreateNoWindow = true;
|
||||
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
|
||||
psi.FileName = System.Environment.ExpandEnvironmentVariables(Program.ApplicationSettings.PythonPath);
|
||||
psi.RedirectStandardError = true;
|
||||
psi.RedirectStandardOutput = true;
|
||||
psi.RedirectStandardInput = false;
|
||||
psi.UseShellExecute = false;
|
||||
lock (Program.MainLock)
|
||||
psi.WorkingDirectory = System.IO.Path.GetDirectoryName(psi.FileName);
|
||||
}
|
||||
|
||||
args.Add("incremental");
|
||||
args.Add("\"" + System.Environment.ExpandEnvironmentVariables(task.SourcePath) + "\"");
|
||||
args.Add("\"" + System.Environment.ExpandEnvironmentVariables(task.GetDestinationPath()) + "\"");
|
||||
|
||||
if (!string.IsNullOrEmpty(schedule.FullAfter))
|
||||
{
|
||||
args.Add("--full-if-older-than");
|
||||
args.Add(schedule.FullAfter);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(task.Encryptionkey))
|
||||
args.Add("--no-encryption");
|
||||
else
|
||||
env["PASSPHRASE"] = task.Encryptionkey;
|
||||
|
||||
if (!string.IsNullOrEmpty(task.Signaturekey))
|
||||
{
|
||||
args.Add("--sign-key");
|
||||
args.Add(task.Signaturekey);
|
||||
}
|
||||
|
||||
task.GetExtraSettings(args, env);
|
||||
|
||||
psi.CreateNoWindow = true;
|
||||
psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
|
||||
psi.FileName = System.Environment.ExpandEnvironmentVariables(Program.ApplicationSettings.PythonPath);
|
||||
psi.RedirectStandardError = true;
|
||||
psi.RedirectStandardOutput = true;
|
||||
psi.RedirectStandardInput = false;
|
||||
psi.UseShellExecute = false;
|
||||
lock(Program.MainLock)
|
||||
psi.WorkingDirectory = System.IO.Path.GetDirectoryName(psi.FileName);
|
||||
|
||||
psi.Arguments = string.Join(" ", args.ToArray());
|
||||
|
||||
System.Diagnostics.Process p = new System.Diagnostics.Process();
|
||||
@@ -107,10 +110,11 @@ namespace Duplicati
|
||||
|
||||
p.WaitForExit();
|
||||
|
||||
|
||||
string errorstream = p.StandardError.ReadToEnd();
|
||||
string outstream = p.StandardOutput.ReadToEnd();
|
||||
|
||||
string logentry = "******* Regular run *******\r\n";
|
||||
string logentry = "";
|
||||
if (!string.IsNullOrEmpty(errorstream))
|
||||
{
|
||||
string tmp = errorstream.Replace("gpg: CAST5 encrypted data", "").Replace("gpg: encrypted with 1 passphrase", "").Trim();
|
||||
@@ -120,6 +124,22 @@ namespace Duplicati
|
||||
}
|
||||
logentry += outstream;
|
||||
|
||||
lock (Program.MainLock)
|
||||
{
|
||||
LogBlob lb = task.DataParent.Add<LogBlob>();
|
||||
lb.StringData = logentry;
|
||||
|
||||
Log l = task.DataParent.Add<Log>();
|
||||
l.LogBlob = lb;
|
||||
task.Logs.Add(l);
|
||||
|
||||
//Keep some of the data in an easy to read manner
|
||||
DuplicityOutputParser.ParseData(l);
|
||||
l.SubAction = "Primary";
|
||||
l.Action = "Backup";
|
||||
}
|
||||
|
||||
|
||||
if (schedule.KeepFull > 0)
|
||||
{
|
||||
p = new System.Diagnostics.Process();
|
||||
@@ -137,10 +157,25 @@ namespace Duplicati
|
||||
errorstream = p.StandardError.ReadToEnd();
|
||||
outstream = p.StandardOutput.ReadToEnd();
|
||||
|
||||
logentry += "\r\n******* Clean up run (count) *******\r\n";
|
||||
logentry = "";
|
||||
if (!string.IsNullOrEmpty(errorstream))
|
||||
logentry += "** Error stream: \r\n" + errorstream + "\r\n**\r\n";
|
||||
logentry += outstream;
|
||||
|
||||
lock (Program.MainLock)
|
||||
{
|
||||
LogBlob lb = task.DataParent.Add<LogBlob>();
|
||||
lb.StringData = logentry;
|
||||
|
||||
Log l = task.DataParent.Add<Log>();
|
||||
l.LogBlob = lb;
|
||||
task.Logs.Add(l);
|
||||
|
||||
//Keep some of the data in an easy to read manner
|
||||
DuplicityOutputParser.ParseData(l);
|
||||
l.SubAction = "Cleanup";
|
||||
l.Action = "Backup";
|
||||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(schedule.KeepTime))
|
||||
@@ -161,25 +196,33 @@ namespace Duplicati
|
||||
errorstream = p.StandardError.ReadToEnd();
|
||||
outstream = p.StandardOutput.ReadToEnd();
|
||||
|
||||
logentry += "\r\n******* Clean up run (time) *******\r\n";
|
||||
logentry = "";
|
||||
if (!string.IsNullOrEmpty(errorstream))
|
||||
logentry += "\r\n** Error stream: \r\n" + errorstream + "\r\n**\r\n";
|
||||
logentry += outstream;
|
||||
|
||||
lock (Program.MainLock)
|
||||
{
|
||||
LogBlob lb = task.DataParent.Add<LogBlob>();
|
||||
lb.StringData = logentry;
|
||||
|
||||
Log l = task.DataParent.Add<Log>();
|
||||
l.LogBlob = lb;
|
||||
task.Logs.Add(l);
|
||||
|
||||
//Keep some of the data in an easy to read manner
|
||||
DuplicityOutputParser.ParseData(l);
|
||||
l.SubAction = "Cleanup";
|
||||
l.Action = "Backup";
|
||||
}
|
||||
}
|
||||
|
||||
LogBlob lb = task.DataParent.Add<LogBlob>();
|
||||
lb.StringData = logentry;
|
||||
|
||||
Log l = task.DataParent.Add<Log>();
|
||||
l.LogBlob = lb;
|
||||
task.Logs.Add(l);
|
||||
|
||||
//Keep some of the data in an easy to read manner
|
||||
DuplicityOutputParser.ParseData(l);
|
||||
|
||||
//TODO: Fix this once commit recursive is implemented
|
||||
task.DataParent.CommitAll();
|
||||
Program.DataConnection.CommitAll();
|
||||
lock (Program.MainLock)
|
||||
{
|
||||
//TODO: Fix this once commit recursive is implemented
|
||||
task.DataParent.CommitAll();
|
||||
Program.DataConnection.CommitAll();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ namespace Duplicati
|
||||
|
||||
//This also opens the db for us :)
|
||||
DatabaseUpgrader.UpgradeDatebase(con, dbpath);
|
||||
DataConnection = new DataFetcherCached(new SQLiteDataProvider(con));
|
||||
DataConnection = new DataFetcherThreadSafe(MainLock, new DataFetcherCached(new SQLiteDataProvider(con)));
|
||||
|
||||
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
|
||||
|
||||
@@ -123,7 +123,7 @@ namespace Duplicati
|
||||
|
||||
WorkThread = new WorkerThread<Duplicati.Datamodel.Schedule>(new WorkerThread<Duplicati.Datamodel.Schedule>.ProcessItemDelegate(runner.Execute));
|
||||
|
||||
Scheduler = new Scheduler(DataConnection, WorkThread);
|
||||
Scheduler = new Scheduler(DataConnection, WorkThread, MainLock);
|
||||
|
||||
WorkThread.CompletedWork += new EventHandler(WorkThread_CompletedWork);
|
||||
WorkThread.StartingWork += new EventHandler(WorkThread_StartingWork);
|
||||
|
||||
@@ -34,13 +34,15 @@ namespace Duplicati
|
||||
private WorkerThread<Schedule> m_worker;
|
||||
private AutoResetEvent m_event;
|
||||
private object m_lock = new object();
|
||||
private object m_datalock;
|
||||
|
||||
public event EventHandler NewSchedule;
|
||||
|
||||
private Schedule[] m_schedule;
|
||||
|
||||
public Scheduler(IDataFetcherCached connection, WorkerThread<Schedule> worker)
|
||||
public Scheduler(IDataFetcherCached connection, WorkerThread<Schedule> worker, object datalock)
|
||||
{
|
||||
m_datalock = datalock;
|
||||
m_connection = connection;
|
||||
m_thread = new Thread(new ThreadStart(Runner));
|
||||
m_worker = worker;
|
||||
@@ -82,8 +84,11 @@ namespace Duplicati
|
||||
while (!m_terminate)
|
||||
{
|
||||
List<Schedule> reps = new List<Schedule>();
|
||||
List<Schedule> tmp;
|
||||
lock (m_datalock)
|
||||
tmp = new List<Schedule>(m_connection.GetObjects<Schedule>());
|
||||
|
||||
foreach (Schedule sc in m_connection.GetObjects<Schedule>())
|
||||
foreach (Schedule sc in tmp)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(sc.Repeat))
|
||||
{
|
||||
|
||||
+129
-126
@@ -48,22 +48,22 @@ namespace Duplicati.Service_controls
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.EncryptionCheckbox = new System.Windows.Forms.CheckBox();
|
||||
this.EncrytionKey = new System.Windows.Forms.TextBox();
|
||||
this.SignatureKey = new System.Windows.Forms.TextBox();
|
||||
this.SignatureCheckbox = new System.Windows.Forms.CheckBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.ServiceTypeCombo = new System.Windows.Forms.ComboBox();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.GenerateEncryptionKey = new System.Windows.Forms.Button();
|
||||
this.GenerateSignatureKey = new System.Windows.Forms.Button();
|
||||
this.BrowseSourceFolder = new System.Windows.Forms.Button();
|
||||
this.SourceFolder = new System.Windows.Forms.TextBox();
|
||||
this.EditFilterButton = new System.Windows.Forms.Button();
|
||||
this.ServicePanel = new System.Windows.Forms.Panel();
|
||||
this.sshSettings = new Duplicati.Service_controls.SSHSettings();
|
||||
this.s3Settings = new Duplicati.Service_controls.S3Settings();
|
||||
this.fileSettings = new Duplicati.Service_controls.FileSettings();
|
||||
this.ServicePanel = new System.Windows.Forms.Panel();
|
||||
this.EditFilterButton = new System.Windows.Forms.Button();
|
||||
this.BrowseSourceFolder = new System.Windows.Forms.Button();
|
||||
this.SourceFolder = new System.Windows.Forms.TextBox();
|
||||
this.GenerateSignatureKey = new System.Windows.Forms.Button();
|
||||
this.GenerateEncryptionKey = new System.Windows.Forms.Button();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.ServiceTypeCombo = new System.Windows.Forms.ComboBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.SignatureKey = new System.Windows.Forms.TextBox();
|
||||
this.SignatureCheckbox = new System.Windows.Forms.CheckBox();
|
||||
this.EncrytionKey = new System.Windows.Forms.TextBox();
|
||||
this.EncryptionCheckbox = new System.Windows.Forms.CheckBox();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.ServicePanel.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
@@ -90,94 +90,52 @@ namespace Duplicati.Service_controls
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Backup properties";
|
||||
//
|
||||
// EncryptionCheckbox
|
||||
// ServicePanel
|
||||
//
|
||||
this.EncryptionCheckbox.AutoSize = true;
|
||||
this.EncryptionCheckbox.Location = new System.Drawing.Point(8, 16);
|
||||
this.EncryptionCheckbox.Name = "EncryptionCheckbox";
|
||||
this.EncryptionCheckbox.Size = new System.Drawing.Size(101, 17);
|
||||
this.EncryptionCheckbox.TabIndex = 0;
|
||||
this.EncryptionCheckbox.Text = "Encrypt backup";
|
||||
this.EncryptionCheckbox.UseVisualStyleBackColor = true;
|
||||
this.ServicePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ServicePanel.Controls.Add(this.sshSettings);
|
||||
this.ServicePanel.Controls.Add(this.s3Settings);
|
||||
this.ServicePanel.Controls.Add(this.fileSettings);
|
||||
this.ServicePanel.Location = new System.Drawing.Point(0, 144);
|
||||
this.ServicePanel.Name = "ServicePanel";
|
||||
this.ServicePanel.Size = new System.Drawing.Size(280, 272);
|
||||
this.ServicePanel.TabIndex = 15;
|
||||
//
|
||||
// EncrytionKey
|
||||
// sshSettings
|
||||
//
|
||||
this.EncrytionKey.Location = new System.Drawing.Point(112, 16);
|
||||
this.EncrytionKey.Name = "EncrytionKey";
|
||||
this.EncrytionKey.Size = new System.Drawing.Size(128, 20);
|
||||
this.EncrytionKey.TabIndex = 1;
|
||||
this.EncrytionKey.TextChanged += new System.EventHandler(this.EncrytionKey_TextChanged);
|
||||
this.sshSettings.Location = new System.Drawing.Point(96, 32);
|
||||
this.sshSettings.Name = "sshSettings";
|
||||
this.sshSettings.Size = new System.Drawing.Size(88, 56);
|
||||
this.sshSettings.TabIndex = 14;
|
||||
this.sshSettings.Visible = false;
|
||||
//
|
||||
// SignatureKey
|
||||
// s3Settings
|
||||
//
|
||||
this.SignatureKey.Location = new System.Drawing.Point(112, 40);
|
||||
this.SignatureKey.Name = "SignatureKey";
|
||||
this.SignatureKey.Size = new System.Drawing.Size(128, 20);
|
||||
this.SignatureKey.TabIndex = 3;
|
||||
this.SignatureKey.TextChanged += new System.EventHandler(this.SignatureKey_TextChanged);
|
||||
this.s3Settings.Location = new System.Drawing.Point(176, 32);
|
||||
this.s3Settings.Name = "s3Settings";
|
||||
this.s3Settings.Size = new System.Drawing.Size(96, 56);
|
||||
this.s3Settings.TabIndex = 13;
|
||||
this.s3Settings.Visible = false;
|
||||
//
|
||||
// SignatureCheckbox
|
||||
// fileSettings
|
||||
//
|
||||
this.SignatureCheckbox.AutoSize = true;
|
||||
this.SignatureCheckbox.Location = new System.Drawing.Point(8, 40);
|
||||
this.SignatureCheckbox.Name = "SignatureCheckbox";
|
||||
this.SignatureCheckbox.Size = new System.Drawing.Size(86, 17);
|
||||
this.SignatureCheckbox.TabIndex = 2;
|
||||
this.SignatureCheckbox.Text = "Sign backup";
|
||||
this.SignatureCheckbox.UseVisualStyleBackColor = true;
|
||||
this.fileSettings.Location = new System.Drawing.Point(16, 32);
|
||||
this.fileSettings.Name = "fileSettings";
|
||||
this.fileSettings.Size = new System.Drawing.Size(88, 64);
|
||||
this.fileSettings.TabIndex = 12;
|
||||
this.fileSettings.Visible = false;
|
||||
//
|
||||
// label1
|
||||
// EditFilterButton
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(8, 120);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(81, 13);
|
||||
this.label1.TabIndex = 4;
|
||||
this.label1.Text = "Backup service";
|
||||
//
|
||||
// ServiceTypeCombo
|
||||
//
|
||||
this.ServiceTypeCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.ServiceTypeCombo.FormattingEnabled = true;
|
||||
this.ServiceTypeCombo.Items.AddRange(new object[] {
|
||||
"Backup to network folder or drive",
|
||||
"Backup via SSH ",
|
||||
"Backup via FTP",
|
||||
"Backup to Amazon S3",
|
||||
"Backup to WebDAV",
|
||||
"Custom "});
|
||||
this.ServiceTypeCombo.Location = new System.Drawing.Point(112, 120);
|
||||
this.ServiceTypeCombo.Name = "ServiceTypeCombo";
|
||||
this.ServiceTypeCombo.Size = new System.Drawing.Size(160, 21);
|
||||
this.ServiceTypeCombo.TabIndex = 5;
|
||||
this.ServiceTypeCombo.SelectedIndexChanged += new System.EventHandler(this.ServiceTypeCombo_SelectedIndexChanged);
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(8, 64);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(87, 13);
|
||||
this.label2.TabIndex = 6;
|
||||
this.label2.Text = "Folder to backup";
|
||||
//
|
||||
// GenerateEncryptionKey
|
||||
//
|
||||
this.GenerateEncryptionKey.Location = new System.Drawing.Point(240, 16);
|
||||
this.GenerateEncryptionKey.Name = "GenerateEncryptionKey";
|
||||
this.GenerateEncryptionKey.Size = new System.Drawing.Size(24, 20);
|
||||
this.GenerateEncryptionKey.TabIndex = 7;
|
||||
this.GenerateEncryptionKey.UseVisualStyleBackColor = true;
|
||||
this.GenerateEncryptionKey.Click += new System.EventHandler(this.GenerateEncryptionKey_Click);
|
||||
//
|
||||
// GenerateSignatureKey
|
||||
//
|
||||
this.GenerateSignatureKey.Location = new System.Drawing.Point(240, 40);
|
||||
this.GenerateSignatureKey.Name = "GenerateSignatureKey";
|
||||
this.GenerateSignatureKey.Size = new System.Drawing.Size(24, 20);
|
||||
this.GenerateSignatureKey.TabIndex = 8;
|
||||
this.GenerateSignatureKey.UseVisualStyleBackColor = true;
|
||||
this.GenerateSignatureKey.Click += new System.EventHandler(this.GenerateSignatureKey_Click);
|
||||
this.EditFilterButton.Location = new System.Drawing.Point(168, 88);
|
||||
this.EditFilterButton.Name = "EditFilterButton";
|
||||
this.EditFilterButton.Size = new System.Drawing.Size(96, 24);
|
||||
this.EditFilterButton.TabIndex = 11;
|
||||
this.EditFilterButton.Text = "Edit filter";
|
||||
this.EditFilterButton.UseVisualStyleBackColor = true;
|
||||
this.EditFilterButton.Click += new System.EventHandler(this.EditFilterButton_Click);
|
||||
//
|
||||
// BrowseSourceFolder
|
||||
//
|
||||
@@ -197,49 +155,94 @@ namespace Duplicati.Service_controls
|
||||
this.SourceFolder.TabIndex = 9;
|
||||
this.SourceFolder.TextChanged += new System.EventHandler(this.SourceFolder_TextChanged);
|
||||
//
|
||||
// EditFilterButton
|
||||
// GenerateSignatureKey
|
||||
//
|
||||
this.EditFilterButton.Location = new System.Drawing.Point(168, 88);
|
||||
this.EditFilterButton.Name = "EditFilterButton";
|
||||
this.EditFilterButton.Size = new System.Drawing.Size(96, 24);
|
||||
this.EditFilterButton.TabIndex = 11;
|
||||
this.EditFilterButton.Text = "Edit filter";
|
||||
this.EditFilterButton.UseVisualStyleBackColor = true;
|
||||
this.EditFilterButton.Click += new System.EventHandler(this.EditFilterButton_Click);
|
||||
this.GenerateSignatureKey.Location = new System.Drawing.Point(240, 40);
|
||||
this.GenerateSignatureKey.Name = "GenerateSignatureKey";
|
||||
this.GenerateSignatureKey.Size = new System.Drawing.Size(24, 20);
|
||||
this.GenerateSignatureKey.TabIndex = 8;
|
||||
this.GenerateSignatureKey.UseVisualStyleBackColor = true;
|
||||
this.GenerateSignatureKey.Click += new System.EventHandler(this.GenerateSignatureKey_Click);
|
||||
//
|
||||
// sshSettings
|
||||
// GenerateEncryptionKey
|
||||
//
|
||||
this.sshSettings.Location = new System.Drawing.Point(96, 32);
|
||||
this.sshSettings.Name = "sshSettings";
|
||||
this.sshSettings.Size = new System.Drawing.Size(88, 56);
|
||||
this.sshSettings.TabIndex = 14;
|
||||
this.GenerateEncryptionKey.Location = new System.Drawing.Point(240, 16);
|
||||
this.GenerateEncryptionKey.Name = "GenerateEncryptionKey";
|
||||
this.GenerateEncryptionKey.Size = new System.Drawing.Size(24, 20);
|
||||
this.GenerateEncryptionKey.TabIndex = 7;
|
||||
this.GenerateEncryptionKey.UseVisualStyleBackColor = true;
|
||||
this.GenerateEncryptionKey.Click += new System.EventHandler(this.GenerateEncryptionKey_Click);
|
||||
//
|
||||
// s3Settings
|
||||
// label2
|
||||
//
|
||||
this.s3Settings.Location = new System.Drawing.Point(176, 32);
|
||||
this.s3Settings.Name = "s3Settings";
|
||||
this.s3Settings.Size = new System.Drawing.Size(96, 56);
|
||||
this.s3Settings.TabIndex = 13;
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(8, 64);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(87, 13);
|
||||
this.label2.TabIndex = 6;
|
||||
this.label2.Text = "Folder to backup";
|
||||
//
|
||||
// fileSettings
|
||||
// ServiceTypeCombo
|
||||
//
|
||||
this.fileSettings.Location = new System.Drawing.Point(16, 32);
|
||||
this.fileSettings.Name = "fileSettings";
|
||||
this.fileSettings.Size = new System.Drawing.Size(88, 64);
|
||||
this.fileSettings.TabIndex = 12;
|
||||
this.ServiceTypeCombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.ServiceTypeCombo.FormattingEnabled = true;
|
||||
this.ServiceTypeCombo.Items.AddRange(new object[] {
|
||||
"Backup to network folder or drive",
|
||||
"Backup via SSH ",
|
||||
"Backup via FTP",
|
||||
"Backup to Amazon S3",
|
||||
"Backup to WebDAV",
|
||||
"Custom "});
|
||||
this.ServiceTypeCombo.Location = new System.Drawing.Point(112, 120);
|
||||
this.ServiceTypeCombo.Name = "ServiceTypeCombo";
|
||||
this.ServiceTypeCombo.Size = new System.Drawing.Size(160, 21);
|
||||
this.ServiceTypeCombo.TabIndex = 5;
|
||||
this.ServiceTypeCombo.SelectedIndexChanged += new System.EventHandler(this.ServiceTypeCombo_SelectedIndexChanged);
|
||||
//
|
||||
// ServicePanel
|
||||
// label1
|
||||
//
|
||||
this.ServicePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ServicePanel.Controls.Add(this.sshSettings);
|
||||
this.ServicePanel.Controls.Add(this.s3Settings);
|
||||
this.ServicePanel.Controls.Add(this.fileSettings);
|
||||
this.ServicePanel.Location = new System.Drawing.Point(0, 144);
|
||||
this.ServicePanel.Name = "ServicePanel";
|
||||
this.ServicePanel.Size = new System.Drawing.Size(280, 272);
|
||||
this.ServicePanel.TabIndex = 15;
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(8, 120);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(81, 13);
|
||||
this.label1.TabIndex = 4;
|
||||
this.label1.Text = "Backup service";
|
||||
//
|
||||
// SignatureKey
|
||||
//
|
||||
this.SignatureKey.Location = new System.Drawing.Point(112, 40);
|
||||
this.SignatureKey.Name = "SignatureKey";
|
||||
this.SignatureKey.Size = new System.Drawing.Size(128, 20);
|
||||
this.SignatureKey.TabIndex = 3;
|
||||
this.SignatureKey.TextChanged += new System.EventHandler(this.SignatureKey_TextChanged);
|
||||
//
|
||||
// SignatureCheckbox
|
||||
//
|
||||
this.SignatureCheckbox.AutoSize = true;
|
||||
this.SignatureCheckbox.Location = new System.Drawing.Point(8, 40);
|
||||
this.SignatureCheckbox.Name = "SignatureCheckbox";
|
||||
this.SignatureCheckbox.Size = new System.Drawing.Size(86, 17);
|
||||
this.SignatureCheckbox.TabIndex = 2;
|
||||
this.SignatureCheckbox.Text = "Sign backup";
|
||||
this.SignatureCheckbox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// EncrytionKey
|
||||
//
|
||||
this.EncrytionKey.Location = new System.Drawing.Point(112, 16);
|
||||
this.EncrytionKey.Name = "EncrytionKey";
|
||||
this.EncrytionKey.Size = new System.Drawing.Size(128, 20);
|
||||
this.EncrytionKey.TabIndex = 1;
|
||||
this.EncrytionKey.TextChanged += new System.EventHandler(this.EncrytionKey_TextChanged);
|
||||
//
|
||||
// EncryptionCheckbox
|
||||
//
|
||||
this.EncryptionCheckbox.AutoSize = true;
|
||||
this.EncryptionCheckbox.Location = new System.Drawing.Point(8, 16);
|
||||
this.EncryptionCheckbox.Name = "EncryptionCheckbox";
|
||||
this.EncryptionCheckbox.Size = new System.Drawing.Size(101, 17);
|
||||
this.EncryptionCheckbox.TabIndex = 0;
|
||||
this.EncryptionCheckbox.Text = "Encrypt backup";
|
||||
this.EncryptionCheckbox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// TaskSettingsBase
|
||||
//
|
||||
|
||||
Generated
+32
-27
@@ -52,10 +52,11 @@ namespace Duplicati
|
||||
this.panel1 = new System.Windows.Forms.Panel();
|
||||
this.CancelBtn = new System.Windows.Forms.Button();
|
||||
this.OKBtn = new System.Windows.Forms.Button();
|
||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||
this.MainTree = new System.Windows.Forms.TreeView();
|
||||
this.TreeMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||
this.playToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.imageList = new System.Windows.Forms.ImageList(this.components);
|
||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||
this.MainTree = new System.Windows.Forms.TreeView();
|
||||
this.SetupMenuStrip = new System.Windows.Forms.ToolStrip();
|
||||
this.AddButton = new System.Windows.Forms.ToolStripDropDownButton();
|
||||
this.AddFolderMenu = new System.Windows.Forms.ToolStripMenuItem();
|
||||
@@ -64,14 +65,13 @@ namespace Duplicati
|
||||
this.PropertyTabs = new System.Windows.Forms.TabControl();
|
||||
this.OccurencePage = new System.Windows.Forms.TabPage();
|
||||
this.FilePage = new System.Windows.Forms.TabPage();
|
||||
this.imageList = new System.Windows.Forms.ImageList(this.components);
|
||||
this.scheduleSettings = new Duplicati.Service_controls.ScheduleSettings();
|
||||
this.taskSettings = new Duplicati.Service_controls.TaskSettingsBase();
|
||||
this.panel1.SuspendLayout();
|
||||
this.TreeMenuStrip.SuspendLayout();
|
||||
this.splitContainer1.Panel1.SuspendLayout();
|
||||
this.splitContainer1.Panel2.SuspendLayout();
|
||||
this.splitContainer1.SuspendLayout();
|
||||
this.TreeMenuStrip.SuspendLayout();
|
||||
this.SetupMenuStrip.SuspendLayout();
|
||||
this.PropertyTabs.SuspendLayout();
|
||||
this.OccurencePage.SuspendLayout();
|
||||
@@ -110,6 +110,29 @@ namespace Duplicati
|
||||
this.OKBtn.UseVisualStyleBackColor = true;
|
||||
this.OKBtn.Click += new System.EventHandler(this.OKBtn_Click);
|
||||
//
|
||||
// TreeMenuStrip
|
||||
//
|
||||
this.TreeMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.playToolStripMenuItem});
|
||||
this.TreeMenuStrip.Name = "TreeMenuStrip";
|
||||
this.TreeMenuStrip.Size = new System.Drawing.Size(165, 48);
|
||||
this.TreeMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.TreeMenuStrip_Opening);
|
||||
//
|
||||
// playToolStripMenuItem
|
||||
//
|
||||
this.playToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("playToolStripMenuItem.Image")));
|
||||
this.playToolStripMenuItem.Name = "playToolStripMenuItem";
|
||||
this.playToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
|
||||
this.playToolStripMenuItem.Text = "Run backup now";
|
||||
this.playToolStripMenuItem.Click += new System.EventHandler(this.playToolStripMenuItem_Click);
|
||||
//
|
||||
// imageList
|
||||
//
|
||||
this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
|
||||
this.imageList.TransparentColor = System.Drawing.Color.Transparent;
|
||||
this.imageList.Images.SetKeyName(0, "Folder");
|
||||
this.imageList.Images.SetKeyName(1, "Backup");
|
||||
//
|
||||
// splitContainer1
|
||||
//
|
||||
this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
@@ -143,21 +166,6 @@ namespace Duplicati
|
||||
this.MainTree.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.MainTree_AfterLabelEdit);
|
||||
this.MainTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.MainTree_AfterSelect);
|
||||
//
|
||||
// TreeMenuStrip
|
||||
//
|
||||
this.TreeMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.playToolStripMenuItem});
|
||||
this.TreeMenuStrip.Name = "TreeMenuStrip";
|
||||
this.TreeMenuStrip.Size = new System.Drawing.Size(165, 26);
|
||||
//
|
||||
// playToolStripMenuItem
|
||||
//
|
||||
this.playToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("playToolStripMenuItem.Image")));
|
||||
this.playToolStripMenuItem.Name = "playToolStripMenuItem";
|
||||
this.playToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
|
||||
this.playToolStripMenuItem.Text = "Run backup now";
|
||||
this.playToolStripMenuItem.Click += new System.EventHandler(this.playToolStripMenuItem_Click);
|
||||
//
|
||||
// SetupMenuStrip
|
||||
//
|
||||
this.SetupMenuStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
|
||||
@@ -182,6 +190,7 @@ namespace Duplicati
|
||||
this.AddButton.Name = "AddButton";
|
||||
this.AddButton.Size = new System.Drawing.Size(29, 22);
|
||||
this.AddButton.Text = "toolStripDropDownButton1";
|
||||
this.AddButton.ToolTipText = "Add a new item";
|
||||
//
|
||||
// AddFolderMenu
|
||||
//
|
||||
@@ -202,11 +211,14 @@ namespace Duplicati
|
||||
// RemoveButton
|
||||
//
|
||||
this.RemoveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.RemoveButton.Enabled = false;
|
||||
this.RemoveButton.Image = ((System.Drawing.Image)(resources.GetObject("RemoveButton.Image")));
|
||||
this.RemoveButton.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.RemoveButton.Name = "RemoveButton";
|
||||
this.RemoveButton.Size = new System.Drawing.Size(23, 22);
|
||||
this.RemoveButton.Text = "toolStripButton2";
|
||||
this.RemoveButton.ToolTipText = "Remove the selected item";
|
||||
this.RemoveButton.Click += new System.EventHandler(this.RemoveButton_Click);
|
||||
//
|
||||
// PropertyTabs
|
||||
//
|
||||
@@ -240,13 +252,6 @@ namespace Duplicati
|
||||
this.FilePage.Text = "Files";
|
||||
this.FilePage.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// imageList
|
||||
//
|
||||
this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream")));
|
||||
this.imageList.TransparentColor = System.Drawing.Color.Transparent;
|
||||
this.imageList.Images.SetKeyName(0, "Folder");
|
||||
this.imageList.Images.SetKeyName(1, "Backup");
|
||||
//
|
||||
// scheduleSettings
|
||||
//
|
||||
this.scheduleSettings.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
@@ -275,11 +280,11 @@ namespace Duplicati
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Duplicati Setup";
|
||||
this.panel1.ResumeLayout(false);
|
||||
this.TreeMenuStrip.ResumeLayout(false);
|
||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||
this.splitContainer1.Panel1.PerformLayout();
|
||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||
this.splitContainer1.ResumeLayout(false);
|
||||
this.TreeMenuStrip.ResumeLayout(false);
|
||||
this.SetupMenuStrip.ResumeLayout(false);
|
||||
this.SetupMenuStrip.PerformLayout();
|
||||
this.PropertyTabs.ResumeLayout(false);
|
||||
|
||||
+133
-17
@@ -43,10 +43,47 @@ namespace Duplicati
|
||||
TreeNode t = new TreeNode(s.Name);
|
||||
t.ImageIndex = t.SelectedImageIndex = imageList.Images.IndexOfKey("Backup");
|
||||
t.Tag = s;
|
||||
MainTree.Nodes.Add(t);
|
||||
|
||||
if (string.IsNullOrEmpty(s.Path))
|
||||
MainTree.Nodes.Add(t);
|
||||
else
|
||||
FindNode(s.Path, true).Add(t);
|
||||
}
|
||||
}
|
||||
|
||||
private TreeNodeCollection FindNode(string path, bool allowCreate)
|
||||
{
|
||||
TreeNodeCollection col = MainTree.Nodes;
|
||||
TreeNode match = null;
|
||||
|
||||
foreach (string p in path.Split(MainTree.PathSeparator[0]))
|
||||
{
|
||||
match = null;
|
||||
|
||||
foreach(TreeNode n in col)
|
||||
if (n.Text == p)
|
||||
{
|
||||
match = n;
|
||||
col = n.Nodes;
|
||||
break;
|
||||
}
|
||||
|
||||
if (match == null)
|
||||
if (allowCreate)
|
||||
{
|
||||
match = new TreeNode(p);
|
||||
match.ImageIndex = match.SelectedImageIndex = imageList.Images.IndexOfKey("Folder");
|
||||
col.Add(match);
|
||||
col = match.Nodes;
|
||||
match.Expand();
|
||||
}
|
||||
else
|
||||
return MainTree.Nodes;
|
||||
}
|
||||
|
||||
return col;
|
||||
}
|
||||
|
||||
private void AddFolderMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
TreeNode t = new TreeNode("New folder");
|
||||
@@ -85,6 +122,7 @@ namespace Duplicati
|
||||
|
||||
private void MainTree_AfterSelect(object sender, TreeViewEventArgs e)
|
||||
{
|
||||
RemoveButton.Enabled = MainTree.SelectedNode != null;
|
||||
if (MainTree.SelectedNode == null || MainTree.SelectedNode.Tag as Schedule == null)
|
||||
{
|
||||
PropertyTabs.Visible = false;
|
||||
@@ -108,38 +146,116 @@ namespace Duplicati
|
||||
private void OKBtn_Click(object sender, EventArgs e)
|
||||
{
|
||||
//TODO: fix this when the "commit recursive" method is implemented
|
||||
m_connection.CommitAll();
|
||||
Program.DataConnection.CommitAll();
|
||||
lock (Program.MainLock)
|
||||
{
|
||||
m_connection.CommitAll();
|
||||
Program.DataConnection.CommitAll();
|
||||
}
|
||||
this.DialogResult = DialogResult.OK;
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void MainTree_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
|
||||
{
|
||||
if (e == null || e.Node == null || e.Node.Tag as Schedule == null)
|
||||
if (e == null || e.Node == null)
|
||||
return;
|
||||
|
||||
(e.Node.Tag as Schedule).Name = e.Node.Text;
|
||||
if (e.Node.FullPath != e.Node.Text)
|
||||
(e.Node.Tag as Schedule).Path = e.Node.FullPath.Substring(0, e.Node.FullPath.Length - e.Node.Text.Length - MainTree.PathSeparator.Length);
|
||||
e.Node.Text = e.Label;
|
||||
|
||||
if (e.Node.Tag as Schedule == null)
|
||||
{
|
||||
Queue<TreeNodeCollection> nodelist = new Queue<TreeNodeCollection>();
|
||||
nodelist.Enqueue(e.Node.Nodes);
|
||||
while (nodelist.Count > 0)
|
||||
{
|
||||
TreeNodeCollection col = nodelist.Dequeue();
|
||||
foreach (TreeNode n in col)
|
||||
if (n.Nodes.Count > 0)
|
||||
nodelist.Enqueue(n.Nodes);
|
||||
else if (n.Tag as Schedule != null)
|
||||
UpdatePathAndName(n);
|
||||
}
|
||||
}
|
||||
else
|
||||
UpdatePathAndName(e.Node);
|
||||
}
|
||||
|
||||
private void UpdatePathAndName(TreeNode n)
|
||||
{
|
||||
if (n == null || n.Tag as Schedule == null)
|
||||
return;
|
||||
|
||||
(n.Tag as Schedule).Name = n.Text;
|
||||
if (n.FullPath != n.Text)
|
||||
(n.Tag as Schedule).Path = n.FullPath.Substring(0, n.FullPath.Length - n.Text.Length - MainTree.PathSeparator.Length);
|
||||
}
|
||||
|
||||
private void playToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
TreeNode n = MainTree.SelectedNode;
|
||||
if (n == null || n.Tag as Schedule == null)
|
||||
TreeNode n = playToolStripMenuItem.Tag as TreeNode;
|
||||
if (n == null)
|
||||
return;
|
||||
|
||||
/*string pgp_path = System.IO.Path.Combine(Application.StartupPath, "pgp");
|
||||
string duplicity_path = System.IO.Path.Combine(Application.StartupPath, "duplicity\\duplicity.py");
|
||||
string duplicity_lib_path = System.IO.Path.Combine(Application.StartupPath, "duplicity\\duplicity");
|
||||
string python_path = System.IO.Path.Combine(Application.StartupPath, "python25\\python.exe");
|
||||
System.Collections.Specialized.StringDictionary env = new System.Collections.Specialized.StringDictionary();
|
||||
if (n.Tag as Schedule == null)
|
||||
{
|
||||
Queue<TreeNodeCollection> nodelist = new Queue<TreeNodeCollection>();
|
||||
nodelist.Enqueue(n.Nodes);
|
||||
while (nodelist.Count > 0)
|
||||
{
|
||||
TreeNodeCollection col = nodelist.Dequeue();
|
||||
foreach (TreeNode nx in col)
|
||||
if (nx.Nodes.Count > 0)
|
||||
nodelist.Enqueue(nx.Nodes);
|
||||
else if (nx.Tag as Schedule != null)
|
||||
Program.WorkThread.AddTask(nx.Tag as Schedule);
|
||||
}
|
||||
}
|
||||
else
|
||||
Program.WorkThread.AddTask(n.Tag as Schedule);
|
||||
}
|
||||
|
||||
DuplicityRunner runner = new DuplicityRunner(duplicity_path, pgp_path, python_path, duplicity_lib_path, env);
|
||||
runner.Execute(n.Tag as Schedule);*/
|
||||
private void RemoveButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (MainTree.SelectedNode == null)
|
||||
return;
|
||||
|
||||
Program.WorkThread.AddTask(n.Tag as Schedule);
|
||||
if (MainTree.SelectedNode.Tag as Schedule != null)
|
||||
{
|
||||
if (MessageBox.Show(this, "Remove the backup '" + (MainTree.SelectedNode.Tag as Schedule).Name + "' ?", Application.ProductName, MessageBoxButtons.YesNoCancel) == DialogResult.Yes)
|
||||
{
|
||||
m_connection.DeleteObject(MainTree.SelectedNode.Tag);
|
||||
MainTree.SelectedNode.Remove();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MessageBox.Show(this, "Do you want to delete this folder and all the backups contained in it?", Application.ProductName, MessageBoxButtons.YesNoCancel) == DialogResult.Yes)
|
||||
{
|
||||
Queue<TreeNodeCollection> nodelist = new Queue<TreeNodeCollection>();
|
||||
nodelist.Enqueue(MainTree.SelectedNode.Nodes);
|
||||
while (nodelist.Count > 0)
|
||||
{
|
||||
TreeNodeCollection col = nodelist.Dequeue();
|
||||
foreach (TreeNode n in col)
|
||||
if (n.Nodes.Count > 0)
|
||||
nodelist.Enqueue(n.Nodes);
|
||||
else if (n.Tag as Schedule != null)
|
||||
m_connection.DeleteObject(n.Tag);
|
||||
}
|
||||
|
||||
MainTree.SelectedNode.Remove();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void TreeMenuStrip_Opening(object sender, CancelEventArgs e)
|
||||
{
|
||||
Point p = MainTree.PointToClient(Cursor.Position);
|
||||
TreeNode n = MainTree.GetNodeAt(p);
|
||||
MainTree.SelectedNode = n;
|
||||
playToolStripMenuItem.Enabled = n != null;
|
||||
playToolStripMenuItem.Tag = n;
|
||||
}
|
||||
}
|
||||
}
|
||||
+59
-61
@@ -141,50 +141,49 @@
|
||||
<value>
|
||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
|
||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAI
|
||||
CgAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
|
||||
AwABEAMAAQEBAAEgBgABEH4AAUwBFwEIAZoBRwEMAQQBg5AAAUUBCgEPAX0BRQELARABfwFFAQsBEAF/
|
||||
AUUBCwEQAX8BRQELARABfwFFAQsBEAF/AUUBCwEQAX8BRQELARABfwFFAQsBEAF/AUUBCwEQAX8BRQEL
|
||||
ARABfwFFAQoBEAF/AQMCAQEDDAABRQEKAQ8BfQFFAQsBEAF/AUUBCwEQAX8BRQELARABfwFFAQsBEAF/
|
||||
AUUBCwEQAX8BRQEKAQ4BfwFFAQoBDQF/AUUBCgENAX8BRQEKAQ0BfwFKAUIBJgHMAUoB0QFwAf4BTAEg
|
||||
AQoBqIgAASsBAQECAT8BjAHFAfkB/wEsAdAC/wEqAc8C/wEpAc4C/wEmAc0C/wEkAcwC/wEhAcoC/wEg
|
||||
AckC/wEdAcgC/wEbAccC/wEZAcYC/wEXAcUC/wE/AVcBkAHfCAABKwEBAQIBPwGMAcUB+QH/ASwB0AL/
|
||||
ASoBzwL/ASkBzgL/ASYBzQL/ASQBzAL/AUYBygFiAf8BZwHpAZUB/wFlAekBkwH/AV8B5QGMAf8BVwHe
|
||||
AYMB/wFEAc4BVQH/AUYB0wFnAf8BSgE+ARIByIQAASsCAgE/AV4BrgH3Af8BSwHdAv8BQQHaAv8BPwHZ
|
||||
Av8BPQHZAv8BPAHYAv8BOgHXAv8BOAHWAv8BNQHUAv8BNAHTAv8BMgHSAv8BLwHRAv8BSAFhAYAB1wgA
|
||||
ASsCAgE/AV4BrgH3Af8BSwHdAv8BQQHaAv8BPwHZAv8BPQHZAv8BPAHYAv8BSQHOAWkB/wFuAeYBgQH/
|
||||
AXUB7gGIAf8BcwHwAYcB/wFoAekBfQH/AVgB3QFrAf8BSAHRAVkB/wFEAcoBXAH+AUQBYAEbAd6AAAEr
|
||||
AgIBPwF0AdQB/gH/AcYB9gH+Af8BVQHkAv8BVAHjAv8BUgHiAv8BUAHiAv8BTgHhAv8BTQHgAv8BSgHf
|
||||
Av8BSQHeAv8BRwHdAv8BRQHcAv8BWgFJAVABvwEmAQEBAgE3BAABKwICAT8BdAHUAf4B/wHGAfYB/gH/
|
||||
AVUB5AL/AVQB4wL/AVIB4gL/AWMB2wHwAf8BRwHMAWYB/wFhAdYBcwH/AWwB4wGAAf8BdAHsAYcB/wF1
|
||||
AfABiQH/AWwB6wGBAf8BXAHgAXAB/wFPAdMBawH+AUUBVwEaAdiAAAErAgIBPwFxAdgC/wGHAcMB+QH/
|
||||
AWUB7AL/AWMB6wL/AWIB6wL/AWEB6gL/AWAB6gL/AV4B6QL/AV0B6AL/AVwB6AL/AVoB5wL/AVkB5gL/
|
||||
AWMBTgFQAb8BQAFXAZAB3wQAASsCAgE/AXEB2AL/AYcBwwH5Af8BZQHsAv8BYwHrAv8BkwHlAecB/wGf
|
||||
AfgB9QH/AUEBxwFaAf8BVQHWAYEB/wFaAdwBhQH/AWAB4QGLAf8BYwHmAZAB/wF2AfABiQH/AW4B8AGT
|
||||
Af8BMwGOAVAB94QAASsCAgE/AXoB3QL/ASMBoAH3Af8BhwHxAv8BfQHwAv8BegHwAv8BdwHwAv8BdAHw
|
||||
Av8BcQHwAv8BbwHwAv8BbQHvAv8BbAHvAv8BagHvAv8BaAJQAb8BXwFrAYAB1wQAASsCAgE/AXoB3QL/
|
||||
ASMBoAH3Af8BkQHuAfcB/wG2AfgB9QH/AbQB/QH4Af8BrwHzAfEB/wGuAf0B9wH/AagB9AHxAf8BpwH3
|
||||
AfMB/wGmAfsB9QH/AV4BzgF9Af8BbgHuAZoB/wFXAYMBUQHlAV8BawGAAdeEAAErAgIBPwGKAeYC/wEx
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACu
|
||||
CQAAAk1TRnQBSQFMAgEBAgEAAQQBAAEEAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
|
||||
AwABEAMAAQEBAAEgBgABEH4AAVACAgGaAUkCAgGDkAABRgIBAX0BRwIBAX8BRwIBAX8BRwIBAX8BRwIB
|
||||
AX8BRwIBAX8BRwIBAX8BRwIBAX8BRwIBAX8BRwIBAX8BRwIBAX8BRwIBAX8BAwIBAQMMAAFGAgEBfQFH
|
||||
AgEBfwFHAgEBfwFHAgEBfwFHAgEBfwFHAgEBfwFHAgEBfwFHAgEBfwFHAgEBfwFHAgEBfwFdAQUBBAHM
|
||||
AVEBvgFwAf4BVAICAaiIAAErAgEBPwGMAcUB+QH/ATMB0AL/ATEBzwL/ATABzgL/AS0BzQL/ASsBzAL/
|
||||
ASgBygL/AScByQL/ASQByAL/ASIBxwL/ASABxgL/AR4BxQL/AVwBEAEYAd8IAAErAgEBPwGMAcUB+QH/
|
||||
ATMB0AL/ATEBzwL/ATABzgL/AS0BzQL/ASsBzAL/AU0BygFpAf8BbgHpAZUB/wFsAekBkwH/AWYB5QGM
|
||||
Af8BXgHeAYMB/wFLAc4BXAH/AU0B0wFuAf8BXAEEAQMByIQAASsCAQE/AWUBrgH3Af8BUgHdAv8BSAHa
|
||||
Av8BRgHZAv8BRAHZAv8BQwHYAv8BQQHXAv8BPwHWAv8BPAHUAv8BOwHTAv8BOQHSAv8BNgHRAv8BXgEL
|
||||
AQ4B1wgAASsCAQE/AWUBrgH3Af8BUgHdAv8BSAHaAv8BRgHZAv8BRAHZAv8BQwHYAv8BUAHOAXAB/wF1
|
||||
AeYBgQH/AXwB7gGIAf8BegHwAYcB/wFvAekBgQH/AV8B3QFyAf8BTwHRAWAB/wFLAbkBXAH+AV0BEAEI
|
||||
Ad6AAAErAgEBPwF7AdQB/gH/AcYB9gH+Af8BXAHkAv8BWwHjAv8BWQHiAv8BVwHiAv8BVQHhAv8BVAHg
|
||||
Av8BUQHfAv8BUAHeAv8BTgHdAv8BTAHcAv8BWwIDAb8BJgIBATcEAAErAgEBPwF7AdQB/gH/AcYB9gH+
|
||||
Af8BXAHkAv8BWwHjAv8BWQHiAv8BagHbAfAB/wFOAcwBbQH/AWgB1gF6Af8BcwHjAYEB/wF7AewBhwH/
|
||||
AXwB8AGJAf8BcwHrAYEB/wFjAeABdwH/AVYBvwFrAf4BXgEJAQQB2IAAASsCAQE/AXgB2AL/AYcBwwH5
|
||||
Af8BbAHsAv8BagHrAv8BaQHrAv8BaAHqAv8BZwHqAv8BZQHpAv8BZAHoAv8BYwHoAv8BYQHnAv8BYAHm
|
||||
Av8BXQIDAb8BXQEQARgB3wQAASsCAQE/AXgB2AL/AYcBwwH5Af8BbAHsAv8BagHrAv8BkwHlAecB/wGf
|
||||
AfgB9QH/AUgBxwFhAf8BXAHWAYEB/wFhAdwBhQH/AWcB4QGLAf8BagHmAZAB/wF9AfABiQH/AXUB8AGT
|
||||
Af8BSQFdATYB94QAASsCAQE/AYEB3QL/ASoBoAH3Af8BhwHxAv8BgQHwAv8BgQHwAv8BfgHwAv8BewHw
|
||||
Av8BeAHwAv8BdgHwAv8BdAHvAv8BcwHvAv8BcQHvAv8BXQIDAb8BXwEMAQ4B1wQAASsCAQE/AYEB3QL/
|
||||
ASoBoAH3Af8BkQHuAfcB/wG2AfgB9QH/AbQB/QH4Af8BrwHzAfEB/wGuAf0B9wH/AagB9AHxAf8BpwH3
|
||||
AfMB/wGmAfsB9QH/AWUBzgGBAf8BdQHuAZoB/wFkAR4BFQHlAV8BDAEOAdeEAAErAgEBPwGKAeYC/wE4
|
||||
Ac4B/gH/AekB+AH+Af8B4AH7Av8B3wH7Av8B3gH7Av8B1wH6Av8BmAH0Av8BlQH0Av8BkgH0Av8BjwH0
|
||||
Av8BjAH0Av8BcwJQAb8BcQJQAb8BKQEBAQIBPAErAgIBPwGKAeYC/wExAc4B/gH/Ae8B+AH8Af8B8QH/
|
||||
Af0B/wHvAvwB/wHvAf4B/QH/AesB/gH8Af8ByQHyAfEB/wHIAf0B+AH/AcMB9gHzAf8BagHQAX4B/wGA
|
||||
AdoBmwH/AYQBeAF2AdUBcQJQAb8BKQEBAQIBPIAAASsCAgE/AZwB7wL/AVIB5AL/AVIB5AL/AVIB5AL/
|
||||
AVIB5AL/AVIB5AL/AUYBygH7Af8B8gH9Af4B/wHoAfwC/wHnAfwC/wHmAfwC/wHmAfwC/wHJArcB6wHI
|
||||
ArcB6wE+AV8BmwHkASsCAgE/AZwB7wL/AVIB5AL/AVIB5AL/AfABywHEA/8B9gH/Af4B9gHuAf8BuAHQ
|
||||
AeoB/wH5Av0B/wH2Af4B/QH/AfQC+gH/AfUB/gH9Af8B9AH+Af0B/wHzAvoB/wHIArcB6wE+AV8BmwHk
|
||||
gAABKwICAT8BrwH5Av8BdAH0Av8BdAH0Av8BdAH0Av8BdAH0Av8BdAH0Av8BdAH0Av8BdAH0Av8BdAH0
|
||||
Av8BdAH0Av8BdAH0Av8BdAH0Av8MAAErAgIBPwGvAfkC/wF0AfQC/wF0AfQC/wF2AfQB/gL/AvMD/wH8
|
||||
Af8B+wLbAf8B/AHxAe8B/wH7AfIB7QH/AfEB0wHRAf8C/gH2Af8B8gHeAdkB/wH+AecB3gH/AaMBUAEv
|
||||
AeKEAAErAgIBPwHGA/8BmgP/AZoD/wGaA/8B0AP/AeMD/wHjA/8B4wP/AeMD/wHjA/8B4wP/Ad4B/AH+
|
||||
Af8MAAErAgIBPwHGA/8BmgP/AZoD/wGaA/8B3wHeAdIF/wH9Ae8B8AH/A/4B/wH4AdkB2wH/AfoB7AHt
|
||||
Af8B+wL0Af8C/gH8Af8B9AHKAYUB/wFcARQBDgGPhAABKwICAT8B6QP/AdkD/wHZA/8B2QP/AU0BPwFl
|
||||
AcwoAAErAgIBPwHpA/8B2QP/AdkD/wHZA/8BTwE/AWUBzAHPAZIBhgHrBP8B/gL8Af8B+QHTAdUB/wH+
|
||||
AvwB/wH1Ad4B3wX/AfUB4wHXAf8BIwIBATGIAAFHAQsBEAF/AUgBDAEQAX8BSAEMARABfwFIAQsBEAF/
|
||||
AQ8CAQESLAABRwELARABfwFIAQwBEAF/AUgBDAEQAX8BSAELARABfwEPAgEBEgQAAf4B6gHpAf8D/gH/
|
||||
AfwB4QHiAf8B/gL9Bv8C8wH/AVgBEQEPAYjkAAEpAgIBOwH/Av0J/wHzAcwBwgH8AQ4CAQER7AABnQFV
|
||||
AUoBygH/AvwB/wGGAToBMgG4+AABIQIBAS6YAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUA
|
||||
AYAXAAP/AQAD/wHnBAABgAEDAYABAwUAAQMBAAEBBQABAwcAAQEHAAEBAQABAQUAAQEBAAEBFQABBwEA
|
||||
AQEFAAEHAQABAQQAAQMB/wEAAQEEAAGDAf8BggEDBAAC/wH+AQcEAAP/AR8EAAP/Ab8EAAs=
|
||||
Av8BjAH0Av8BXQIDAb8BXQIDAb8BKQIBATwBKwIBAT8BigHmAv8BOAHOAf4B/wHvAfgB/AH/AfEB/wH9
|
||||
Af8B7wL8Af8B7wH+Af0B/wHrAf4B/AH/AckB8gHxAf8ByAH9AfgB/wHDAfYB8wH/AXEB0AGBAf8BgQHa
|
||||
AZsB/wFkAgwB1QFdAgMBvwEpAgEBPIAAASsCAQE/AZwB7wL/AVkB5AL/AVkB5AL/AVkB5AL/AVkB5AL/
|
||||
AVkB5AL/AU0BygH7Af8B8gH9Af4B/wHoAfwC/wHnAfwC/wHmAfwC/wHmAfwC/wGGAj0B6wGGAj0B6wFc
|
||||
ARYBIwHkASsCAQE/AZwB7wL/AVkB5AL/AVkB5AL/AfABywHEA/8B9gH/Af4B9gHuAf8BuAHQAeoB/wH5
|
||||
Av0B/wH2Af4B/QH/AfQC+gH/AfUB/gH9Af8B9AH+Af0B/wHzAvoB/wGGAj0B6wFcARYBIwHkgAABKwIB
|
||||
AT8BrwH5Av8BewH0Av8BewH0Av8BewH0Av8BewH0Av8BewH0Av8BewH0Av8BewH0Av8BewH0Av8BewH0
|
||||
Av8BewH0Av8BewH0Av8MAAErAgEBPwGvAfkC/wF7AfQC/wF7AfQC/wF9AfQB/gL/AvMD/wH8Af8B+wLb
|
||||
Af8B/AHxAe8B/wH7AfIB7QH/AfEB0wHRAf8C/gH2Af8B8gHeAdkB/wH+AecB3gH/AW4BEQEMAeKEAAEr
|
||||
AgEBPwHGA/8BmgP/AZoD/wGaA/8B0AP/AeMD/wHjA/8B4wP/AeMD/wHjA/8B4wP/Ad4B/AH+Af8MAAEr
|
||||
AgEBPwHGA/8BmgP/AZoD/wGaA/8B3wHeAdIF/wH9Ae8B8AH/A/4B/wH4AdkB2wH/AfoB7AHtAf8B+wL0
|
||||
Af8C/gH8Af8B9AHKAYUB/wFOAgIBj4QAASsCAQE/AekD/wHZA/8B2QP/AdkD/wFdAQUBBgHMKAABKwIB
|
||||
AT8B6QP/AdkD/wHZA/8B2QP/AV0BBQEGAcwBiwEyASsB6wT/Af4C/AH/AfkB0wHVAf8B/gL8Af8B9QHe
|
||||
Ad8F/wH1AeMB1wH/ASMCAQExiAABRwIBAX8BRwIBAX8BRwIBAX8BRwIBAX8BDwIBARIsAAFHAgEBfwFH
|
||||
AgEBfwFHAgEBfwFHAgEBfwEPAgEBEgQAAf4B6gHpAf8D/gH/AfwB4QHiAf8B/gL9Bv8C8wH/AUoCAgGI
|
||||
5AABKAIBATsB/wL9Cf8B0wGwAaUB/AEOAgEBEewAAWACBQHKAf8C/AH/AVsCAgG4+AABIQIBAS6YAAFC
|
||||
AU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/AQAD/wHnBAABgAEDAYABAwUAAQMBAAEB
|
||||
BQABAwcAAQEHAAEBAQABAQUAAQEBAAEBFQABBwEAAQEFAAEHAQABAQQAAQMB/wEAAQEEAAGDAf8BggED
|
||||
BAAC/wH+AQcEAAP/AR8EAAP/Ab8EAAs=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="SetupMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
@@ -193,29 +192,28 @@
|
||||
<data name="AddFolderMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAZRJREFUOE/dkt0r
|
||||
Q3EYx/0lKzf+hOFCSpkL5EZEKVOUXUiKSIwbr5ELpVxQrORuoaUtLxtnc46F8jLMVjM2w4zMy/nZOV/n
|
||||
/M50OpHm1qlPfX91zud5nt95srL+x0P2Z0EO5ii8dxp/mkr+SBSOIPL7AO+mmWdGMpfIAogLgDCeZiJ9
|
||||
XpbO3yF7HVo5FTyPAY/N3xAu60HYagWuhvJuK/1BEGmF4DOAbBZp2W6no32NR0dMOgFcQEjuKiLawVkV
|
||||
iN0A8Y0BXm0qL/NKdxL30X4cB4Yo8adFEF+fKhC9hSA7ZiDRQREfTBoOT01Y8k+BiayAizpodtl7VYFc
|
||||
XQhNArE6LdFa3PkrMcIaMXPWg4NbF07iHM0DngZV8OGRKsa6gVC5SrAEkNhiitHH1oC7ceDy6Ryx5BXt
|
||||
YtBrVATy4hBuWLqHAsCXDxzrNTjXctHlrsBqyIJA4ohK5GyW/owicA1A7iDlzFFZz0aKokPYqoPJrkcj
|
||||
q4ctbMHGtZXmJkde5ssmF2phyjAYaMNosBNy/tO6//byJ06f1zhfg1t+AAAAAElFTkSuQmCC
|
||||
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAU5JREFUOE/dkjtL
|
||||
A0EUhfMzRLCwEcResImgkEZsFQvRUlPZGAQLRYigoFhY2Qha2IukUBQVYzQGN0ViCGgRCzWID/A5k505
|
||||
ziO7s6MWiaULH7sze+fsOXdvKPQ/LuqsgmbXFCSzgrpSyUOc5cCJA5Bj9UyS87WLSAHwDYAtVlnSa2zZ
|
||||
VPfoecwWVwIvC8Dz6A/Y9TDoab8mPaTun4meXwRuxsAuukH3u2yOxlU0L56K+JEUzi7BXs+0kHJQ7APd
|
||||
juiX7wnD27p25xMHe5hR0Whh2gjwTCfoyRTwFNM8Rm3Kg4BE7LO7EcAVf03U+w7k11lpWRcFuR0AgpR6
|
||||
1Zrdx00fZIRKKgpengRkgcdVBPhOMax7JRrqz4ocHJqeE30IA4UOIN9uk20DPJxWQEBSEwGBw1nlwD1o
|
||||
Mew1w5XsNhl2GuAKKpuNtQ9ZXSP91+IvbIPAcpQnrtUAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="AddBackupMenu.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
|
||||
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgFJREFUOE+dk19r
|
||||
02AUh/dJBt74EYpeiHizq4l3ihciigoOEfFGRbSFyYYbjCmCTtGBVIegMIbM2cD+VLY2teqQudK1mSRZ
|
||||
uiXr1m5tkyZN+pNzOtNOvZh74YFf4JznHML7trXt4SzrHvZQ9u8SanZcF4ru7k9iVmssICgvSM7fIjv5
|
||||
FM73MEP59y40lRrz6y5Wc44v2iXhRi8FIM5QNuceIJ3Nc0Ox0BAQslzhLTTDxAd5uzGIBKiPAN7ADoPI
|
||||
qIv+ytSY0ywYhu0LRqbzuCGstwhKfUDxMpPXunkCry4tYSv2HIX4MPSpZzC/DUMTnvD32OOBFkHuGrxU
|
||||
B5zpY1AnQlxIRaVPD1HzDFTtnE+tnuFsbYotgvRJOJEOWGYWVEDQv7Dsr6hUZ1CxJ6EY7zCvvGaklZdw
|
||||
UqGmoJ48CicehLVxD9ulV7DctyhbbzgTn6VBjGWGMJt7j8SqwDkaudsU0HRPfgQYZ5niWjdK5SHmp9qP
|
||||
PvECXqTvYN6IYnEjwbkndr4pqMW6UNdvA/Jxn3L2DDaVIIQvVxASTyOxJkDZWoJeXuEtepPnGgK+RIn7
|
||||
QPoIkDoM/AjsYvxjJ27NncCEHIZUWGAJ5aB4akcQ7QFt4M4cbDJ5AC7TDnW0HV2RAC6KAYyrYUxpo5wv
|
||||
CYf+721cne1Er3Qd/cs3QXnfr/PPxl/yf0yKCd1nwwAAAABJRU5ErkJggg==
|
||||
YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgJJREFUOE+1k09r
|
||||
E1EUxfNZuvADuBBcSOkmBaWCBSMuJEppwYD9o9hYLBo1ldZFXdiFBNq6sNiFIHZRRIOaYM3QxgRN45ip
|
||||
LU1txmZMbNokTudlZk65N5ixiosKDvy49/HmnHNneM/l+t9PsWhiq2JDyVnYdxaJDNNu8FcTkZyE+PCQ
|
||||
MeKhRhKJKf2bZoImoTXVxdUdZxoWmTIAiaE+L03vEaiq4DVVMnnyubrXAPYjwBplhBiDsrrNL1L6TyHV
|
||||
rxs67/mfar8ZlO8ApfOMnHnREGvLCvKRcZQXJqGGQ9iUxplPMyEkZyfqJvQJUHthyW6Uw8dYUE0+qNe3
|
||||
9yBMDYbIQjfW8f57lPvqjyVYlYVfDDIeiOdu3qzZSwz9C91IoKJHUNl5yfQkTuJ+uh81cwZCDjgGdrwZ
|
||||
QroOvRDEVnkKuvkYheoUnuWGMLt2g6G+f/EUhtUuTCg+lBJBx4DSrewYoHmZ0sYtpPIj8L07yqLAylkW
|
||||
3i12Y0jrRWDdi9H5PsegFvPBzl8Fsm0N0ul29KTaMbDSiZuFCxjevMT1cu4cOjIn0JVqxaB0ES46OGJ+
|
||||
BMgcAeTDQPoQs5w8iCvKaU4kSNy3dgbej23wJFrQEXPXJzCit0ETmJEDDq+a8CXcBP/rZgRjrcy1aAu6
|
||||
424Wd745vv97QWH+Oc+/i8lgcG7gj+RdUIovDDy0pEgAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<data name="AddButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
|
||||
@@ -64,7 +64,7 @@ namespace Duplicati
|
||||
//TODO: This should be protected, as the thread might change it while we itterate
|
||||
scheduledBackups.Items.Clear();
|
||||
foreach (Schedule s in Program.Scheduler.Schedule)
|
||||
scheduledBackups.Items.Add(s.When.ToString("g") + " " + s.Path);
|
||||
scheduledBackups.Items.Add(s.When.ToString("g") + " " + s.Name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace Duplicati
|
||||
else
|
||||
{
|
||||
Schedule c = Program.WorkThread.CurrentTask;
|
||||
CurrentStatus.Text = c == null ? "Waiting for next backup" : "Running " + c.Path;
|
||||
CurrentStatus.Text = c == null ? "Waiting for next backup" : "Running " + c.Name;
|
||||
statusImage.Image = Program.WorkingImage;
|
||||
WorkThread_AddedWork(sender, e);
|
||||
}
|
||||
@@ -109,7 +109,7 @@ namespace Duplicati
|
||||
{
|
||||
pendingBackups.Items.Clear();
|
||||
foreach (Schedule s in Program.WorkThread.CurrentTasks)
|
||||
pendingBackups.Items.Add(s.Path == null ? "" : s.Path);
|
||||
pendingBackups.Items.Add(s.Name == null ? "" : s.Name);
|
||||
|
||||
}
|
||||
|
||||
@@ -148,11 +148,15 @@ namespace Duplicati
|
||||
|
||||
private void BuildRecent()
|
||||
{
|
||||
Log[] logs = Program.DataConnection.GetObjects<Log>("EndTime > ? AND SubAction LIKE ? ORDER BY Time DESC", Timeparser.ParseTimeInterval(Program.ApplicationSettings.RecentBackupDuration, DateTime.Now), "Primary");
|
||||
Log[] logs;
|
||||
lock(Program.MainLock)
|
||||
logs = Program.DataConnection.GetObjects<Log>("EndTime > ? AND SubAction LIKE ? ORDER BY EndTime DESC", Timeparser.ParseTimeInterval(Program.ApplicationSettings.RecentBackupDuration, DateTime.Now, true), "Primary");
|
||||
|
||||
|
||||
recentBackups.Items.Clear();
|
||||
foreach (Log l in logs)
|
||||
{
|
||||
ListViewItem lvi = new ListViewItem(new string[] { l.EndTime.ToString("g", System.Globalization.CultureInfo.CurrentUICulture), l.OwnerTask.Schedule.Path, l.TransferSizeString });
|
||||
ListViewItem lvi = new ListViewItem(new string[] { l.EndTime.ToString("g", System.Globalization.CultureInfo.CurrentUICulture), l.OwnerTask.Schedule.Name, l.TransferSizeString });
|
||||
|
||||
lvi.Tag = l;
|
||||
lvi.ImageIndex = imageList.Images.ContainsKey(l.ParsedStatus) ? imageList.Images.IndexOfKey(l.ParsedStatus) : imageList.Images.IndexOfKey("Warning");
|
||||
@@ -173,8 +177,8 @@ namespace Duplicati
|
||||
|
||||
LogViewer dlg = new LogViewer();
|
||||
//TODO: Figure out why the LDM fails here
|
||||
LogBlob lbl = l.DataParent.GetObjectById<LogBlob>(l.LogBlobID);
|
||||
dlg.LogText.Text = lbl.StringData;//l.LogBlob.StringData;
|
||||
dlg.LogText.Text = l.LogBlob.StringData;
|
||||
|
||||
dlg.ShowDialog(this);
|
||||
}
|
||||
|
||||
|
||||
+11
-1
@@ -38,6 +38,14 @@ namespace Duplicati
|
||||
|
||||
public static DateTime ParseTimeInterval(string datestring, DateTime offset)
|
||||
{
|
||||
return ParseTimeInterval(datestring, offset, false);
|
||||
}
|
||||
|
||||
public static DateTime ParseTimeInterval(string datestring, DateTime offset, bool negate)
|
||||
{
|
||||
|
||||
int multiplier = negate ? -1 : 1;
|
||||
|
||||
if (string.IsNullOrEmpty(datestring))
|
||||
return offset;
|
||||
|
||||
@@ -46,7 +54,7 @@ namespace Duplicati
|
||||
|
||||
long l;
|
||||
if (long.TryParse(datestring, System.Globalization.NumberStyles.Integer, null, out l))
|
||||
return offset.AddSeconds(l);
|
||||
return offset.AddSeconds(l * multiplier);
|
||||
|
||||
DateTime t;
|
||||
if (DateTime.TryParse(datestring, System.Globalization.CultureInfo.CurrentUICulture, System.Globalization.DateTimeStyles.None, out t))
|
||||
@@ -64,6 +72,8 @@ namespace Duplicati
|
||||
if (!int.TryParse(partial, System.Globalization.NumberStyles.Integer, null, out factor))
|
||||
throw new Exception("Failed to parse the segment: " + partial + ", invalid integer");
|
||||
|
||||
factor *= multiplier;
|
||||
|
||||
switch (datestring[index])
|
||||
{
|
||||
case 's':
|
||||
|
||||
Reference in New Issue
Block a user