From daaef5f09211bb6095ccee0816a5c41b15fed21e Mon Sep 17 00:00:00 2001 From: "kenneth.skovhede@gmail.com" Date: Sun, 29 Mar 2009 18:06:02 +0000 Subject: [PATCH] Fixed issue #39. Fixed issue #41. Fixed issue #11. Refactored the way settings are stored, this means that you cannot go back to a previous version if you have used this one. A backup of the old database will be created, if you need to use a previous version. Fixed a bug in the S3 backend where the filenames would be prefixed with a slash. Moved the file time seperator char out of the file backend, and into common settings. git-svn-id: https://duplicati.googlecode.com/svn/trunk@134 59da171f-624f-0410-aa54-27559c288bec --- Duplicati/GUI/Backup defaults.xml | 1 + .../2. Refactor for easier extensions.sql | 57 +++ Duplicati/GUI/Database schema/Schema.sql | 28 +- Duplicati/GUI/Datamodel/BackendSetting.cs | 92 +++++ Duplicati/GUI/Datamodel/Backends/FTP.cs | 31 +- Duplicati/GUI/Datamodel/Backends/File.cs | 25 +- Duplicati/GUI/Datamodel/Backends/S3.cs | 42 +-- Duplicati/GUI/Datamodel/Backends/SSH.cs | 31 +- Duplicati/GUI/Datamodel/Backends/WEBDAV.cs | 61 ++-- Duplicati/GUI/Datamodel/Datamodel.csproj | 121 +------ Duplicati/GUI/Datamodel/Duplicati.sqlite | Bin 13312 -> 18432 bytes .../GUI/Datamodel/LightDataModel.Mapping.xml | 333 ++++++++++-------- Duplicati/GUI/Datamodel/LightDatamodel.dll | Bin 122880 -> 122880 bytes Duplicati/GUI/Datamodel/Schedule.cs | 176 ++++----- Duplicati/GUI/Datamodel/SettingsHelper.cs | 73 ++-- Duplicati/GUI/Datamodel/Task.Extension.cs | 179 ++++++++-- Duplicati/GUI/Datamodel/Task.cs | 94 ++--- Duplicati/GUI/Datamodel/TaskExtension.cs | 92 +++++ .../{TaskSetting.cs => TaskOverride.cs} | 12 +- Duplicati/GUI/Duplicati.csproj | 23 ++ .../Backends/FileSettings.Designer.cs | 36 -- .../Service controls/Backends/FileSettings.cs | 9 - .../GUI/Service controls/ScheduleSettings.cs | 16 +- .../Add backup/AdvancedOptions.Designer.cs | 36 +- .../Add backup/AdvancedOptions.cs | 9 + .../Wizard pages/Add backup/EditFilters.cs | 7 +- .../GeneratedFilenameOptions.Designer.cs | 111 ++++++ .../Add backup/GeneratedFilenameOptions.cs | 79 +++++ .../Add backup/GeneratedFilenameOptions.resx | 120 +++++++ .../Add backup/IncrementalSettings.cs | 4 + .../Wizard pages/Add backup/SelectFiles.cs | 4 +- .../GUI/Wizard pages/Add backup/SelectWhen.cs | 4 + .../Add backup/SettingOverrides.Designer.cs | 183 ++++++++++ .../Add backup/SettingOverrides.cs | 106 ++++++ .../Add backup/SettingOverrides.resx | 123 +++++++ .../Add backup/ThrottleOptions.Designer.cs | 18 +- .../Add backup/ThrottleOptions.cs | 4 + .../GUI/Wizard pages/WizardSettingsWrapper.cs | 115 +++++- Duplicati/GUI/WizardHandler.cs | 7 +- Duplicati/Library/Backend/File/FileBackend.cs | 2 +- Duplicati/Library/Backend/S3/S3Backend.cs | 10 +- Duplicati/Library/Core/Utility.cs | 29 ++ Duplicati/Library/Main/FilenameStrategy.cs | 2 + Duplicati/Library/Main/Interface.cs | 4 +- Duplicati/Library/Main/Options.cs | 6 +- .../LightDataModel/DataClassFileBuilder.exe | Bin 118784 -> 118784 bytes thirdparty/LightDataModel/LightDatamodel.dll | Bin 122880 -> 122880 bytes 47 files changed, 1827 insertions(+), 688 deletions(-) create mode 100644 Duplicati/GUI/Database schema/2. Refactor for easier extensions.sql create mode 100644 Duplicati/GUI/Datamodel/BackendSetting.cs create mode 100644 Duplicati/GUI/Datamodel/TaskExtension.cs rename Duplicati/GUI/Datamodel/{TaskSetting.cs => TaskOverride.cs} (90%) create mode 100644 Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.Designer.cs create mode 100644 Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.cs create mode 100644 Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.resx create mode 100644 Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.Designer.cs create mode 100644 Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.cs create mode 100644 Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.resx diff --git a/Duplicati/GUI/Backup defaults.xml b/Duplicati/GUI/Backup defaults.xml index d6bca8f68..4f1143afa 100644 --- a/Duplicati/GUI/Backup defaults.xml +++ b/Duplicati/GUI/Backup defaults.xml @@ -8,4 +8,5 @@ 13h e:.*\\Thumbs.db true + ' diff --git a/Duplicati/GUI/Database schema/2. Refactor for easier extensions.sql b/Duplicati/GUI/Database schema/2. Refactor for easier extensions.sql new file mode 100644 index 000000000..3bda651c7 --- /dev/null +++ b/Duplicati/GUI/Database schema/2. Refactor for easier extensions.sql @@ -0,0 +1,57 @@ +-- TaskSettings becomes BackendSetting +ALTER TABLE TaskSetting RENAME TO BackendSetting; + +-- TaskSetting is now extensions +CREATE TABLE "TaskExtension" ( + "ID" INTEGER PRIMARY KEY, + "TaskID" INTEGER NULL, + "Name" TEXT NULL, + "Value" TEXT NULL +); + +-- Copy values from the Task table +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Max Upload Size', [MaxUploadSize] FROM Task; +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Upload bandwidth', [UploadBandwidth] FROM Task; +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Download Bandwidth', [DownloadBandwidth] FROM Task; +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Volume Size', [VolumeSize] FROM Task; +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Thread Priority', [ThreadPriority] FROM Task; +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Async Transfer', [AsyncTransfer] FROM Task; +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Include Setup', [IncludeSetup] FROM Task; +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [ID], 'Ignore Timestamps', [IgnoreTimestamps] FROM Task; + +-- Move FileTimeSeperator into extensions +INSERT INTO TaskExtension ([TaskID], [Name], [Value]) SELECT [TaskID], 'File Time Seperator', Value FROM BackendSetting WHERE [Name] = 'TimeSeparator'; +DELETE FROM BackendSetting WHERE [Name] = 'TimeSeparator'; + +-- Create a reduced Task table +CREATE TABLE "TempTask" ( + "ID" INTEGER PRIMARY KEY, + "ScheduleID" INTEGER NULL, + "Service" TEXT NULL, + "Encryptionkey" TEXT NULL, + "Signaturekey" TEXT NULL, + "SourcePath" TEXT NULL, + "KeepFull" INTEGER NULL, + "KeepTime" TEXT NULL, + "FullAfter" TEXT NULL, + "GPGEncryption" BOOLEAN NULL, + "IncludeSetup" BOOLEAN NULL +); + +-- Copy values +INSERT INTO TempTask ([ID], [ScheduleID], [Service], [EncryptionKey], [SignatureKey], [SourcePath], [KeepFull], [KeepTime], [FullAfter], [GPGEncryption], [IncludeSetup]) SELECT [ID], [ScheduleID], [Service], [EncryptionKey], [SignatureKey], [SourcePath], [KeepFull], [KeepTime], [FullAfter], [GPGEncryption], [IncludeSetup] FROM Task; +DROP TABLE Task; + +-- Use the new reduced table +ALTER TABLE "TempTask" RENAME TO "Task"; + +-- Add the override table +CREATE TABLE "TaskOverride" ( + "ID" INTEGER PRIMARY KEY, + "TaskID" INTEGER NULL, + "Name" TEXT NULL, + "Value" TEXT NULL +); + +-- Reduce database size +VACUUM; \ No newline at end of file diff --git a/Duplicati/GUI/Database schema/Schema.sql b/Duplicati/GUI/Database schema/Schema.sql index 2335f67cb..f9e62f239 100644 --- a/Duplicati/GUI/Database schema/Schema.sql +++ b/Duplicati/GUI/Database schema/Schema.sql @@ -1,22 +1,15 @@ CREATE TABLE "Task" ( "ID" INTEGER PRIMARY KEY, + "ScheduleID" INTEGER NULL, "Service" TEXT NULL, "Encryptionkey" TEXT NULL, "Signaturekey" TEXT NULL, "SourcePath" TEXT NULL, - "ScheduleID" INTEGER NULL, "KeepFull" INTEGER NULL, "KeepTime" TEXT NULL, - "MaxUploadsize" TEXT NULL, - "UploadBandwidth" TEXT NULL, - "DownloadBandwidth" TEXT NULL, - "VolumeSize" TEXT NULL, "FullAfter" TEXT NULL, - "ThreadPriority" TEXT NULL, - "AsyncTransfer" BOOLEAN NULL, "GPGEncryption" BOOLEAN NULL, - "IncludeSetup" BOOLEAN NULL, - "IgnoreTimestamps" BOOLEAN NULL + "IncludeSetup" BOOLEAN NULL ); CREATE TABLE "Schedule" ( @@ -28,8 +21,21 @@ CREATE TABLE "Schedule" ( "Weekdays" TEXT NULL ); +CREATE TABLE "BackendSetting" ( + "ID" INTEGER PRIMARY KEY, + "TaskID" INTEGER NULL, + "Name" TEXT NULL, + "Value" TEXT NULL +); -CREATE TABLE "TaskSetting" ( +CREATE TABLE "TaskExtension" ( + "ID" INTEGER PRIMARY KEY, + "TaskID" INTEGER NULL, + "Name" TEXT NULL, + "Value" TEXT NULL +); + +CREATE TABLE "TaskOverride" ( "ID" INTEGER PRIMARY KEY, "TaskID" INTEGER NULL, "Name" TEXT NULL, @@ -80,4 +86,4 @@ CREATE TABLE "TaskFilter" ( ); -INSERT INTO "Version" ("Version") VALUES (1); \ No newline at end of file +INSERT INTO "Version" ("Version") VALUES (2); \ No newline at end of file diff --git a/Duplicati/GUI/Datamodel/BackendSetting.cs b/Duplicati/GUI/Datamodel/BackendSetting.cs new file mode 100644 index 000000000..50172a8af --- /dev/null +++ b/Duplicati/GUI/Datamodel/BackendSetting.cs @@ -0,0 +1,92 @@ +#region Disclaimer / License +// Copyright (C) 2009, 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 +/// +/// This class was created by DataClassFileBuilder (LightDatamodel) +/// +/// Table +/// Duplicati.Datamodel +/// BackendSetting +/// +/// + +using System.Data.LightDatamodel; +using System.Data.LightDatamodel.DataClassAttributes; + +namespace Duplicati.Datamodel +{ + + [DatabaseTable("BackendSetting")] + public partial class BackendSetting : DataClassBase + { + +#region " private members " + + [AutoIncrement, PrimaryKey, DatabaseField("ID")] + private System.Int64 m_ID = long.MinValue; + [Relation("BackendSettingTask", typeof(Task), "ID"), DatabaseField("TaskID")] + private System.Int64 m_TaskID = long.MinValue; + [DatabaseField("Name")] + private System.String m_Name = ""; + [DatabaseField("Value")] + private System.String m_Value = ""; +#endregion + +#region " properties " + + public System.Int64 ID + { + get{return m_ID;} + set{object oldvalue = m_ID;OnBeforeDataChange(this, "ID", oldvalue, value);m_ID = value;OnAfterDataChange(this, "ID", oldvalue, value);} + } + + public System.Int64 TaskID + { + get{return m_TaskID;} + set{object oldvalue = m_TaskID;OnBeforeDataChange(this, "TaskID", oldvalue, value);m_TaskID = value;OnAfterDataChange(this, "TaskID", oldvalue, value);} + } + + public System.String Name + { + get{return m_Name;} + set{object oldvalue = m_Name;OnBeforeDataChange(this, "Name", oldvalue, value);m_Name = value;OnAfterDataChange(this, "Name", oldvalue, value);} + } + + public System.String Value + { + get{return m_Value;} + set{object oldvalue = m_Value;OnBeforeDataChange(this, "Value", oldvalue, value);m_Value = value;OnAfterDataChange(this, "Value", oldvalue, value);} + } + +#endregion + +#region " referenced properties " + + [Affects(typeof(Task))] + public Task Task + { + get{ return ((DataFetcherWithRelations)m_dataparent).GetRelatedObject("BackendSettingTask", this); } + set{ ((DataFetcherWithRelations)m_dataparent).SetRelatedObject("BackendSettingTask", this, value); } + } + +#endregion + + } + +} \ No newline at end of file diff --git a/Duplicati/GUI/Datamodel/Backends/FTP.cs b/Duplicati/GUI/Datamodel/Backends/FTP.cs index 62e7a4165..e369606ad 100644 --- a/Duplicati/GUI/Datamodel/Backends/FTP.cs +++ b/Duplicati/GUI/Datamodel/Backends/FTP.cs @@ -42,20 +42,20 @@ namespace Duplicati.Datamodel.Backends public string Username { - get { return m_owner.Settings[USERNAME]; } - set { m_owner.Settings[USERNAME] = value; } + get { return m_owner.BackendSettingsLookup[USERNAME]; } + set { m_owner.BackendSettingsLookup[USERNAME] = value; } } public string Password { - get { return m_owner.Settings[PASSWORD]; } - set { m_owner.Settings[PASSWORD] = value; } + get { return m_owner.BackendSettingsLookup[PASSWORD]; } + set { m_owner.BackendSettingsLookup[PASSWORD] = value; } } public string Host { - get { return m_owner.Settings[HOST]; } - set { m_owner.Settings[HOST] = value; } + get { return m_owner.BackendSettingsLookup[HOST]; } + set { m_owner.BackendSettingsLookup[HOST] = value; } } public int Port @@ -63,29 +63,22 @@ namespace Duplicati.Datamodel.Backends get { int portn = 21; - int.TryParse(m_owner.Settings[PORT], out portn); + int.TryParse(m_owner.BackendSettingsLookup[PORT], out portn); return portn; } - set { m_owner.Settings[PORT] = value.ToString(); } + set { m_owner.BackendSettingsLookup[PORT] = value.ToString(); } } public string Folder { - get { return m_owner.Settings[FOLDER]; } - set { m_owner.Settings[FOLDER] = value; } + get { return m_owner.BackendSettingsLookup[FOLDER]; } + set { m_owner.BackendSettingsLookup[FOLDER] = value; } } public bool Passive { - get - { - bool res = false; - if (!bool.TryParse(m_owner.Settings[PASSIVE], out res)) - return true; - else - return res; - } - set { m_owner.Settings[PASSIVE] = value.ToString(); } + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.BackendSettingsLookup[PASSIVE], false); } + set { m_owner.BackendSettingsLookup[PASSIVE] = value.ToString(); } } #region IBackend Members diff --git a/Duplicati/GUI/Datamodel/Backends/File.cs b/Duplicati/GUI/Datamodel/Backends/File.cs index 3eb48efd3..7f59102de 100644 --- a/Duplicati/GUI/Datamodel/Backends/File.cs +++ b/Duplicati/GUI/Datamodel/Backends/File.cs @@ -27,8 +27,6 @@ namespace Duplicati.Datamodel.Backends public class File : IBackend { private const string DESTINATION_FOLDER = "Destination"; - private const string TIME_SEPARATOR = "TimeSeparator"; - private const string USERNAME = "Username"; private const string PASSWORD = "Password"; @@ -37,32 +35,26 @@ namespace Duplicati.Datamodel.Backends public File(Task owner) { m_owner = owner; - if (this.TimeSeparator == null) - this.TimeSeparator = "'"; + if (m_owner.Extensions.FileTimeSeperator == null) + m_owner.Extensions.FileTimeSeperator = "'"; } public string DestinationFolder { - get { return m_owner.Settings[DESTINATION_FOLDER]; } - set { m_owner.Settings[DESTINATION_FOLDER] = value; } - } - - public string TimeSeparator - { - get { return m_owner.Settings[TIME_SEPARATOR]; } - set { m_owner.Settings[TIME_SEPARATOR] = value; } + get { return m_owner.BackendSettingsLookup[DESTINATION_FOLDER]; } + set { m_owner.BackendSettingsLookup[DESTINATION_FOLDER] = value; } } public string Username { - get { return m_owner.Settings[USERNAME]; } - set { m_owner.Settings[USERNAME] = value; } + get { return m_owner.BackendSettingsLookup[USERNAME]; } + set { m_owner.BackendSettingsLookup[USERNAME] = value; } } public string Password { - get { return m_owner.Settings[PASSWORD]; } - set { m_owner.Settings[PASSWORD] = value; } + get { return m_owner.BackendSettingsLookup[PASSWORD]; } + set { m_owner.BackendSettingsLookup[PASSWORD] = value; } } #region IBackend Members @@ -77,7 +69,6 @@ namespace Duplicati.Datamodel.Backends public void GetOptions(Dictionary options) { - options["time-separator"] = this.TimeSeparator; if (!string.IsNullOrEmpty(this.Password)) options["ftp-password"] = this.Password; } diff --git a/Duplicati/GUI/Datamodel/Backends/S3.cs b/Duplicati/GUI/Datamodel/Backends/S3.cs index d86bb3d99..813ceff46 100644 --- a/Duplicati/GUI/Datamodel/Backends/S3.cs +++ b/Duplicati/GUI/Datamodel/Backends/S3.cs @@ -45,58 +45,44 @@ namespace Duplicati.Datamodel.Backends public string AccessID { - get { return m_owner.Settings[ACCESS_ID]; } - set { m_owner.Settings[ACCESS_ID] = value; } + get { return m_owner.BackendSettingsLookup[ACCESS_ID]; } + set { m_owner.BackendSettingsLookup[ACCESS_ID] = value; } } public string AccessKey { - get { return m_owner.Settings[ACCESS_KEY]; } - set { m_owner.Settings[ACCESS_KEY] = value; } + get { return m_owner.BackendSettingsLookup[ACCESS_KEY]; } + set { m_owner.BackendSettingsLookup[ACCESS_KEY] = value; } } public string BucketName { - get { return m_owner.Settings[BUCKET_NAME]; } - set { m_owner.Settings[BUCKET_NAME] = value; } + get { return m_owner.BackendSettingsLookup[BUCKET_NAME]; } + set { m_owner.BackendSettingsLookup[BUCKET_NAME] = value; } } public string ServerUrl { - get { return m_owner.Settings[SERVER_URL]; } - set { m_owner.Settings[SERVER_URL] = value; } + get { return m_owner.BackendSettingsLookup[SERVER_URL]; } + set { m_owner.BackendSettingsLookup[SERVER_URL] = value; } } public string Prefix { - get { return m_owner.Settings[PREFIX]; } - set { m_owner.Settings[PREFIX] = value; } + get { return m_owner.BackendSettingsLookup[PREFIX]; } + set { m_owner.BackendSettingsLookup[PREFIX] = value; } } public bool UseEuroBucket { - get - { - bool v; - if (bool.TryParse(m_owner.Settings[EUROBUCKET], out v)) - return v; - else - return false; - } - set { m_owner.Settings[EUROBUCKET] = value.ToString(); } + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.BackendSettingsLookup[EUROBUCKET], false); } + set { m_owner.BackendSettingsLookup[EUROBUCKET] = value.ToString(); } } public bool UseSubdomainStrategy { - get - { - bool v; - if (bool.TryParse(m_owner.Settings[SUBDOMAIN], out v)) - return v; - else - return false; - } - set { m_owner.Settings[SUBDOMAIN] = value.ToString(); } + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.BackendSettingsLookup[SUBDOMAIN], false); } + set { m_owner.BackendSettingsLookup[SUBDOMAIN] = value.ToString(); } } #region IBackend Members diff --git a/Duplicati/GUI/Datamodel/Backends/SSH.cs b/Duplicati/GUI/Datamodel/Backends/SSH.cs index 21e1e281e..eb881e98b 100644 --- a/Duplicati/GUI/Datamodel/Backends/SSH.cs +++ b/Duplicati/GUI/Datamodel/Backends/SSH.cs @@ -42,52 +42,45 @@ namespace Duplicati.Datamodel.Backends public string Username { - get { return m_owner.Settings[USERNAME]; } - set { m_owner.Settings[USERNAME] = value; } + get { return m_owner.BackendSettingsLookup[USERNAME]; } + set { m_owner.BackendSettingsLookup[USERNAME] = value; } } public string Password { - get { return m_owner.Settings[PASSWORD]; } - set { m_owner.Settings[PASSWORD] = value; } + get { return m_owner.BackendSettingsLookup[PASSWORD]; } + set { m_owner.BackendSettingsLookup[PASSWORD] = value; } } public string Host { - get { return m_owner.Settings[HOST]; } - set { m_owner.Settings[HOST] = value; } + get { return m_owner.BackendSettingsLookup[HOST]; } + set { m_owner.BackendSettingsLookup[HOST] = value; } } public int Port { get { - string port = m_owner.Settings[PORT]; + string port = m_owner.BackendSettingsLookup[PORT]; int portn; if (!int.TryParse(port, out portn)) portn = 22; return portn; } - set { m_owner.Settings[PORT] = value.ToString(); } + set { m_owner.BackendSettingsLookup[PORT] = value.ToString(); } } public string Folder { - get { return m_owner.Settings[FOLDER]; } - set { m_owner.Settings[FOLDER] = value; } + get { return m_owner.BackendSettingsLookup[FOLDER]; } + set { m_owner.BackendSettingsLookup[FOLDER] = value; } } public bool Passwordless { - get - { - bool v; - if (bool.TryParse(m_owner.Settings[PASWORDLESS], out v)) - return v; - else - return false; - } - set { m_owner.Settings[PASWORDLESS] = value.ToString(); } + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.BackendSettingsLookup[PASWORDLESS], false);} + set { m_owner.BackendSettingsLookup[PASWORDLESS] = value.ToString(); } } diff --git a/Duplicati/GUI/Datamodel/Backends/WEBDAV.cs b/Duplicati/GUI/Datamodel/Backends/WEBDAV.cs index 502e60a1a..ab5da85d9 100644 --- a/Duplicati/GUI/Datamodel/Backends/WEBDAV.cs +++ b/Duplicati/GUI/Datamodel/Backends/WEBDAV.cs @@ -1,3 +1,22 @@ +#region Disclaimer / License +// Copyright (C) 2009, 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; @@ -24,20 +43,20 @@ namespace Duplicati.Datamodel.Backends public string Username { - get { return m_owner.Settings[USERNAME]; } - set { m_owner.Settings[USERNAME] = value; } + get { return m_owner.BackendSettingsLookup[USERNAME]; } + set { m_owner.BackendSettingsLookup[USERNAME] = value; } } public string Password { - get { return m_owner.Settings[PASSWORD]; } - set { m_owner.Settings[PASSWORD] = value; } + get { return m_owner.BackendSettingsLookup[PASSWORD]; } + set { m_owner.BackendSettingsLookup[PASSWORD] = value; } } public string Host { - get { return m_owner.Settings[HOST]; } - set { m_owner.Settings[HOST] = value; } + get { return m_owner.BackendSettingsLookup[HOST]; } + set { m_owner.BackendSettingsLookup[HOST] = value; } } public int Port @@ -45,42 +64,28 @@ namespace Duplicati.Datamodel.Backends get { int portn = 80; - int.TryParse(m_owner.Settings[PORT], out portn); + int.TryParse(m_owner.BackendSettingsLookup[PORT], out portn); return portn; } - set { m_owner.Settings[PORT] = value.ToString(); } + set { m_owner.BackendSettingsLookup[PORT] = value.ToString(); } } public string Folder { - get { return m_owner.Settings[FOLDER]; } - set { m_owner.Settings[FOLDER] = value; } + get { return m_owner.BackendSettingsLookup[FOLDER]; } + set { m_owner.BackendSettingsLookup[FOLDER] = value; } } public bool IntegratedAuthentication { - get - { - bool res = false; - if (!bool.TryParse(m_owner.Settings[INTEGRATED_AUTHENTICATION], out res)) - return false; - else - return res; - } - set { m_owner.Settings[INTEGRATED_AUTHENTICATION] = value.ToString(); } + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.BackendSettingsLookup[INTEGRATED_AUTHENTICATION] , false); } + set { m_owner.BackendSettingsLookup[INTEGRATED_AUTHENTICATION] = value.ToString(); } } public bool ForceDigestAuthentication { - get - { - bool res = false; - if (!bool.TryParse(m_owner.Settings[FORCE_DIGEST_AUTHENTICATION], out res)) - return false; - else - return res; - } - set { m_owner.Settings[FORCE_DIGEST_AUTHENTICATION] = value.ToString(); } + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.BackendSettingsLookup[FORCE_DIGEST_AUTHENTICATION] , false);} + set { m_owner.BackendSettingsLookup[FORCE_DIGEST_AUTHENTICATION] = value.ToString(); } } #region IBackend Members diff --git a/Duplicati/GUI/Datamodel/Datamodel.csproj b/Duplicati/GUI/Datamodel/Datamodel.csproj index 2ec641695..674f14141 100644 --- a/Duplicati/GUI/Datamodel/Datamodel.csproj +++ b/Duplicati/GUI/Datamodel/Datamodel.csproj @@ -1,120 +1 @@ - - - - Local - 8.0.50727 - 2.0 - {B60D0993-B0C5-457A-90D9-DB6EEB33CE47} - Debug - AnyCPU - - - Datamodel - LightDatamodel.snk - JScript - Grid - IE50 - false - Library - Duplicati.Datamodel - OnBuildSuccess - - - - true - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - System - - - System.Data - - - System.XML - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {CAE8433B-F013-474E-B7FC-4DE0D5933AD1} - LightDatamodel - - - {DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65} - Duplicati.Library.Core - - - - \ No newline at end of file +Local8.0.507272.0{B60D0993-B0C5-457A-90D9-DB6EEB33CE47}DebugAnyCPUDatamodelLightDatamodel.snkJScriptGridIE50falseLibraryDuplicati.DatamodelOnBuildSuccesstruebin\Debug\false285212672falseDEBUG;TRACEtrue4096falsefalsefalsefalsefalse4fullpromptbin\Release\false285212672falseTRACEfalse4096falsetruefalsefalsefalse4nonepromptSystemSystem.DataSystem.XML{CAE8433B-F013-474E-B7FC-4DE0D5933AD1}LightDatamodel{DE3E5D4C-51AB-4E5E-BEE8-E636CEBFBA65}Duplicati.Library.Core \ No newline at end of file diff --git a/Duplicati/GUI/Datamodel/Duplicati.sqlite b/Duplicati/GUI/Datamodel/Duplicati.sqlite index 4296c957e1fad192adfa5b90361d29472017676e..e5d9e34af8a986fa317d1b9baafd4a47bcf35f4f 100644 GIT binary patch literal 18432 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCVBljw1-uLl42(!ZOh|0JOjZU423F?h zAT>hFznQ-=e`J0G;ev!l@n{H)h5+qDfRBrTfq|Qyfq{Vok|7xw7+4rVnVNxx_O_4O zFd71*Au#wtU^M>^zBn0m(P#+JD+ECKpOMj$fzgs)HVzYeT3r~~6=h`^y8=rX5*d;h zau`w>LKqSmiW#!uG?Oz!5Q8g&BSQ#-D}w?<2!kVo6N3+!tpr!3#Gt^S!NA3!0EJ2n zo(wJwAW=^SKd?@B23Lk41_g!yh9Cw{244n8h9HJW1_cIh23Lki1|1Z=!3@a^84Rfm zDGa4xC*d;7k0F%7hrtI!cPc{>Lm5LRLo!1u*bN|;M=*piC@^5x;mVN5kjzlTP{~lh zP{NSOkk63Ekj;?FP)U^TV1`VFbcQ^JM1~TEQidXiRFd@OgY|%18UQvSgD5+_8B!Ti z844KOz#)_a)`K3>*!>FA8N!gskc&5bI2n}S<~uT^F_bWX!W9&!*uxW~-kl+U0Tk1i z;R({`#Nf~14^BId41Q>_0n+UWj)xqEQic?UREA)NRB(tEfPIHcFBgL*11SG9F$ys- z3NbAoCOMNrZ!`-ru`BB8GPe36GB$dyLgzE%%joEeLD5OQ4DZK~NFXsH3KmkbNjSI| z$pa@K7ibX{0xo_)MH%)C5(Lgzso=~A@+J1fj&M&nI4fo|q%b5hR5BEU?ZVUpN~TR= z%d>TPsqF%(oDhtv|Xi}m( zj3JQ$R3hLi$w2`N%KxMNe+r9?QSGB4FhoOOH2)9Lh#PhGXb4at1VH(pi7|nJF@b3_ z6^t7-0xblZ0$A7;9UU246cG(qSj*3qp#t19%ws5q_MCCcu;XjA;?_1Co2*SQo)6fjMoo{g0MqM!BOQFd71M z3IS04KidDNQ(%u;Ga3SeECfLLpNYYTfx(AyHKk5#ieZB^%p4I7GiQc;hFpeRhC~L? zAZ;K+DMKn4;}Yk>-7r&Pz@>@0tz1-FKxSi(Nuy4>IWiP6q%)L)$KmrBN^p#0qw0a! zQUIQ$15FR5fOX-Us%Z&gXIGSzWb7zK1g{T6K0`VKgyg{&bPy#V&kXbkHfY8$g#mdE zjo9f0Cx%ppbcRfZJhF5Py|lv#SCfSjtHn{R|TCb zByN@wG)Ys$Pz;{K4Q2pEHE3=W*W?IlqJqS-6GIL|K0^}Dd1Tn+&FJ_)r6t~|{?QN^ z+93d{|3};ZLpu&fT|XKEOK=jQT?!ute+DO{HDjQ5U!xZ%#4E0#7A9o*Vi>%|3R=a7 z%Hzl96;!3v^$MohsLg1QXPPXy*cC%V8Jj&3o^fO-U;y>5KuZ}x%L^e(6Cn%ZV5@|P zQ6qrQ;ypQ^NGz35)0LuT2Or;D=r6ArY9t{CHgg`R~H@l*#DPyZ9qQ4GX4(G;@$&dqH z7Fh&eh=(jDh_646%@FGLzk?a_8HyN682lNEzzYnEz+)_^LlU_5N}}%31Gx*=bT8_x V9{WhWh(#x literal 13312 zcmWFz^vNtqRY=P(%1ta$FlJz3U}R))P*7lCVBlv!1$+z)3`|Huj7V&}OjeLa=5HW1 zyv)BL3=n4&kA}c#2nFXF2so?DzsRNbvOUzAGQV4O42vP70_3?oT2PBqcU=a?_NX=7HaB&QA4e|7K zMbQzIT9BGpf=y3qYIaIuWigTzFPCPcHZ!}pvNB_nEZAEiiN)E$sU;7}`;dDz0(IX|}`C$%IsMM=TQ-`~g8(GMIqyj+@1=B(`E!orL# zp@a4L^?-~I?m&B4pB?TuRe;EAfjiXK<4FL*5U^M?z z5O||nM?+wUhX5%5GcxXFVB9;zJu(uV-{QcEO)tyu^~yqEzg%`K3k4spylfP@T}3 zUi6`9sJ-5)sReGOIXP$};SjwbNytW`pHm6sT*tH$(C9sict}Q3YGO)2QD%NoW(jH- zaw<6%SLP+druk4u_PKNvl-vW{5ix)&t)rj>oe&64Eh#O)luXadFG>XkQ*lXRZb31s G0!;uf`#*&M diff --git a/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml b/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml index 15be0c3f5..6e724e34d 100644 --- a/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml +++ b/Duplicati/GUI/Datamodel/LightDataModel.Mapping.xml @@ -94,50 +94,6 @@ false false - - System.String - MaxUploadsize - MaxUploadsize - false - false - false - false - false - false - - - System.String - UploadBandwidth - UploadBandwidth - false - false - false - false - false - false - - - System.String - DownloadBandwidth - DownloadBandwidth - false - false - false - false - false - false - - - System.String - VolumeSize - VolumeSize - false - false - false - false - false - false - System.String FullAfter @@ -149,28 +105,6 @@ false false - - System.String - ThreadPriority - ThreadPriority - false - false - false - false - false - false - - - System.Boolean - AsyncTransfer - AsyncTransfer - false - false - false - false - false - false - System.Boolean GPGEncryption @@ -193,17 +127,6 @@ false false - - System.Boolean - IgnoreTimestamps - IgnoreTimestamps - false - false - false - false - false - false - false @@ -294,70 +217,6 @@ false - - TaskSetting - TaskSetting - ID - - - System.Int64 - ID - ID - true - true - false - false - false - true - - - System.Int64 - TaskID - TaskID - false - false - false - false - false - false - - - System.String - Name - Name - false - false - false - false - false - false - - - System.String - Value - Value - false - false - false - false - false - false - - - false - - - TaskSettingTask - TaskID - Task - OneToMany - Task - ID - TaskSettings - TaskSetting - - -
CommandQueueCommandQueue @@ -719,5 +578,197 @@
+ + BackendSetting + BackendSetting + ID + + + System.Int64 + ID + ID + true + true + false + false + false + true + + + System.Int64 + TaskID + TaskID + false + false + false + false + false + false + + + System.String + Name + Name + false + false + false + false + false + false + + + System.String + Value + Value + false + false + false + false + false + false + + + false + + + BackendSettingTask + TaskID + Task + OneToMany + Task + ID + BackendSettings + BackendSetting + + +
+ + TaskExtension + TaskExtension + ID + + + System.Int64 + ID + ID + true + true + false + false + false + true + + + System.Int64 + TaskID + TaskID + false + false + false + false + false + false + + + System.String + Name + Name + false + false + false + false + false + false + + + System.String + Value + Value + false + false + false + false + false + false + + + false + + + TaskExtensionTask + TaskID + Task + OneToMany + Task + ID + TaskExtensions + TaskExtension + + +
+ + TaskOverride + TaskOverride + ID + + + System.Int64 + ID + ID + true + true + false + false + false + true + + + System.Int64 + TaskID + TaskID + false + false + false + false + false + false + + + System.String + Name + Name + false + false + false + false + false + false + + + System.String + Value + Value + false + false + false + false + false + false + + + false + + + TaskOverrideTask + TaskID + Task + OneToMany + Task + ID + TaskOverrides + TaskOverride + + +
\ No newline at end of file diff --git a/Duplicati/GUI/Datamodel/LightDatamodel.dll b/Duplicati/GUI/Datamodel/LightDatamodel.dll index 5e4aecafdfd0589d3038cf27ab517c8384cc247d..04157b111fb072c7b3b8e0d6ff29cee7e3ba0131 100644 GIT binary patch literal 122880 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 diff --git a/Duplicati/GUI/Datamodel/Schedule.cs b/Duplicati/GUI/Datamodel/Schedule.cs index d7ee6fa3a..d334c772d 100644 --- a/Duplicati/GUI/Datamodel/Schedule.cs +++ b/Duplicati/GUI/Datamodel/Schedule.cs @@ -17,92 +17,92 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // #endregion -/// -/// This class was created by DataClassFileBuilder (LightDatamodel) -/// -/// Table -/// Duplicati.Datamodel -/// Schedule -/// -/// - -using System.Data.LightDatamodel; -using System.Data.LightDatamodel.DataClassAttributes; - -namespace Duplicati.Datamodel -{ - - [DatabaseTable("Schedule")] - public partial class Schedule : DataClassBase - { - -#region " private members " - - [AutoIncrement, PrimaryKey, Relation("TaskSchedule", typeof(Task), "ScheduleID", false), DatabaseField("ID")] - private System.Int64 m_ID = long.MinValue; - [DatabaseField("Name")] - private System.String m_Name = ""; - [DatabaseField("Path")] - private System.String m_Path = ""; - [DatabaseField("When")] - private System.DateTime m_When = new System.DateTime(1, 1, 1); - [DatabaseField("Repeat")] - private System.String m_Repeat = ""; - [DatabaseField("Weekdays")] - private System.String m_Weekdays = ""; -#endregion - -#region " properties " - - public System.Int64 ID - { - get{return m_ID;} - set{object oldvalue = m_ID;OnBeforeDataChange(this, "ID", oldvalue, value);m_ID = value;OnAfterDataChange(this, "ID", oldvalue, value);} - } - - public System.String Name - { - get{return m_Name;} - set{object oldvalue = m_Name;OnBeforeDataChange(this, "Name", oldvalue, value);m_Name = value;OnAfterDataChange(this, "Name", oldvalue, value);} - } - - public System.String Path - { - get{return m_Path;} - set{object oldvalue = m_Path;OnBeforeDataChange(this, "Path", oldvalue, value);m_Path = value;OnAfterDataChange(this, "Path", oldvalue, value);} - } - - public System.DateTime When - { - get{return m_When;} - set{object oldvalue = m_When;OnBeforeDataChange(this, "When", oldvalue, value);m_When = value;OnAfterDataChange(this, "When", oldvalue, value);} - } - - public System.String Repeat - { - get{return m_Repeat;} - set{object oldvalue = m_Repeat;OnBeforeDataChange(this, "Repeat", oldvalue, value);m_Repeat = value;OnAfterDataChange(this, "Repeat", oldvalue, value);} - } - - public System.String Weekdays - { - get{return m_Weekdays;} - set{object oldvalue = m_Weekdays;OnBeforeDataChange(this, "Weekdays", oldvalue, value);m_Weekdays = value;OnAfterDataChange(this, "Weekdays", oldvalue, value);} - } - -#endregion - -#region " referenced properties " - - [Affects(typeof(Task))] - public Task Task - { - get{ return ((DataFetcherWithRelations)m_dataparent).GetRelatedObject("TaskSchedule", this); } - set{ ((DataFetcherWithRelations)m_dataparent).SetRelatedObject("TaskSchedule", this, value); } - } - -#endregion - - } - +/// +/// This class was created by DataClassFileBuilder (LightDatamodel) +/// +/// Table +/// Duplicati.Datamodel +/// Schedule +/// +/// + +using System.Data.LightDatamodel; +using System.Data.LightDatamodel.DataClassAttributes; + +namespace Duplicati.Datamodel +{ + + [DatabaseTable("Schedule")] + public partial class Schedule : DataClassBase + { + +#region " private members " + + [AutoIncrement, PrimaryKey, Relation("TaskSchedule", typeof(Task), "ScheduleID", false), DatabaseField("ID")] + private System.Int64 m_ID = long.MinValue; + [DatabaseField("Name")] + private System.String m_Name = ""; + [DatabaseField("Path")] + private System.String m_Path = ""; + [DatabaseField("When")] + private System.DateTime m_When = new System.DateTime(1, 1, 1); + [DatabaseField("Repeat")] + private System.String m_Repeat = ""; + [DatabaseField("Weekdays")] + private System.String m_Weekdays = ""; +#endregion + +#region " properties " + + public System.Int64 ID + { + get{return m_ID;} + set{object oldvalue = m_ID;OnBeforeDataChange(this, "ID", oldvalue, value);m_ID = value;OnAfterDataChange(this, "ID", oldvalue, value);} + } + + public System.String Name + { + get{return m_Name;} + set{object oldvalue = m_Name;OnBeforeDataChange(this, "Name", oldvalue, value);m_Name = value;OnAfterDataChange(this, "Name", oldvalue, value);} + } + + public System.String Path + { + get{return m_Path;} + set{object oldvalue = m_Path;OnBeforeDataChange(this, "Path", oldvalue, value);m_Path = value;OnAfterDataChange(this, "Path", oldvalue, value);} + } + + public System.DateTime When + { + get{return m_When;} + set{object oldvalue = m_When;OnBeforeDataChange(this, "When", oldvalue, value);m_When = value;OnAfterDataChange(this, "When", oldvalue, value);} + } + + public System.String Repeat + { + get{return m_Repeat;} + set{object oldvalue = m_Repeat;OnBeforeDataChange(this, "Repeat", oldvalue, value);m_Repeat = value;OnAfterDataChange(this, "Repeat", oldvalue, value);} + } + + public System.String Weekdays + { + get{return m_Weekdays;} + set{object oldvalue = m_Weekdays;OnBeforeDataChange(this, "Weekdays", oldvalue, value);m_Weekdays = value;OnAfterDataChange(this, "Weekdays", oldvalue, value);} + } + +#endregion + +#region " referenced properties " + + [Affects(typeof(Task))] + public Task Task + { + get{ return ((DataFetcherWithRelations)m_dataparent).GetRelatedObject("TaskSchedule", this); } + set{ ((DataFetcherWithRelations)m_dataparent).SetRelatedObject("TaskSchedule", this, value); } + } + +#endregion + + } + } \ No newline at end of file diff --git a/Duplicati/GUI/Datamodel/SettingsHelper.cs b/Duplicati/GUI/Datamodel/SettingsHelper.cs index c1c5dd149..e027ef332 100644 --- a/Duplicati/GUI/Datamodel/SettingsHelper.cs +++ b/Duplicati/GUI/Datamodel/SettingsHelper.cs @@ -35,7 +35,6 @@ namespace Duplicati.Datamodel private PropertyInfo m_keyfield; private PropertyInfo m_valuefield; - private TranslatoryEnumerator m_enum; public SettingsHelper(IDataFetcher parent, IList col, string keyfield, string valuefield) : this(parent, col, typeof(TBase).GetProperty(keyfield), typeof(TBase).GetProperty(valuefield)) @@ -59,17 +58,36 @@ namespace Duplicati.Datamodel if (m_valuefield == null) throw new ArgumentNullException("valuefield"); - m_settings = new Dictionary(); - m_enum = new TranslatoryEnumerator(this, m_settings.GetEnumerator()); + parent.AfterDataConnection += new DataConnectionEventHandler(parent_AfterDataConnection); + } + + void parent_AfterDataConnection(object sender, DataActions action) + { + if (action != DataActions.Fetch) + m_settings = null; - foreach (TBase item in m_col) - if (!m_settings.ContainsKey((TKey)m_keyfield.GetValue(item, null))) - m_settings.Add((TKey)m_keyfield.GetValue(item, null), item); } public PropertyInfo KeyField { get { return m_keyfield; } } public PropertyInfo ValueField { get { return m_valuefield; } } + private Dictionary InternalSettings + { + get + { + if (m_settings == null) + { + m_settings = new Dictionary(); + + foreach (TBase item in m_col) + if (!m_settings.ContainsKey((TKey)m_keyfield.GetValue(item, null))) + m_settings.Add((TKey)m_keyfield.GetValue(item, null), item); + } + + return m_settings; + } + } + #region IDictionary Members public void Add(TKey key, TValue value) @@ -78,36 +96,36 @@ namespace Duplicati.Datamodel m_keyfield.SetValue(item, key, null); m_valuefield.SetValue(item, value, null); - m_settings.Add(key, item); + InternalSettings.Add(key, item); m_parent.Add(item); m_col.Add(item); } public bool ContainsKey(TKey key) { - return m_settings.ContainsKey(key); + return InternalSettings.ContainsKey(key); } public ICollection Keys { - get { return m_settings.Keys; } + get { return InternalSettings.Keys; } } public bool Remove(TKey key) { - if (m_settings.ContainsKey(key)) + if (InternalSettings.ContainsKey(key)) { - m_col.Remove(m_settings[key]); - m_parent.DeleteObject(m_settings[key]); + m_col.Remove(InternalSettings[key]); + m_parent.DeleteObject(InternalSettings[key]); } - return m_settings.Remove(key); + return InternalSettings.Remove(key); } public bool TryGetValue(TKey key, out TValue value) { TBase item; - if (m_settings.TryGetValue(key, out item)) + if (InternalSettings.TryGetValue(key, out item)) { value = (TValue)m_valuefield.GetValue(item, null); return true; @@ -125,7 +143,7 @@ namespace Duplicati.Datamodel get { List lst = new List(); - foreach (TBase item in m_settings.Values) + foreach (TBase item in InternalSettings.Values) lst.Add((TValue)m_valuefield.GetValue(item, null)); return lst; } @@ -135,27 +153,27 @@ namespace Duplicati.Datamodel { get { - if (m_settings.ContainsKey(key)) - return (TValue)m_valuefield.GetValue(m_settings[key], null); + if (InternalSettings.ContainsKey(key)) + return (TValue)m_valuefield.GetValue(InternalSettings[key], null); else return default(TValue); } set { - if (value == null && m_settings.ContainsKey(key)) + if (value == null && InternalSettings.ContainsKey(key)) { //Remove this.Remove(key); } - else if (value != null && !m_settings.ContainsKey(key)) + else if (value != null && !InternalSettings.ContainsKey(key)) { //Add this.Add(key, value); } - else if (value != null && m_settings.ContainsKey(key)) + else if (value != null && InternalSettings.ContainsKey(key)) { //Update - m_valuefield.SetValue(m_settings[key], value, null); + m_valuefield.SetValue(InternalSettings[key], value, null); } //else: It should be removed, but does not exist @@ -180,7 +198,7 @@ namespace Duplicati.Datamodel m_parent.DeleteObject(item); } - m_settings.Clear(); + InternalSettings.Clear(); } public bool Contains(KeyValuePair item) @@ -190,12 +208,12 @@ namespace Duplicati.Datamodel public void CopyTo(KeyValuePair[] array, int arrayIndex) { - ((ICollection>)(m_settings)).CopyTo(array, arrayIndex); + ((ICollection>)(InternalSettings)).CopyTo(array, arrayIndex); } public int Count { - get { return m_settings.Count; } + get { return InternalSettings.Count; } } public bool IsReadOnly @@ -214,7 +232,7 @@ namespace Duplicati.Datamodel public IEnumerator> GetEnumerator() { - return m_enum; + return new TranslatoryEnumerator(this, InternalSettings.GetEnumerator()); } #endregion @@ -223,7 +241,7 @@ namespace Duplicati.Datamodel System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { - return ((System.Collections.IEnumerable)m_settings).GetEnumerator(); + return ((System.Collections.IEnumerable)InternalSettings).GetEnumerator(); } #endregion @@ -281,5 +299,8 @@ namespace Duplicati.Datamodel #endregion } + + public IDataFetcher DataParent { get { return m_parent; } } + public IList Collection { get { return m_col; } } } } diff --git a/Duplicati/GUI/Datamodel/Task.Extension.cs b/Duplicati/GUI/Datamodel/Task.Extension.cs index c91667eb4..463e96c21 100644 --- a/Duplicati/GUI/Datamodel/Task.Extension.cs +++ b/Duplicati/GUI/Datamodel/Task.Extension.cs @@ -27,19 +27,52 @@ namespace Duplicati.Datamodel { public partial class Task { - private SettingsHelper m_settings; + public Task() + { + this.AfterDataCommit += new System.Data.LightDatamodel.DataConnectionEventHandler(Task_AfterDataCommit); + } - public IDictionary Settings + void Task_AfterDataCommit(object sender, System.Data.LightDatamodel.DataActions action) + { + if (action != System.Data.LightDatamodel.DataActions.Fetch) + { + m_backendSettings = null; + m_extensionSettings = null; + } + } + + private SettingsHelper m_backendSettings; + private SettingsHelper m_extensionSettings; + + public IDictionary BackendSettingsLookup { get { - if (m_settings == null) - m_settings = new SettingsHelper(this.DataParent, this.TaskSettings, "Name", "Value"); + //Extra check because the datamodel copies the collection between contexts... not nice + if (m_backendSettings == null || m_backendSettings.DataParent != this.DataParent || m_backendSettings.Collection != this.BackendSettings) + m_backendSettings = new SettingsHelper(this.DataParent, this.BackendSettings, "Name", "Value"); - return m_settings; + return m_backendSettings; } } + public IDictionary TaskExtensionsLookup + { + get + { + //Extra check because the datamodel copies the collection between contexts... not nice + if (m_extensionSettings == null || m_extensionSettings.DataParent != this.DataParent || m_extensionSettings.Collection != this.TaskExtensions) + m_extensionSettings = new SettingsHelper(this.DataParent, this.TaskExtensions, "Name", "Value"); + + return m_extensionSettings; + } + } + + public TaskExtensionWrapper Extensions + { + get { return new TaskExtensionWrapper(this); } + } + public Backends.IBackend Backend { get @@ -74,18 +107,6 @@ namespace Duplicati.Datamodel if (this.Filters.Count > 0) options["filter"] = this.EncodedFilter; ; - if (!string.IsNullOrEmpty(this.MaxUploadsize)) - options["totalsize"] = this.MaxUploadsize; - if (!string.IsNullOrEmpty(this.VolumeSize)) - options["volsize"] = this.VolumeSize; - if (!string.IsNullOrEmpty(this.DownloadBandwidth)) - options["max-download-pr-second"] = this.DownloadBandwidth; - if (!string.IsNullOrEmpty(this.UploadBandwidth)) - options["max-upload-pr-second"] = this.UploadBandwidth; - if (!string.IsNullOrEmpty(this.ThreadPriority)) - options["thread-priority"] = this.ThreadPriority; - if (this.AsyncTransfer) - options["asynchronous-upload"] = ""; if (this.GPGEncryption) { options["gpg-encryption"] = ""; @@ -101,8 +122,11 @@ namespace Duplicati.Datamodel if (!string.IsNullOrEmpty(set.TempPath)) options["tempdir"] = System.Environment.ExpandEnvironmentVariables(set.TempPath); - if (this.IgnoreTimestamps) - options["disable-filetime-check"] = ""; + this.Extensions.GetOptions(options); + + //Override everything set in the overrides + foreach (TaskOverride ov in this.TaskOverrides) + options[ov.Name] = ov.Value; } public string EncodedFilter @@ -124,7 +148,7 @@ namespace Duplicati.Datamodel this.SortedFilters = new TaskFilter[0]; List filters = new List(); - foreach(KeyValuePair f in Library.Core.FilenameFilter.DecodeFilter(value)) + foreach (KeyValuePair f in Library.Core.FilenameFilter.DecodeFilter(value)) { TaskFilter tf = this.DataParent.Add(); tf.Filter = f.Value; @@ -165,5 +189,120 @@ namespace Duplicati.Datamodel } } + + public class TaskExtensionWrapper + { + private const string MAX_UPLOAD_SIZE = "Max Upload Size"; + private const string UPLOAD_BANDWIDTH = "Upload Bandwidth"; + private const string DOWNLOAD_BANDWIDTH = "Download Bandwidth"; + private const string VOLUME_SIZE = "Volume Size"; + private const string THREAD_PRIORITY = "Thread Priority"; + private const string ASYNC_TRANSFER = "Async Transfer"; + private const string INCLUDE_SETUP = "Include Setup"; + private const string IGNORE_TIMESTAMPS = "Ignore Timestamps"; + private const string FILE_SIZE_LIMIT = "File Size Limit"; + private const string FILE_TIME_SEPERATOR = "File Time Seperator"; + private const string SHORT_FILENAMES = "Short Filenames"; + private const string FILENAME_PREFIX = "Filename Prefix"; + + private Task m_owner; + + public TaskExtensionWrapper(Task owner) + { + m_owner = owner; + } + + public string MaxUploadSize + { + get { return m_owner.TaskExtensionsLookup[MAX_UPLOAD_SIZE]; } + set { m_owner.TaskExtensionsLookup[MAX_UPLOAD_SIZE] = value; } + } + + public string UploadBandwidth + { + get { return m_owner.TaskExtensionsLookup[UPLOAD_BANDWIDTH]; } + set { m_owner.TaskExtensionsLookup[UPLOAD_BANDWIDTH] = value; } + } + + public string DownloadBandwidth + { + get { return m_owner.TaskExtensionsLookup[DOWNLOAD_BANDWIDTH]; } + set { m_owner.TaskExtensionsLookup[DOWNLOAD_BANDWIDTH] = value; } + } + + public string VolumeSize + { + get { return m_owner.TaskExtensionsLookup[VOLUME_SIZE]; } + set { m_owner.TaskExtensionsLookup[VOLUME_SIZE] = value; } + } + + public string ThreadPriority + { + get { return m_owner.TaskExtensionsLookup[THREAD_PRIORITY]; } + set { m_owner.TaskExtensionsLookup[THREAD_PRIORITY] = value; } + } + + public bool AsyncTransfer + { + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.TaskExtensionsLookup[ASYNC_TRANSFER], false); } + set { m_owner.TaskExtensionsLookup[ASYNC_TRANSFER] = value.ToString(); } + } + + public bool IncludeSetup + { + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.TaskExtensionsLookup[INCLUDE_SETUP], true); } + set { m_owner.TaskExtensionsLookup[INCLUDE_SETUP] = value.ToString(); } + } + + public bool IgnoreTimestamps + { + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.TaskExtensionsLookup[IGNORE_TIMESTAMPS], true); } + set { m_owner.TaskExtensionsLookup[IGNORE_TIMESTAMPS] = value.ToString(); } + } + + public string FileSizeLimit + { + get { return m_owner.TaskExtensionsLookup[FILE_SIZE_LIMIT]; } + set { m_owner.TaskExtensionsLookup[FILE_SIZE_LIMIT] = value; } + } + + public string FileTimeSeperator + { + get { return m_owner.TaskExtensionsLookup[FILE_TIME_SEPERATOR]; } + set { m_owner.TaskExtensionsLookup[FILE_TIME_SEPERATOR] = value; } + } + + public bool ShortFilenames + { + get { return Duplicati.Library.Core.Utility.ParseBool(m_owner.TaskExtensionsLookup[SHORT_FILENAMES], false); } + set { m_owner.TaskExtensionsLookup[SHORT_FILENAMES] = value.ToString(); } + } + + public string FilenamePrefix + { + get { return m_owner.TaskExtensionsLookup[FILENAME_PREFIX]; } + set { m_owner.TaskExtensionsLookup[FILENAME_PREFIX] = value; } + } + + public void GetOptions(Dictionary options) + { + if (!string.IsNullOrEmpty(this.MaxUploadSize)) + options["totalsize"] = this.MaxUploadSize; + if (!string.IsNullOrEmpty(this.VolumeSize)) + options["volsize"] = this.VolumeSize; + if (!string.IsNullOrEmpty(this.DownloadBandwidth)) + options["max-download-pr-second"] = this.DownloadBandwidth; + if (!string.IsNullOrEmpty(this.UploadBandwidth)) + options["max-upload-pr-second"] = this.UploadBandwidth; + if (!string.IsNullOrEmpty(this.ThreadPriority)) + options["thread-priority"] = this.ThreadPriority; + if (this.AsyncTransfer) + options["asynchronous-upload"] = ""; + if (this.IgnoreTimestamps) + options["disable-filetime-check"] = ""; + if (!string.IsNullOrEmpty(this.FileTimeSeperator)) + options["time-separator"] = this.FileTimeSeperator; + } } + } } diff --git a/Duplicati/GUI/Datamodel/Task.cs b/Duplicati/GUI/Datamodel/Task.cs index 829e3dd0d..39b84d32e 100644 --- a/Duplicati/GUI/Datamodel/Task.cs +++ b/Duplicati/GUI/Datamodel/Task.cs @@ -38,7 +38,7 @@ namespace Duplicati.Datamodel #region " private members " - [AutoIncrement, PrimaryKey, Relation("TaskSettingTask", typeof(TaskSetting), "TaskID", false), Relation("LogTask", typeof(Log), "TaskID", false), Relation("TaskFilterTask", typeof(TaskFilter), "TaskID", false), DatabaseField("ID")] + [AutoIncrement, PrimaryKey, Relation("LogTask", typeof(Log), "TaskID", false), Relation("TaskFilterTask", typeof(TaskFilter), "TaskID", false), Relation("BackendSettingTask", typeof(BackendSetting), "TaskID", false), Relation("TaskExtensionTask", typeof(TaskExtension), "TaskID", false), Relation("TaskOverrideTask", typeof(TaskOverride), "TaskID", false), DatabaseField("ID")] private System.Int64 m_ID = long.MinValue; [DatabaseField("Service")] private System.String m_Service = ""; @@ -54,26 +54,12 @@ namespace Duplicati.Datamodel private System.Int64 m_KeepFull = long.MinValue; [DatabaseField("KeepTime")] private System.String m_KeepTime = ""; - [DatabaseField("MaxUploadsize")] - private System.String m_MaxUploadsize = ""; - [DatabaseField("UploadBandwidth")] - private System.String m_UploadBandwidth = ""; - [DatabaseField("DownloadBandwidth")] - private System.String m_DownloadBandwidth = ""; - [DatabaseField("VolumeSize")] - private System.String m_VolumeSize = ""; [DatabaseField("FullAfter")] private System.String m_FullAfter = ""; - [DatabaseField("ThreadPriority")] - private System.String m_ThreadPriority = ""; - [DatabaseField("AsyncTransfer")] - private System.Boolean m_AsyncTransfer = false; [DatabaseField("GPGEncryption")] private System.Boolean m_GPGEncryption = false; [DatabaseField("IncludeSetup")] private System.Boolean m_IncludeSetup = false; - [DatabaseField("IgnoreTimestamps")] - private System.Boolean m_IgnoreTimestamps = false; #endregion #region " properties " @@ -126,48 +112,12 @@ namespace Duplicati.Datamodel set{object oldvalue = m_KeepTime;OnBeforeDataChange(this, "KeepTime", oldvalue, value);m_KeepTime = value;OnAfterDataChange(this, "KeepTime", oldvalue, value);} } - public System.String MaxUploadsize - { - get{return m_MaxUploadsize;} - set{object oldvalue = m_MaxUploadsize;OnBeforeDataChange(this, "MaxUploadsize", oldvalue, value);m_MaxUploadsize = value;OnAfterDataChange(this, "MaxUploadsize", oldvalue, value);} - } - - public System.String UploadBandwidth - { - get{return m_UploadBandwidth;} - set{object oldvalue = m_UploadBandwidth;OnBeforeDataChange(this, "UploadBandwidth", oldvalue, value);m_UploadBandwidth = value;OnAfterDataChange(this, "UploadBandwidth", oldvalue, value);} - } - - public System.String DownloadBandwidth - { - get{return m_DownloadBandwidth;} - set{object oldvalue = m_DownloadBandwidth;OnBeforeDataChange(this, "DownloadBandwidth", oldvalue, value);m_DownloadBandwidth = value;OnAfterDataChange(this, "DownloadBandwidth", oldvalue, value);} - } - - public System.String VolumeSize - { - get{return m_VolumeSize;} - set{object oldvalue = m_VolumeSize;OnBeforeDataChange(this, "VolumeSize", oldvalue, value);m_VolumeSize = value;OnAfterDataChange(this, "VolumeSize", oldvalue, value);} - } - public System.String FullAfter { get{return m_FullAfter;} set{object oldvalue = m_FullAfter;OnBeforeDataChange(this, "FullAfter", oldvalue, value);m_FullAfter = value;OnAfterDataChange(this, "FullAfter", oldvalue, value);} } - public System.String ThreadPriority - { - get{return m_ThreadPriority;} - set{object oldvalue = m_ThreadPriority;OnBeforeDataChange(this, "ThreadPriority", oldvalue, value);m_ThreadPriority = value;OnAfterDataChange(this, "ThreadPriority", oldvalue, value);} - } - - public System.Boolean AsyncTransfer - { - get{return m_AsyncTransfer;} - set{object oldvalue = m_AsyncTransfer;OnBeforeDataChange(this, "AsyncTransfer", oldvalue, value);m_AsyncTransfer = value;OnAfterDataChange(this, "AsyncTransfer", oldvalue, value);} - } - public System.Boolean GPGEncryption { get{return m_GPGEncryption;} @@ -180,12 +130,6 @@ namespace Duplicati.Datamodel set{object oldvalue = m_IncludeSetup;OnBeforeDataChange(this, "IncludeSetup", oldvalue, value);m_IncludeSetup = value;OnAfterDataChange(this, "IncludeSetup", oldvalue, value);} } - public System.Boolean IgnoreTimestamps - { - get{return m_IgnoreTimestamps;} - set{object oldvalue = m_IgnoreTimestamps;OnBeforeDataChange(this, "IgnoreTimestamps", oldvalue, value);m_IgnoreTimestamps = value;OnAfterDataChange(this, "IgnoreTimestamps", oldvalue, value);} - } - #endregion #region " referenced properties " @@ -197,15 +141,6 @@ namespace Duplicati.Datamodel set{ ((DataFetcherWithRelations)m_dataparent).SetRelatedObject("TaskSchedule", this, value); } } - [Affects(typeof(TaskSetting))] - public System.Collections.Generic.IList TaskSettings - { - get - { - return ((DataFetcherWithRelations)m_dataparent).GetRelatedObjects("TaskSettingTask", this); - } - } - [Affects(typeof(Log))] public System.Collections.Generic.IList Logs { @@ -224,6 +159,33 @@ namespace Duplicati.Datamodel } } + [Affects(typeof(BackendSetting))] + public System.Collections.Generic.IList BackendSettings + { + get + { + return ((DataFetcherWithRelations)m_dataparent).GetRelatedObjects("BackendSettingTask", this); + } + } + + [Affects(typeof(TaskExtension))] + public System.Collections.Generic.IList TaskExtensions + { + get + { + return ((DataFetcherWithRelations)m_dataparent).GetRelatedObjects("TaskExtensionTask", this); + } + } + + [Affects(typeof(TaskOverride))] + public System.Collections.Generic.IList TaskOverrides + { + get + { + return ((DataFetcherWithRelations)m_dataparent).GetRelatedObjects("TaskOverrideTask", this); + } + } + #endregion } diff --git a/Duplicati/GUI/Datamodel/TaskExtension.cs b/Duplicati/GUI/Datamodel/TaskExtension.cs new file mode 100644 index 000000000..0df11d696 --- /dev/null +++ b/Duplicati/GUI/Datamodel/TaskExtension.cs @@ -0,0 +1,92 @@ +#region Disclaimer / License +// Copyright (C) 2009, 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 +/// +/// This class was created by DataClassFileBuilder (LightDatamodel) +/// +/// Table +/// Duplicati.Datamodel +/// TaskExtension +/// +/// + +using System.Data.LightDatamodel; +using System.Data.LightDatamodel.DataClassAttributes; + +namespace Duplicati.Datamodel +{ + + [DatabaseTable("TaskExtension")] + public partial class TaskExtension : DataClassBase + { + +#region " private members " + + [AutoIncrement, PrimaryKey, DatabaseField("ID")] + private System.Int64 m_ID = long.MinValue; + [Relation("TaskExtensionTask", typeof(Task), "ID"), DatabaseField("TaskID")] + private System.Int64 m_TaskID = long.MinValue; + [DatabaseField("Name")] + private System.String m_Name = ""; + [DatabaseField("Value")] + private System.String m_Value = ""; +#endregion + +#region " properties " + + public System.Int64 ID + { + get{return m_ID;} + set{object oldvalue = m_ID;OnBeforeDataChange(this, "ID", oldvalue, value);m_ID = value;OnAfterDataChange(this, "ID", oldvalue, value);} + } + + public System.Int64 TaskID + { + get{return m_TaskID;} + set{object oldvalue = m_TaskID;OnBeforeDataChange(this, "TaskID", oldvalue, value);m_TaskID = value;OnAfterDataChange(this, "TaskID", oldvalue, value);} + } + + public System.String Name + { + get{return m_Name;} + set{object oldvalue = m_Name;OnBeforeDataChange(this, "Name", oldvalue, value);m_Name = value;OnAfterDataChange(this, "Name", oldvalue, value);} + } + + public System.String Value + { + get{return m_Value;} + set{object oldvalue = m_Value;OnBeforeDataChange(this, "Value", oldvalue, value);m_Value = value;OnAfterDataChange(this, "Value", oldvalue, value);} + } + +#endregion + +#region " referenced properties " + + [Affects(typeof(Task))] + public Task Task + { + get{ return ((DataFetcherWithRelations)m_dataparent).GetRelatedObject("TaskExtensionTask", this); } + set{ ((DataFetcherWithRelations)m_dataparent).SetRelatedObject("TaskExtensionTask", this, value); } + } + +#endregion + + } + +} \ No newline at end of file diff --git a/Duplicati/GUI/Datamodel/TaskSetting.cs b/Duplicati/GUI/Datamodel/TaskOverride.cs similarity index 90% rename from Duplicati/GUI/Datamodel/TaskSetting.cs rename to Duplicati/GUI/Datamodel/TaskOverride.cs index d86cee0fb..0669d9b1d 100644 --- a/Duplicati/GUI/Datamodel/TaskSetting.cs +++ b/Duplicati/GUI/Datamodel/TaskOverride.cs @@ -22,7 +22,7 @@ /// /// Table /// Duplicati.Datamodel -/// TaskSetting +/// TaskOverride /// /// @@ -32,15 +32,15 @@ using System.Data.LightDatamodel.DataClassAttributes; namespace Duplicati.Datamodel { - [DatabaseTable("TaskSetting")] - public partial class TaskSetting : DataClassBase + [DatabaseTable("TaskOverride")] + public partial class TaskOverride : DataClassBase { #region " private members " [AutoIncrement, PrimaryKey, DatabaseField("ID")] private System.Int64 m_ID = long.MinValue; - [Relation("TaskSettingTask", typeof(Task), "ID"), DatabaseField("TaskID")] + [Relation("TaskOverrideTask", typeof(Task), "ID"), DatabaseField("TaskID")] private System.Int64 m_TaskID = long.MinValue; [DatabaseField("Name")] private System.String m_Name = ""; @@ -81,8 +81,8 @@ namespace Duplicati.Datamodel [Affects(typeof(Task))] public Task Task { - get{ return ((DataFetcherWithRelations)m_dataparent).GetRelatedObject("TaskSettingTask", this); } - set{ ((DataFetcherWithRelations)m_dataparent).SetRelatedObject("TaskSettingTask", this, value); } + get{ return ((DataFetcherWithRelations)m_dataparent).GetRelatedObject("TaskOverrideTask", this); } + set{ ((DataFetcherWithRelations)m_dataparent).SetRelatedObject("TaskOverrideTask", this, value); } } #endregion diff --git a/Duplicati/GUI/Duplicati.csproj b/Duplicati/GUI/Duplicati.csproj index b0892966f..03cbcee59 100644 --- a/Duplicati/GUI/Duplicati.csproj +++ b/Duplicati/GUI/Duplicati.csproj @@ -195,6 +195,18 @@ FinishedAdd.cs + + UserControl + + + GeneratedFilenameOptions.cs + + + UserControl + + + SettingOverrides.cs + UserControl @@ -590,6 +602,17 @@ + + + + Designer + GeneratedFilenameOptions.cs + + + Designer + SettingOverrides.cs + + diff --git a/Duplicati/GUI/Service controls/Backends/FileSettings.Designer.cs b/Duplicati/GUI/Service controls/Backends/FileSettings.Designer.cs index eaebe7255..3c4fb652a 100644 --- a/Duplicati/GUI/Service controls/Backends/FileSettings.Designer.cs +++ b/Duplicati/GUI/Service controls/Backends/FileSettings.Designer.cs @@ -48,13 +48,9 @@ namespace Duplicati.GUI.Service_controls private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); - this.panel1 = new System.Windows.Forms.Panel(); - this.TimeSeperator = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); this.BrowseTargetFolder = new System.Windows.Forms.Button(); this.DestinationFolder = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); - this.panel1.SuspendLayout(); this.SuspendLayout(); // // button1 @@ -67,32 +63,6 @@ namespace Duplicati.GUI.Service_controls this.button1.Text = "Advanced <<<"; this.button1.UseVisualStyleBackColor = true; // - // panel1 - // - this.panel1.Controls.Add(this.TimeSeperator); - this.panel1.Controls.Add(this.label2); - this.panel1.Location = new System.Drawing.Point(0, 24); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(264, 32); - this.panel1.TabIndex = 3; - // - // TimeSeperator - // - this.TimeSeperator.Location = new System.Drawing.Point(112, 8); - this.TimeSeperator.Name = "TimeSeperator"; - this.TimeSeperator.Size = new System.Drawing.Size(24, 20); - this.TimeSeperator.TabIndex = 2; - this.TimeSeperator.TextChanged += new System.EventHandler(this.TimeSeperator_TextChanged); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(8, 8); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(77, 13); - this.label2.TabIndex = 0; - this.label2.Text = "Time seperator"; - // // BrowseTargetFolder // this.BrowseTargetFolder.Location = new System.Drawing.Point(240, 0); @@ -125,14 +95,11 @@ namespace Duplicati.GUI.Service_controls this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.BrowseTargetFolder); - this.Controls.Add(this.panel1); this.Controls.Add(this.DestinationFolder); this.Controls.Add(this.button1); this.Controls.Add(this.label1); this.Name = "FileSettings"; this.Size = new System.Drawing.Size(268, 96); - this.panel1.ResumeLayout(false); - this.panel1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); @@ -141,9 +108,6 @@ namespace Duplicati.GUI.Service_controls #endregion private System.Windows.Forms.Button button1; - private System.Windows.Forms.Panel panel1; - private System.Windows.Forms.TextBox TimeSeperator; - private System.Windows.Forms.Label label2; private System.Windows.Forms.Button BrowseTargetFolder; private System.Windows.Forms.TextBox DestinationFolder; private System.Windows.Forms.Label label1; diff --git a/Duplicati/GUI/Service controls/Backends/FileSettings.cs b/Duplicati/GUI/Service controls/Backends/FileSettings.cs index 8082cac70..ef799d100 100644 --- a/Duplicati/GUI/Service controls/Backends/FileSettings.cs +++ b/Duplicati/GUI/Service controls/Backends/FileSettings.cs @@ -46,7 +46,6 @@ namespace Duplicati.GUI.Service_controls m_file = file; DestinationFolder.Text = m_file.DestinationFolder; - TimeSeperator.Text = m_file.TimeSeparator; } finally { @@ -62,14 +61,6 @@ namespace Duplicati.GUI.Service_controls m_file.DestinationFolder = DestinationFolder.Text; } - private void TimeSeperator_TextChanged(object sender, EventArgs e) - { - if (m_isUpdating || m_file == null) - return; - - m_file.TimeSeparator = TimeSeperator.Text; - } - private void BrowseTargetFolder_Click(object sender, EventArgs e) { FolderBrowserDialog dlg = new FolderBrowserDialog(); diff --git a/Duplicati/GUI/Service controls/ScheduleSettings.cs b/Duplicati/GUI/Service controls/ScheduleSettings.cs index dc7e26f77..5957336db 100644 --- a/Duplicati/GUI/Service controls/ScheduleSettings.cs +++ b/Duplicati/GUI/Service controls/ScheduleSettings.cs @@ -92,10 +92,10 @@ namespace Duplicati.GUI.Service_controls ForceFullBackup.Checked = !string.IsNullOrEmpty(m_schedule.Task.FullAfter); ForceFullBackupTimespan.Text = m_schedule.Task.FullAfter; - MaxUploaded.Text = m_schedule.Task.MaxUploadsize; - VolumeSize.Text = m_schedule.Task.VolumeSize; - DownloadBandwidth.Text = m_schedule.Task.DownloadBandwidth; - UploadBandwidth.Text =m_schedule.Task.UploadBandwidth; + MaxUploaded.Text = m_schedule.Task.Extensions.MaxUploadSize; + VolumeSize.Text = m_schedule.Task.Extensions.VolumeSize; + DownloadBandwidth.Text = m_schedule.Task.Extensions.DownloadBandwidth; + UploadBandwidth.Text =m_schedule.Task.Extensions.UploadBandwidth; } finally { @@ -234,7 +234,7 @@ namespace Duplicati.GUI.Service_controls try { Library.Core.Sizeparser.ParseSize(MaxUploaded.Text); - m_schedule.Task.MaxUploadsize = MaxUploaded.Text; + m_schedule.Task.Extensions.MaxUploadSize = MaxUploaded.Text; errorProvider.SetError(MaxUploaded, ""); } catch (Exception ex) @@ -251,7 +251,7 @@ namespace Duplicati.GUI.Service_controls try { Library.Core.Sizeparser.ParseSize(VolumeSize.Text); - m_schedule.Task.VolumeSize = VolumeSize.Text; + m_schedule.Task.Extensions.VolumeSize = VolumeSize.Text; errorProvider.SetError(VolumeSize, ""); } catch (Exception ex) @@ -268,7 +268,7 @@ namespace Duplicati.GUI.Service_controls try { Library.Core.Sizeparser.ParseSize(UploadBandwidth.Text); - m_schedule.Task.UploadBandwidth = UploadBandwidth.Text; + m_schedule.Task.Extensions.UploadBandwidth = UploadBandwidth.Text; errorProvider.SetError(UploadBandwidth, ""); } catch (Exception ex) @@ -286,7 +286,7 @@ namespace Duplicati.GUI.Service_controls try { Library.Core.Sizeparser.ParseSize(DownloadBandwidth.Text); - m_schedule.Task.DownloadBandwidth = DownloadBandwidth.Text; + m_schedule.Task.Extensions.DownloadBandwidth = DownloadBandwidth.Text; errorProvider.SetError(DownloadBandwidth, ""); } catch (Exception ex) diff --git a/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.Designer.cs b/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.Designer.cs index deed32b6a..8517e16a6 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.Designer.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.Designer.cs @@ -33,12 +33,14 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup this.ThrottleOptions = new System.Windows.Forms.CheckBox(); this.EditFilters = new System.Windows.Forms.CheckBox(); this.IncludeDuplicatiSetup = new System.Windows.Forms.CheckBox(); + this.EditVolumeFilenames = new System.Windows.Forms.CheckBox(); + this.EditOverrides = new System.Windows.Forms.CheckBox(); this.SuspendLayout(); // // SelectWhen // this.SelectWhen.AutoSize = true; - this.SelectWhen.Location = new System.Drawing.Point(32, 32); + this.SelectWhen.Location = new System.Drawing.Point(32, 8); this.SelectWhen.Name = "SelectWhen"; this.SelectWhen.Size = new System.Drawing.Size(265, 17); this.SelectWhen.TabIndex = 0; @@ -48,7 +50,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // SelectIncremental // this.SelectIncremental.AutoSize = true; - this.SelectIncremental.Location = new System.Drawing.Point(32, 64); + this.SelectIncremental.Location = new System.Drawing.Point(32, 40); this.SelectIncremental.Name = "SelectIncremental"; this.SelectIncremental.Size = new System.Drawing.Size(439, 17); this.SelectIncremental.TabIndex = 1; @@ -59,7 +61,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // ThrottleOptions // this.ThrottleOptions.AutoSize = true; - this.ThrottleOptions.Location = new System.Drawing.Point(32, 96); + this.ThrottleOptions.Location = new System.Drawing.Point(32, 72); this.ThrottleOptions.Name = "ThrottleOptions"; this.ThrottleOptions.Size = new System.Drawing.Size(329, 17); this.ThrottleOptions.TabIndex = 3; @@ -69,7 +71,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // EditFilters // this.EditFilters.AutoSize = true; - this.EditFilters.Location = new System.Drawing.Point(32, 128); + this.EditFilters.Location = new System.Drawing.Point(32, 104); this.EditFilters.Name = "EditFilters"; this.EditFilters.Size = new System.Drawing.Size(316, 17); this.EditFilters.TabIndex = 4; @@ -81,17 +83,39 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup this.IncludeDuplicatiSetup.AutoSize = true; this.IncludeDuplicatiSetup.Checked = true; this.IncludeDuplicatiSetup.CheckState = System.Windows.Forms.CheckState.Checked; - this.IncludeDuplicatiSetup.Location = new System.Drawing.Point(32, 160); + this.IncludeDuplicatiSetup.Location = new System.Drawing.Point(32, 200); this.IncludeDuplicatiSetup.Name = "IncludeDuplicatiSetup"; this.IncludeDuplicatiSetup.Size = new System.Drawing.Size(256, 17); this.IncludeDuplicatiSetup.TabIndex = 5; this.IncludeDuplicatiSetup.Text = "Include the current Duplicati setup in the backup"; this.IncludeDuplicatiSetup.UseVisualStyleBackColor = true; // + // EditVolumeFilenames + // + this.EditVolumeFilenames.AutoSize = true; + this.EditVolumeFilenames.Location = new System.Drawing.Point(32, 136); + this.EditVolumeFilenames.Name = "EditVolumeFilenames"; + this.EditVolumeFilenames.Size = new System.Drawing.Size(369, 17); + this.EditVolumeFilenames.TabIndex = 6; + this.EditVolumeFilenames.Text = "Change the generated names for files stored on the backend (advanced)"; + this.EditVolumeFilenames.UseVisualStyleBackColor = true; + // + // EditOverrides + // + this.EditOverrides.AutoSize = true; + this.EditOverrides.Location = new System.Drawing.Point(32, 168); + this.EditOverrides.Name = "EditOverrides"; + this.EditOverrides.Size = new System.Drawing.Size(228, 17); + this.EditOverrides.TabIndex = 7; + this.EditOverrides.Text = "Manually override settings (very advanced)"; + this.EditOverrides.UseVisualStyleBackColor = true; + // // AdvancedOptions // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.EditOverrides); + this.Controls.Add(this.EditVolumeFilenames); this.Controls.Add(this.IncludeDuplicatiSetup); this.Controls.Add(this.EditFilters); this.Controls.Add(this.ThrottleOptions); @@ -111,5 +135,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup private System.Windows.Forms.CheckBox ThrottleOptions; private System.Windows.Forms.CheckBox EditFilters; private System.Windows.Forms.CheckBox IncludeDuplicatiSetup; + private System.Windows.Forms.CheckBox EditVolumeFilenames; + private System.Windows.Forms.CheckBox EditOverrides; } } diff --git a/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.cs b/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.cs index 4aed65ff2..0fb8aefcf 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/AdvancedOptions.cs @@ -45,7 +45,10 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup { m_wrapper = new WizardSettingsWrapper(m_settings); if (!m_valuesAutoLoaded) + { IncludeDuplicatiSetup.Checked = m_wrapper.IncludeSetup; + EditOverrides.Checked = m_wrapper.Overrides.Count > 0; + } } void AdvancedOptions_PageLeave(object sender, PageChangedArgs args) @@ -54,6 +57,8 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup m_settings["Advanced:Incremental"] = SelectIncremental.Checked; m_settings["Advanced:Throttle"] = ThrottleOptions.Checked; m_settings["Advanced:Filters"] = EditFilters.Checked; + m_settings["Advanced:Filenames"] = EditVolumeFilenames.Checked; + m_settings["Advanced:Overrides"] = EditOverrides.Checked; if (args.Direction == PageChangedDirection.Back) return; @@ -68,6 +73,10 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup args.NextPage = new Wizard_pages.Add_backup.ThrottleOptions(); else if (EditFilters.Checked) args.NextPage = new Wizard_pages.Add_backup.EditFilters(); + else if (EditVolumeFilenames.Checked) + args.NextPage = new Wizard_pages.Add_backup.GeneratedFilenameOptions(); + else if (EditOverrides.Checked) + args.NextPage = new Wizard_pages.Add_backup.SettingOverrides(); else args.NextPage = new Wizard_pages.Add_backup.FinishedAdd(); } diff --git a/Duplicati/GUI/Wizard pages/Add backup/EditFilters.cs b/Duplicati/GUI/Wizard pages/Add backup/EditFilters.cs index 44cf4e5d4..d83fd3057 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/EditFilters.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/EditFilters.cs @@ -48,7 +48,12 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup m_wrapper.EncodedFilters = filterEditor1.Filter; - args.NextPage = new Wizard_pages.Add_backup.FinishedAdd(); + if ((bool)m_settings["Advanced:Filenames"]) + args.NextPage = new Wizard_pages.Add_backup.GeneratedFilenameOptions(); + else if ((bool)m_settings["Advanced:Overrides"]) + args.NextPage = new Wizard_pages.Add_backup.SettingOverrides(); + else + args.NextPage = new Wizard_pages.Add_backup.FinishedAdd(); } void FilterEditor_PageEnter(object sender, System.Windows.Forms.Wizard.PageChangedArgs args) diff --git a/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.Designer.cs b/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.Designer.cs new file mode 100644 index 000000000..9375177e4 --- /dev/null +++ b/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.Designer.cs @@ -0,0 +1,111 @@ +namespace Duplicati.GUI.Wizard_pages.Add_backup +{ + partial class GeneratedFilenameOptions + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.FilePrefixEnabled = new System.Windows.Forms.CheckBox(); + this.UseShortFilenames = new System.Windows.Forms.CheckBox(); + this.FilePrefix = new System.Windows.Forms.TextBox(); + this.FileTimeSeperator = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(40, 24); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(92, 13); + this.label1.TabIndex = 0; + this.label1.Text = "File time seperator"; + // + // FilePrefixEnabled + // + this.FilePrefixEnabled.AutoSize = true; + this.FilePrefixEnabled.Location = new System.Drawing.Point(24, 56); + this.FilePrefixEnabled.Name = "FilePrefixEnabled"; + this.FilePrefixEnabled.Size = new System.Drawing.Size(133, 17); + this.FilePrefixEnabled.TabIndex = 1; + this.FilePrefixEnabled.Text = "Change filename prefix"; + this.FilePrefixEnabled.UseVisualStyleBackColor = true; + this.FilePrefixEnabled.CheckedChanged += new System.EventHandler(this.FilePrefixEnabled_CheckedChanged); + // + // UseShortFilenames + // + this.UseShortFilenames.AutoSize = true; + this.UseShortFilenames.Location = new System.Drawing.Point(24, 88); + this.UseShortFilenames.Name = "UseShortFilenames"; + this.UseShortFilenames.Size = new System.Drawing.Size(118, 17); + this.UseShortFilenames.TabIndex = 2; + this.UseShortFilenames.Text = "Use short filenames"; + this.UseShortFilenames.UseVisualStyleBackColor = true; + // + // FilePrefix + // + this.FilePrefix.Enabled = false; + this.FilePrefix.Location = new System.Drawing.Point(168, 56); + this.FilePrefix.Name = "FilePrefix"; + this.FilePrefix.Size = new System.Drawing.Size(128, 20); + this.FilePrefix.TabIndex = 3; + // + // FileTimeSeperator + // + this.FileTimeSeperator.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FileTimeSeperator.FormattingEnabled = true; + this.FileTimeSeperator.Items.AddRange(new object[] { + "\'", + ":", + "_"}); + this.FileTimeSeperator.Location = new System.Drawing.Point(168, 24); + this.FileTimeSeperator.Name = "FileTimeSeperator"; + this.FileTimeSeperator.Size = new System.Drawing.Size(56, 22); + this.FileTimeSeperator.TabIndex = 4; + // + // GeneratedFilenameOptions + // + this.Controls.Add(this.FileTimeSeperator); + this.Controls.Add(this.FilePrefix); + this.Controls.Add(this.UseShortFilenames); + this.Controls.Add(this.FilePrefixEnabled); + this.Controls.Add(this.label1); + this.Name = "GeneratedFilenameOptions"; + this.Size = new System.Drawing.Size(506, 242); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.CheckBox FilePrefixEnabled; + private System.Windows.Forms.CheckBox UseShortFilenames; + private System.Windows.Forms.TextBox FilePrefix; + private System.Windows.Forms.ComboBox FileTimeSeperator; + } +} diff --git a/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.cs b/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.cs new file mode 100644 index 000000000..8fdf5f5a1 --- /dev/null +++ b/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.cs @@ -0,0 +1,79 @@ +#region Disclaimer / License +// Copyright (C) 2009, 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.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Duplicati.GUI.Wizard_pages.Add_backup +{ + public partial class GeneratedFilenameOptions : System.Windows.Forms.Wizard.WizardControl + { + private WizardSettingsWrapper m_wrapper; + + public GeneratedFilenameOptions() + : base("Generated filenames", "On this page you can control how filenames are generated. This can be used if the remote server does not support the default filenames.") + { + InitializeComponent(); + + base.PageEnter += new System.Windows.Forms.Wizard.PageChangeHandler(GeneratedFilenameOptions_PageEnter); + base.PageLeave += new System.Windows.Forms.Wizard.PageChangeHandler(GeneratedFilenameOptions_PageLeave); + } + + void GeneratedFilenameOptions_PageLeave(object sender, System.Windows.Forms.Wizard.PageChangedArgs args) + { + if (args.Direction == System.Windows.Forms.Wizard.PageChangedDirection.Back) + return; + + m_wrapper.FileTimeSeperator = FileTimeSeperator.Text; + m_wrapper.FilePrefix = FilePrefixEnabled.Checked ? "" : FilePrefix.Text; + m_wrapper.ShortFilenames = UseShortFilenames.Checked; + + if ((bool)m_settings["Advanced:Overrides"]) + args.NextPage = new Wizard_pages.Add_backup.SettingOverrides(); + else + args.NextPage = new Wizard_pages.Add_backup.FinishedAdd(); + + } + + void GeneratedFilenameOptions_PageEnter(object sender, System.Windows.Forms.Wizard.PageChangedArgs args) + { + m_wrapper = new WizardSettingsWrapper(m_settings); + if (!m_valuesAutoLoaded) + { + FileTimeSeperator.Text = m_wrapper.FileTimeSeperator; + if (FileTimeSeperator.Text == "") + FileTimeSeperator.Text = ":"; + FilePrefixEnabled.Checked = !string.IsNullOrEmpty(m_wrapper.FilePrefix); + FilePrefix.Text = m_wrapper.FilePrefix; + UseShortFilenames.Checked = m_wrapper.ShortFilenames; + } + } + + private void FilePrefixEnabled_CheckedChanged(object sender, EventArgs e) + { + FilePrefix.Enabled = FilePrefixEnabled.Checked; + } + } +} + diff --git a/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.resx b/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.resx new file mode 100644 index 000000000..ff31a6db5 --- /dev/null +++ b/Duplicati/GUI/Wizard pages/Add backup/GeneratedFilenameOptions.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Duplicati/GUI/Wizard pages/Add backup/IncrementalSettings.cs b/Duplicati/GUI/Wizard pages/Add backup/IncrementalSettings.cs index 16aa534c3..0f073805d 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/IncrementalSettings.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/IncrementalSettings.cs @@ -131,6 +131,10 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup args.NextPage = new Wizard_pages.Add_backup.ThrottleOptions(); else if ((bool)m_settings["Advanced:Filters"]) args.NextPage = new Wizard_pages.Add_backup.EditFilters(); + else if ((bool)m_settings["Advanced:Filenames"]) + args.NextPage = new Wizard_pages.Add_backup.GeneratedFilenameOptions(); + else if ((bool)m_settings["Advanced:Overrides"]) + args.NextPage = new Wizard_pages.Add_backup.SettingOverrides(); else args.NextPage = new Wizard_pages.Add_backup.FinishedAdd(); } diff --git a/Duplicati/GUI/Wizard pages/Add backup/SelectFiles.cs b/Duplicati/GUI/Wizard pages/Add backup/SelectFiles.cs index aaaeec4fc..640e7eeed 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/SelectFiles.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/SelectFiles.cs @@ -89,7 +89,9 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup m_owner.Cancelled -= new CancelEventHandler(m_owner_Cancelled); m_settings["Files:Sizes"] = m_sizes; m_settings["Files:WarnedFilters"] = m_warnedFiltersChanged; - m_calculator.ClearQueue(true); + + if (m_calculator != null) + m_calculator.ClearQueue(true); if (args.Direction == PageChangedDirection.Back) return; diff --git a/Duplicati/GUI/Wizard pages/Add backup/SelectWhen.cs b/Duplicati/GUI/Wizard pages/Add backup/SelectWhen.cs index c1988861f..98cd5c318 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/SelectWhen.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/SelectWhen.cs @@ -105,6 +105,10 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup args.NextPage = new Wizard_pages.Add_backup.ThrottleOptions(); else if ((bool)m_settings["Advanced:Filters"]) args.NextPage = new Wizard_pages.Add_backup.EditFilters(); + else if ((bool)m_settings["Advanced:Filenames"]) + args.NextPage = new Wizard_pages.Add_backup.GeneratedFilenameOptions(); + else if ((bool)m_settings["Advanced:Overrides"]) + args.NextPage = new Wizard_pages.Add_backup.SettingOverrides(); else args.NextPage = new Wizard_pages.Add_backup.FinishedAdd(); } diff --git a/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.Designer.cs b/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.Designer.cs new file mode 100644 index 000000000..eb3abc8c5 --- /dev/null +++ b/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.Designer.cs @@ -0,0 +1,183 @@ +namespace Duplicati.GUI.Wizard_pages.Add_backup +{ + partial class SettingOverrides + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.OptionsGrid = new System.Windows.Forms.DataGridView(); + this.InfoLabel = new System.Windows.Forms.Label(); + this.BaseDataSet = new System.Data.DataSet(); + this.OverrideTable = new System.Data.DataTable(); + this.EnabledDataColumn = new System.Data.DataColumn(); + this.NameDataColumn = new System.Data.DataColumn(); + this.ValueDataColumn = new System.Data.DataColumn(); + this.enabledDataGridViewCheckBoxColumn = new System.Windows.Forms.DataGridViewCheckBoxColumn(); + this.nameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.valueDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.dataGridViewTextBoxColumn1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.argumentDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.argumentDataColumn = new System.Data.DataColumn(); + ((System.ComponentModel.ISupportInitialize)(this.OptionsGrid)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.BaseDataSet)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.OverrideTable)).BeginInit(); + this.SuspendLayout(); + // + // OptionsGrid + // + this.OptionsGrid.AllowUserToAddRows = false; + this.OptionsGrid.AllowUserToDeleteRows = false; + this.OptionsGrid.AutoGenerateColumns = false; + this.OptionsGrid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.OptionsGrid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.enabledDataGridViewCheckBoxColumn, + this.nameDataGridViewTextBoxColumn, + this.valueDataGridViewTextBoxColumn, + this.argumentDataGridViewTextBoxColumn}); + this.OptionsGrid.DataMember = "OverrideTable"; + this.OptionsGrid.DataSource = this.BaseDataSet; + this.OptionsGrid.Location = new System.Drawing.Point(16, 16); + this.OptionsGrid.MultiSelect = false; + this.OptionsGrid.Name = "OptionsGrid"; + this.OptionsGrid.RowHeadersVisible = false; + this.OptionsGrid.Size = new System.Drawing.Size(472, 144); + this.OptionsGrid.TabIndex = 0; + this.OptionsGrid.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler(this.OptionsGrid_RowEnter); + this.OptionsGrid.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.OptionsGrid_CellEndEdit); + // + // InfoLabel + // + this.InfoLabel.Location = new System.Drawing.Point(16, 168); + this.InfoLabel.Name = "InfoLabel"; + this.InfoLabel.Size = new System.Drawing.Size(472, 64); + this.InfoLabel.TabIndex = 0; + this.InfoLabel.Text = "Description panel"; + // + // BaseDataSet + // + this.BaseDataSet.DataSetName = "BaseDataSet"; + this.BaseDataSet.Tables.AddRange(new System.Data.DataTable[] { + this.OverrideTable}); + // + // OverrideTable + // + this.OverrideTable.Columns.AddRange(new System.Data.DataColumn[] { + this.EnabledDataColumn, + this.NameDataColumn, + this.ValueDataColumn, + this.argumentDataColumn}); + this.OverrideTable.TableName = "OverrideTable"; + // + // EnabledDataColumn + // + this.EnabledDataColumn.Caption = "Enabled"; + this.EnabledDataColumn.ColumnName = "Enabled"; + this.EnabledDataColumn.DataType = typeof(bool); + // + // NameDataColumn + // + this.NameDataColumn.Caption = "Name"; + this.NameDataColumn.ColumnName = "Name"; + // + // ValueDataColumn + // + this.ValueDataColumn.Caption = "Value"; + this.ValueDataColumn.ColumnName = "Value"; + // + // enabledDataGridViewCheckBoxColumn + // + this.enabledDataGridViewCheckBoxColumn.DataPropertyName = "Enabled"; + this.enabledDataGridViewCheckBoxColumn.HeaderText = "Enabled"; + this.enabledDataGridViewCheckBoxColumn.Name = "enabledDataGridViewCheckBoxColumn"; + this.enabledDataGridViewCheckBoxColumn.Width = 50; + // + // nameDataGridViewTextBoxColumn + // + this.nameDataGridViewTextBoxColumn.DataPropertyName = "Name"; + this.nameDataGridViewTextBoxColumn.HeaderText = "Name"; + this.nameDataGridViewTextBoxColumn.Name = "nameDataGridViewTextBoxColumn"; + this.nameDataGridViewTextBoxColumn.ReadOnly = true; + this.nameDataGridViewTextBoxColumn.Width = 150; + // + // valueDataGridViewTextBoxColumn + // + this.valueDataGridViewTextBoxColumn.DataPropertyName = "Value"; + this.valueDataGridViewTextBoxColumn.HeaderText = "Value"; + this.valueDataGridViewTextBoxColumn.Name = "valueDataGridViewTextBoxColumn"; + this.valueDataGridViewTextBoxColumn.Width = 240; + // + // dataGridViewTextBoxColumn1 + // + this.dataGridViewTextBoxColumn1.DataPropertyName = "argument"; + this.dataGridViewTextBoxColumn1.HeaderText = "argument"; + this.dataGridViewTextBoxColumn1.Name = "dataGridViewTextBoxColumn1"; + this.dataGridViewTextBoxColumn1.Visible = false; + this.dataGridViewTextBoxColumn1.Width = 5; + // + // argumentDataGridViewTextBoxColumn + // + this.argumentDataGridViewTextBoxColumn.DataPropertyName = "argument"; + this.argumentDataGridViewTextBoxColumn.HeaderText = "argument"; + this.argumentDataGridViewTextBoxColumn.Name = "argumentDataGridViewTextBoxColumn"; + this.argumentDataGridViewTextBoxColumn.Visible = false; + this.argumentDataGridViewTextBoxColumn.Width = 5; + // + // argumentDataColumn + // + this.argumentDataColumn.Caption = "argument"; + this.argumentDataColumn.ColumnName = "argument"; + this.argumentDataColumn.DataType = typeof(object); + // + // SettingOverrides + // + this.Controls.Add(this.InfoLabel); + this.Controls.Add(this.OptionsGrid); + this.Name = "SettingOverrides"; + this.Size = new System.Drawing.Size(506, 242); + ((System.ComponentModel.ISupportInitialize)(this.OptionsGrid)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.BaseDataSet)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.OverrideTable)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.DataGridView OptionsGrid; + private System.Windows.Forms.Label InfoLabel; + private System.Data.DataSet BaseDataSet; + private System.Data.DataTable OverrideTable; + private System.Data.DataColumn EnabledDataColumn; + private System.Data.DataColumn NameDataColumn; + private System.Data.DataColumn ValueDataColumn; + private System.Data.DataColumn argumentDataColumn; + private System.Windows.Forms.DataGridViewCheckBoxColumn enabledDataGridViewCheckBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn nameDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn valueDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn argumentDataGridViewTextBoxColumn; + private System.Windows.Forms.DataGridViewTextBoxColumn dataGridViewTextBoxColumn1; + } +} diff --git a/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.cs b/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.cs new file mode 100644 index 000000000..78b3e06fd --- /dev/null +++ b/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.cs @@ -0,0 +1,106 @@ +#region Disclaimer / License +// Copyright (C) 2009, 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.ComponentModel; +using System.Data; +using System.Drawing; +using System.Text; +using System.Windows.Forms; + +namespace Duplicati.GUI.Wizard_pages.Add_backup +{ + public partial class SettingOverrides : System.Windows.Forms.Wizard.WizardControl + { + private WizardSettingsWrapper m_wrapper; + + public SettingOverrides() + : base("Override settings", "On this page you can override all settings supported by Duplicati. This is very advanced, so be carefull!") + { + InitializeComponent(); + + m_autoFillValues = false; + base.PageEnter += new System.Windows.Forms.Wizard.PageChangeHandler(SettingOverrides_PageEnter); + base.PageLeave += new System.Windows.Forms.Wizard.PageChangeHandler(SettingOverrides_PageLeave); + } + + void SettingOverrides_PageLeave(object sender, System.Windows.Forms.Wizard.PageChangedArgs args) + { + if (args.Direction == System.Windows.Forms.Wizard.PageChangedDirection.Back) + return; + + m_wrapper.Overrides.Clear(); + foreach (DataRow dr in OverrideTable.Rows) + if ((bool)dr["Enabled"]) + m_wrapper.Overrides.Add((string)dr["Name"], (string)dr["Value"]); + + args.NextPage = new Wizard_pages.Add_backup.FinishedAdd(); + } + + void SettingOverrides_PageEnter(object sender, System.Windows.Forms.Wizard.PageChangedArgs args) + { + m_wrapper = new WizardSettingsWrapper(m_settings); + + if (!m_settings.ContainsKey("Overrides:Table")) + { + OverrideTable.Rows.Clear(); + + Library.Main.Options opt = new Library.Main.Options(new Dictionary()); + foreach (Library.Backend.ICommandLineArgument arg in opt.SupportedCommands) + { + DataRow dr = OverrideTable.NewRow(); + dr["Enabled"] = m_wrapper.Overrides.ContainsKey(arg.Name); + dr["argument"] = arg; + dr["Name"] = arg.Name; + if (m_wrapper.Overrides.ContainsKey(arg.Name)) + dr["Value"] = m_wrapper.Overrides[arg.Name]; + OverrideTable.Rows.Add(dr); + } + + m_settings["Overrides:Table"] = BaseDataSet; + } + else + { + BaseDataSet = (DataSet)m_settings["Overrides:Table"]; + OptionsGrid.DataSource = BaseDataSet; + OverrideTable = BaseDataSet.Tables["OverrideTable"]; + OptionsGrid.DataMember = "OverrideTable"; + } + + } + + private void OptionsGrid_RowEnter(object sender, DataGridViewCellEventArgs e) + { + DataRow r = OverrideTable.Rows[e.RowIndex]; + Library.Backend.ICommandLineArgument arg = (Library.Backend.ICommandLineArgument)r["argument"]; + InfoLabel.Text = string.Format("Type: {0}. {1}. {2}", arg.Type.ToString(), arg.ShortDescription, arg.LongDescription); + } + + private void OptionsGrid_CellEndEdit(object sender, DataGridViewCellEventArgs e) + { + if (e.ColumnIndex != 0) + { + DataRow r = OverrideTable.Rows[e.RowIndex]; + r["Enabled"] = r["Value"] != DBNull.Value; + } + } + } +} + diff --git a/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.resx b/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.resx new file mode 100644 index 000000000..f39ce09d5 --- /dev/null +++ b/Duplicati/GUI/Wizard pages/Add backup/SettingOverrides.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.Designer.cs b/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.Designer.cs index 8e856d585..4410f7fde 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.Designer.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.Designer.cs @@ -132,7 +132,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // BackupLimitEnabled // this.BackupLimitEnabled.AutoSize = true; - this.BackupLimitEnabled.Location = new System.Drawing.Point(32, 96); + this.BackupLimitEnabled.Location = new System.Drawing.Point(32, 89); this.BackupLimitEnabled.Name = "BackupLimitEnabled"; this.BackupLimitEnabled.Size = new System.Drawing.Size(134, 17); this.BackupLimitEnabled.TabIndex = 9; @@ -150,7 +150,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup "kb", "mb", "gb"}); - this.BackupLimitSuffix.Location = new System.Drawing.Point(281, 95); + this.BackupLimitSuffix.Location = new System.Drawing.Point(281, 88); this.BackupLimitSuffix.Name = "BackupLimitSuffix"; this.BackupLimitSuffix.Size = new System.Drawing.Size(72, 21); this.BackupLimitSuffix.TabIndex = 11; @@ -158,7 +158,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // BackupLimitNumber // this.BackupLimitNumber.Enabled = false; - this.BackupLimitNumber.Location = new System.Drawing.Point(185, 95); + this.BackupLimitNumber.Location = new System.Drawing.Point(185, 88); this.BackupLimitNumber.Maximum = new decimal(new int[] { 10000, 0, @@ -178,14 +178,14 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup "kb", "mb", "gb"}); - this.VolumeSizeLimitSuffix.Location = new System.Drawing.Point(280, 128); + this.VolumeSizeLimitSuffix.Location = new System.Drawing.Point(280, 120); this.VolumeSizeLimitSuffix.Name = "VolumeSizeLimitSuffix"; this.VolumeSizeLimitSuffix.Size = new System.Drawing.Size(72, 21); this.VolumeSizeLimitSuffix.TabIndex = 14; // // VolumeSizeLimitNumber // - this.VolumeSizeLimitNumber.Location = new System.Drawing.Point(184, 128); + this.VolumeSizeLimitNumber.Location = new System.Drawing.Point(184, 120); this.VolumeSizeLimitNumber.Maximum = new decimal(new int[] { 10000, 0, @@ -199,7 +199,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // AsyncEnabled // this.AsyncEnabled.AutoSize = true; - this.AsyncEnabled.Location = new System.Drawing.Point(32, 168); + this.AsyncEnabled.Location = new System.Drawing.Point(32, 160); this.AsyncEnabled.Name = "AsyncEnabled"; this.AsyncEnabled.Size = new System.Drawing.Size(124, 17); this.AsyncEnabled.TabIndex = 15; @@ -209,7 +209,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(48, 128); + this.label1.Location = new System.Drawing.Point(48, 120); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(103, 13); this.label1.TabIndex = 16; @@ -218,7 +218,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup // ThreadPriorityEnabled // this.ThreadPriorityEnabled.AutoSize = true; - this.ThreadPriorityEnabled.Location = new System.Drawing.Point(32, 200); + this.ThreadPriorityEnabled.Location = new System.Drawing.Point(32, 184); this.ThreadPriorityEnabled.Name = "ThreadPriorityEnabled"; this.ThreadPriorityEnabled.Size = new System.Drawing.Size(108, 17); this.ThreadPriorityEnabled.TabIndex = 17; @@ -237,7 +237,7 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup "Normal", "Below normal", "Low"}); - this.ThreadPriority.Location = new System.Drawing.Point(184, 200); + this.ThreadPriority.Location = new System.Drawing.Point(184, 184); this.ThreadPriority.Name = "ThreadPriority"; this.ThreadPriority.Size = new System.Drawing.Size(168, 21); this.ThreadPriority.TabIndex = 18; diff --git a/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.cs b/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.cs index 73dd996fe..cc8dab88c 100644 --- a/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.cs +++ b/Duplicati/GUI/Wizard pages/Add backup/ThrottleOptions.cs @@ -143,6 +143,10 @@ namespace Duplicati.GUI.Wizard_pages.Add_backup if ((bool)m_settings["Advanced:Filters"]) args.NextPage = new Wizard_pages.Add_backup.EditFilters(); + else if ((bool)m_settings["Advanced:Filenames"]) + args.NextPage = new Wizard_pages.Add_backup.GeneratedFilenameOptions(); + else if ((bool)m_settings["Advanced:Overrides"]) + args.NextPage = new Wizard_pages.Add_backup.SettingOverrides(); else args.NextPage = new FinishedAdd(); } diff --git a/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs b/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs index 110e2dbed..439a495f2 100644 --- a/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs +++ b/Duplicati/GUI/Wizard pages/WizardSettingsWrapper.cs @@ -131,15 +131,24 @@ namespace Duplicati.GUI.Wizard_pages this.FullBackupInterval = schedule.Task.FullAfter; this.MaxFullBackups = (int)schedule.Task.KeepFull; this.BackupExpireInterval = schedule.Task.KeepTime; - this.UploadSpeedLimit = schedule.Task.UploadBandwidth; - this.DownloadSpeedLimit = schedule.Task.DownloadBandwidth; - this.BackupSizeLimit = schedule.Task.MaxUploadsize; - this.VolumeSize = schedule.Task.VolumeSize; - this.ThreadPriority = schedule.Task.ThreadPriority; - this.AsyncTransfer = schedule.Task.AsyncTransfer; + this.UploadSpeedLimit = schedule.Task.Extensions.UploadBandwidth; + this.DownloadSpeedLimit = schedule.Task.Extensions.DownloadBandwidth; + this.BackupSizeLimit = schedule.Task.Extensions.MaxUploadSize; + this.VolumeSize = schedule.Task.Extensions.VolumeSize; + this.ThreadPriority = schedule.Task.Extensions.ThreadPriority; + this.AsyncTransfer = schedule.Task.Extensions.AsyncTransfer; this.GPGEncryption = schedule.Task.GPGEncryption; this.IncludeSetup = schedule.Task.IncludeSetup; - this.IgnoreFileTimestamps = schedule.Task.IgnoreTimestamps; + this.IgnoreFileTimestamps = schedule.Task.Extensions.IgnoreTimestamps; + this.FileSizeLimit = schedule.Task.Extensions.FileSizeLimit; + + this.FilePrefix = schedule.Task.Extensions.FilenamePrefix; + this.FileTimeSeperator = schedule.Task.Extensions.FileTimeSeperator; + this.ShortFilenames = schedule.Task.Extensions.ShortFilenames; + + this.Overrides = new Dictionary(); + foreach (Datamodel.TaskOverride ov in schedule.Task.TaskOverrides) + this.Overrides[ov.Name] = ov.Value; this.PrimayAction = action; } @@ -156,7 +165,6 @@ namespace Duplicati.GUI.Wizard_pages if (schedule.Task == null) schedule.Task = schedule.DataParent.Add(); schedule.Task.SourcePath = this.SourcePath; - //TODO: This does not correctly erase the old filters? schedule.Task.EncodedFilter = this.EncodedFilters; schedule.Task.Encryptionkey = this.BackupPassword; @@ -227,17 +235,44 @@ namespace Duplicati.GUI.Wizard_pages schedule.Task.KeepFull = this.MaxFullBackups; schedule.Task.KeepTime = this.BackupExpireInterval; - schedule.Task.UploadBandwidth = this.UploadSpeedLimit; - schedule.Task.DownloadBandwidth = this.DownloadSpeedLimit; - schedule.Task.MaxUploadsize = this.BackupSizeLimit; + schedule.Task.Extensions.UploadBandwidth = this.UploadSpeedLimit; + schedule.Task.Extensions.DownloadBandwidth = this.DownloadSpeedLimit; + schedule.Task.Extensions.MaxUploadSize = this.BackupSizeLimit; - schedule.Task.VolumeSize = this.VolumeSize; - schedule.Task.ThreadPriority = this.ThreadPriority; - schedule.Task.AsyncTransfer = this.AsyncTransfer; + schedule.Task.Extensions.VolumeSize = this.VolumeSize; + schedule.Task.Extensions.ThreadPriority = this.ThreadPriority; + schedule.Task.Extensions.AsyncTransfer = this.AsyncTransfer; schedule.Task.GPGEncryption = this.GPGEncryption; schedule.Task.IncludeSetup = this.IncludeSetup; - schedule.Task.IgnoreTimestamps = this.IgnoreFileTimestamps; + schedule.Task.Extensions.IgnoreTimestamps = this.IgnoreFileTimestamps; + schedule.Task.Extensions.FileSizeLimit = this.FileSizeLimit; + + schedule.Task.Extensions.FilenamePrefix = this.FilePrefix; + schedule.Task.Extensions.FileTimeSeperator = this.FileTimeSeperator; + schedule.Task.Extensions.ShortFilenames = this.ShortFilenames; + + //Synchronize the override collections, preserve existing items + Dictionary ovs = new Dictionary(); + foreach (Datamodel.TaskOverride ov in schedule.Task.TaskOverrides) + ovs[ov.Name] = ov; + + foreach (string s in this.Overrides.Keys) + if (ovs.ContainsKey(s)) + { + ovs[s].Value = this.Overrides[s]; + ovs.Remove(s); + } + else + { + Datamodel.TaskOverride ov = schedule.Task.DataParent.Add(); + ov.Name = s; + ov.Value = this.Overrides[s]; + schedule.Task.TaskOverrides.Add(ov); + } + + foreach (Datamodel.TaskOverride ov in ovs.Values) + ov.DataParent.DeleteObject(ov); } /// @@ -390,7 +425,6 @@ namespace Duplicati.GUI.Wizard_pages set { SetItem("BackupExpireInterval", value); } } - /// /// The interval at which to perform full backups /// @@ -427,6 +461,15 @@ namespace Duplicati.GUI.Wizard_pages set { SetItem("VolumeSize", value); } } + /// + /// The maximum size of files included in the backup + /// + public string FileSizeLimit + { + get { return GetItem("FileSizeLimit", ""); } + set { SetItem("FileSizeLimit", value); } + } + /// /// The size of each volume in the backup set /// @@ -544,6 +587,46 @@ namespace Duplicati.GUI.Wizard_pages set { SetItem("IgnoreFileTimestamps", value); } } + /// + /// A prefix to the volume filename + /// + public string FilePrefix + { + get { return GetItem("FilePrefix", ""); } + set { SetItem("FilePrefix", value); } + } + + /// + /// The character used to seperate time digits in the filename + /// + public string FileTimeSeperator + { + get { return GetItem("FileTimeSeperator", ":"); } + set { SetItem("FileTimeSeperator", value); } + } + + /// + /// True if the filenames generated should be short + /// + public bool ShortFilenames + { + get { return GetItem("ShortFilenames", false); } + set { SetItem("ShortFilenames", value); } + } + + /// + /// Gets all the overrides present on the task + /// + public Dictionary Overrides + { + get + { + if (GetItem>("Overrides", null) == null) + this.Overrides = new Dictionary(); + return GetItem>("Overrides", null); + } + set { SetItem("Overrides", value); } + } } /// diff --git a/Duplicati/GUI/WizardHandler.cs b/Duplicati/GUI/WizardHandler.cs index 471830795..5147de7df 100644 --- a/Duplicati/GUI/WizardHandler.cs +++ b/Duplicati/GUI/WizardHandler.cs @@ -117,12 +117,7 @@ namespace Duplicati.GUI { Schedule schedule = Program.DataConnection.GetObjectById(wrapper.ScheduleID); List items = new List(); - items.Add(schedule); - items.Add(schedule.Task); - foreach(TaskSetting ts in schedule.Task.TaskSettings) - items.Add(ts); - foreach (TaskFilter tf in schedule.Task.Filters) - items.Add(tf); + items.AddRange(Program.DataConnection.FindObjectRelations(schedule)); foreach(IDataClass o in items) Program.DataConnection.DeleteObject(o); Program.DataConnection.Commit(items.ToArray()); diff --git a/Duplicati/Library/Backend/File/FileBackend.cs b/Duplicati/Library/Backend/File/FileBackend.cs index f809642ad..168bded16 100644 --- a/Duplicati/Library/Backend/File/FileBackend.cs +++ b/Duplicati/Library/Backend/File/FileBackend.cs @@ -96,7 +96,7 @@ namespace Duplicati.Library.Backend foreach (string s in System.IO.Directory.GetDirectories(path)) { System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(s); - FileEntry fe = new FileEntry(di.Name,0, di.LastAccessTime, di.LastWriteTime); + FileEntry fe = new FileEntry(di.Name, 0, di.LastAccessTime, di.LastWriteTime); fe.IsFolder = true; ls.Add(fe); } diff --git a/Duplicati/Library/Backend/S3/S3Backend.cs b/Duplicati/Library/Backend/S3/S3Backend.cs index c7299f2a4..3fd71712e 100644 --- a/Duplicati/Library/Backend/S3/S3Backend.cs +++ b/Duplicati/Library/Backend/S3/S3Backend.cs @@ -115,7 +115,9 @@ namespace Duplicati.Library.Backend m_bucket = m_host.Substring(0, m_host.Length - ".s3.amazonaws.com".Length); m_host = "s3.amazonaws.com"; m_prefix = u.PathAndQuery; - + + if (m_prefix.StartsWith("/")) + m_prefix = m_prefix.Substring(1); } else throw new Exception("Unable to determine the bucket name for host: " + m_url); @@ -155,7 +157,13 @@ namespace Duplicati.Library.Backend List lst = con.ListBucket(m_bucket, m_prefix); for (int i = 0; i < lst.Count; i++) + { lst[i].Name = lst[i].Name.Substring(m_prefix.Length); + + //Fix for a bug in Duplicati 1.0 beta 3 and earlier, where filenames are incorrectly prefixed with a slash + if (lst[i].Name.StartsWith("/") && !m_prefix.StartsWith("/")) + lst[i].Name = lst[i].Name.Substring(1); + } return lst; } catch (System.Net.WebException wex) diff --git a/Duplicati/Library/Core/Utility.cs b/Duplicati/Library/Core/Utility.cs index d79bd3372..20755ee09 100644 --- a/Duplicati/Library/Core/Utility.cs +++ b/Duplicati/Library/Core/Utility.cs @@ -390,5 +390,34 @@ namespace Duplicati.Library.Core return System.Threading.ThreadPriority.Normal; } } + + /// + /// Parses a string into a boolean value + /// + /// The value to parse + /// The default value, in case the string is not a valid boolean value + /// The parsed value or the default value + public static bool ParseBool(string value, bool @default) + { + if (value == null) + value = ""; + + switch (value.Trim().ToLower()) + { + case "1": + case "on": + case "true": + case "yes": + return true; + case "0": + case "off": + case "false": + case "no": + return false; + default: + return @default; + } + } + } } diff --git a/Duplicati/Library/Main/FilenameStrategy.cs b/Duplicati/Library/Main/FilenameStrategy.cs index 4c0f6a236..b5d8b2fc0 100644 --- a/Duplicati/Library/Main/FilenameStrategy.cs +++ b/Duplicati/Library/Main/FilenameStrategy.cs @@ -101,6 +101,8 @@ namespace Duplicati.Library.Main m = m_shortRegExp.Match(fe.Name); if (!m.Success) return null; + if (m.Value != fe.Name) + return null; //Accept only full matches BackupEntry.EntryType type; if (m.Groups["type"].Value == "manifest" || m.Groups["type"].Value == "M") diff --git a/Duplicati/Library/Main/Interface.cs b/Duplicati/Library/Main/Interface.cs index 02102d9ad..dc1294f26 100644 --- a/Duplicati/Library/Main/Interface.cs +++ b/Duplicati/Library/Main/Interface.cs @@ -82,8 +82,6 @@ namespace Duplicati.Library.Main OperationProgress(this, DuplicatiOperation.Backup, -1, -1, "Loading remote filelist", ""); - FilenameStrategy fns = new FilenameStrategy(m_options); - bool full = m_options.Full; backend = new BackendWrapper(bs, m_backend, m_options); @@ -127,7 +125,7 @@ namespace Duplicati.Library.Main dir.ProgressEvent += new Duplicati.Library.Main.RSync.RSyncDir.ProgressEventDelegate(BackupRSyncDir_ProgressEvent); dir.DisableFiletimeCheck = m_options.DisableFiletimeCheck; - dir.MaxFileSize = m_options.MaxFileSize; + dir.MaxFileSize = m_options.SkipFilesLargerThan; using (new Logging.Timer("Initiating multipass")) dir.InitiateMultiPassDiff(full); diff --git a/Duplicati/Library/Main/Options.cs b/Duplicati/Library/Main/Options.cs index 29853866b..21deaa454 100644 --- a/Duplicati/Library/Main/Options.cs +++ b/Duplicati/Library/Main/Options.cs @@ -119,14 +119,14 @@ namespace Duplicati.Library.Main /// /// Gets the maximum size of a single file /// - public long MaxFileSize + public long SkipFilesLargerThan { get { - if (!m_options.ContainsKey("totalsize") || string.IsNullOrEmpty(m_options["totalsize"])) + if (!m_options.ContainsKey("skip-files-larger-than") || string.IsNullOrEmpty(m_options["skip-files-larger-than"])) return long.MaxValue; else - return Math.Max(VolumeSize, Core.Sizeparser.ParseSize(m_options["totalsize"], "mb")); + return Core.Sizeparser.ParseSize(m_options["skip-files-larger-than"], "mb"); } } diff --git a/thirdparty/LightDataModel/DataClassFileBuilder.exe b/thirdparty/LightDataModel/DataClassFileBuilder.exe index 919799ee39dcbfeaaa0f73b9185fc7ecbe106714..7b53cb6230ca192eaa0c3f67db2222a28511e703 100644 GIT binary patch delta 7701 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 Dl~!`` delta 7475 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 Ow+kL%e9u48fE@rA(=<{5 diff --git a/thirdparty/LightDataModel/LightDatamodel.dll b/thirdparty/LightDataModel/LightDatamodel.dll index 04157b111fb072c7b3b8e0d6ff29cee7e3ba0131..8d2014172a336bd9081b0bdae5b4a88ff6def1a8 100644 GIT binary patch delta 22025 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 delta 22067 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