private void ApplicationSetup_Load(object sender, EventArgs e) { try { this.Text = string.Format(Strings.ApplicationSetup.DialogTitle, License.VersionNumbers.Version); m_isUpdating = true; m_connection = new DataFetcherNested(Program.DataConnection); m_settings = new ApplicationSettings(m_connection); RecentDuration.Value = m_settings.RecentBackupDuration; TempPath.Text = m_settings.TempPath; UseCommonPassword.Checked = m_settings.UseCommonPassword; CommonPassword.Text = CommonPassword.InitialPassword = m_settings.CommonPassword; CommonPassword.AskToEnterNewPassword = !string.IsNullOrEmpty(CommonPassword.Text); if (EncryptionModule.Items.Count > 0) { bool foundEncryption = false; int defaultIndex = 0; for (int i = 0; i < EncryptionModule.Items.Count; i++) if (((ComboBoxItemPair<Library.Interface.IEncryption>)EncryptionModule.Items[i]).Value.FilenameExtension == m_settings.CommonPasswordEncryptionModule) { foundEncryption = true; EncryptionModule.SelectedIndex = i; break; } else if (((ComboBoxItemPair<Library.Interface.IEncryption>)EncryptionModule.Items[i]).Value.FilenameExtension == "aes") defaultIndex = i; if (!foundEncryption) EncryptionModule.SelectedIndex = defaultIndex; } else { PasswordDefaultsGroup.Enabled = false; } SignatureCacheEnabled.Checked = m_settings.SignatureCacheEnabled; SignatureCachePath.Text = m_settings.SignatureCachePath; CalculateSignatureCacheSize(); StartupDelayDuration.Value = m_settings.StartupDelayDuration; ThreadPriorityPicker.SelectedPriority = m_settings.ThreadPriorityOverride; Bandwidth.UploadLimit = m_settings.UploadSpeedLimit; Bandwidth.DownloadLimit = m_settings.DownloadSpeedLimit; HideDonateButton.Checked = m_settings.HideDonateButton; BalloonNotificationLevel.SelectedItem = null; foreach(ComboBoxItemPair<ApplicationSettings.NotificationLevel> p in BalloonNotificationLevel.Items) if (p.Value == m_settings.BallonNotificationLevel) { BalloonNotificationLevel.SelectedItem = p; break; } if (string.IsNullOrEmpty(m_settings.DisplayLanguage)) LanguageSelection.SelectedIndex = 0; else { try { LanguageSelection.SelectedIndex = -1; System.Globalization.CultureInfo cci = System.Globalization.CultureInfo.GetCultureInfo(m_settings.DisplayLanguage); for(int i = 0; i < LanguageSelection.Items.Count; i++) if (((ComboBoxItemPair<CultureInfo>)LanguageSelection.Items[i]).Value == cci) { LanguageSelection.SelectedIndex = i; break; } } catch { LanguageSelection.SelectedIndex = -1; } } try { foreach (Library.Interface.ISettingsControl ic in Library.DynamicLoader.SettingsControlLoader.Modules) { Control c = ic.GetControl(m_settings.CreateDetachedCopy(), Datamodel.SettingExtension.GetExtensions(m_connection, ic.Key)); c.Dock = DockStyle.Fill; TabPage tab = new TabPage(); tab.Text = ic.PageTitle; tab.ToolTipText = ic.PageDescription; tab.Controls.Add(c); tab.Tag = ic; TabContainer.TabPages.Add(tab); } } catch (Exception ex) { MessageBox.Show(this, string.Format(Strings.ApplicationSetup.SettingControlsLoadError, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } //Place the license page last TabContainer.TabPages.Remove(LicenseTab); TabContainer.TabPages.Insert(TabContainer.TabPages.Count, LicenseTab); string licensePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "licenses"); List<Duplicati.License.LicenseEntry> licenses = Duplicati.License.LicenseReader.ReadLicenses(licensePath); licenses.Insert(0, new Duplicati.License.LicenseEntry("Duplicati", System.IO.Path.Combine(licensePath, "duplicati-url.txt"), System.IO.Path.Combine(licensePath, "license.txt"))); licenses.Insert(0, new Duplicati.License.LicenseEntry("Acknowledgements", System.IO.Path.Combine(licensePath, "duplicati-url.txt"), System.IO.Path.Combine(licensePath, "acknowledgements.txt"))); LicenseSections.Items.Clear(); LicenseSections.Items.AddRange(licenses.ToArray()); LicenseSections.SelectedIndex = -1; LicenseSections.SelectedIndex = 0; } finally { m_isUpdating = false; } }
protected void initializeDbConnection() { this.m_db_connection = Utils.CreateDbConnection(); this.m_datafetcher = Utils.InitializeDbConnection(this.m_config_dir, m_db_connection); }
static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //If we are on Windows, append the bundled "win-tools" programs to the search path //We add it last, to allow the user to override with other versions if (!Library.Utility.Utility.IsClientLinux) { string wintools = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "win-tools"); Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + System.IO.Path.PathSeparator.ToString() + wintools + System.IO.Path.PathSeparator.ToString() + System.IO.Path.Combine(wintools, "gpg") //GPG needs to be in a subfolder for wrapping reasons ); } Library.Utility.UrlUtillity.ErrorHandler = new XervBackup.Library.Utility.UrlUtillity.ErrorHandlerDelegate(DisplayURLOpenError); //If we are on windows we encrypt the database by default //We do not encrypt on Linux as most distros use a SQLite library without encryption support, //Linux users can use an encrypted home folder, or install a SQLite library with encryption support if (!Library.Utility.Utility.IsClientLinux && string.IsNullOrEmpty(Environment.GetEnvironmentVariable(DB_KEY_ENV_NAME))) { //Note that the password here is a default password and public knowledge // //The purpose of this is to prevent casual read of the database, as well // as protect from harddisk string scans, not to protect from determined // attacks. // //If you desire better security, start XervBackup once with the commandline option // --unencrypted-database to decrypt the database. //Then set the environment variable XERVBACKUP_DB_KEY to the desired key, // and run XervBackup again without the --unencrypted-database option // to re-encrypt it with the new key // //If you change the key, please note that you need to supply the same // key when restoring the setup, as the setup being backed up will // be encrypted as well. Environment.SetEnvironmentVariable(DB_KEY_ENV_NAME, "XervBackup_Key_42"); } //Find commandline options here for handling special startup cases Dictionary<string, string> commandlineOptions = CommandLine.CommandLineParser.ExtractOptions(new List<string>(args)); foreach (string s in args) if ( s.Equals("help", StringComparison.InvariantCultureIgnoreCase) || s.Equals("/help", StringComparison.InvariantCultureIgnoreCase) || s.Equals("usage", StringComparison.InvariantCultureIgnoreCase) || s.Equals("/usage", StringComparison.InvariantCultureIgnoreCase)) commandlineOptions["help"] = ""; //If the commandline issues --help, just stop here if (commandlineOptions.ContainsKey("help")) { List<string> lines = new List<string>(); foreach (Library.Interface.ICommandLineArgument arg in SupportedCommands) lines.Add(string.Format(Strings.Program.HelpDisplayFormat, arg.Name, arg.LongDescription)); MessageBox.Show(string.Format(Strings.Program.HelpDisplayDialog, string.Join(Environment.NewLine, lines.ToArray())), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (commandlineOptions.ContainsKey("trayless")) Program.TraylessMode = Library.Utility.Utility.ParseBoolOption(commandlineOptions, "trayless"); #if DEBUG //Log various information in the logfile if (!commandlineOptions.ContainsKey("log-file")) { commandlineOptions["log-file"] = System.IO.Path.Combine(Application.StartupPath, "XervBackup.debug.log"); commandlineOptions["log-level"] = XervBackup.Library.Logging.LogMessageType.Profiling.ToString(); } #endif if (commandlineOptions.ContainsKey("log-level")) foreach (string s in Enum.GetNames(typeof(XervBackup.Library.Logging.LogMessageType))) if (s.Equals(commandlineOptions["log-level"].Trim(), StringComparison.InvariantCultureIgnoreCase)) XervBackup.Library.Logging.Log.LogLevel = (XervBackup.Library.Logging.LogMessageType)Enum.Parse(typeof(XervBackup.Library.Logging.LogMessageType), s); if (commandlineOptions.ContainsKey("log-file")) { if (System.IO.File.Exists(commandlineOptions["log-file"])) System.IO.File.Delete(commandlineOptions["log-file"]); XervBackup.Library.Logging.Log.CurrentLog = new XervBackup.Library.Logging.StreamLog(commandlineOptions["log-file"]); } //Set the %XERVBACKUP_HOME% env variable, if it is not already set if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable(DATAFOLDER_ENV_NAME))) { #if DEBUG //debug mode uses a lock file located in the app folder Environment.SetEnvironmentVariable(DATAFOLDER_ENV_NAME, System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); #else bool portableMode = Library.Utility.Utility.ParseBoolOption(commandlineOptions, "portable-mode"); if (portableMode) { //Portable mode uses a data folder in the application home dir Environment.SetEnvironmentVariable(DATAFOLDER_ENV_NAME, System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "data")); } else { //Normal release mode uses the systems "Application Data" folder Environment.SetEnvironmentVariable(DATAFOLDER_ENV_NAME, System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Application.ProductName)); } #endif } try { try { //This will also create Program.DATAFOLDER if it does not exist SingleInstance = new SingleInstance(Application.ProductName, Program.DATAFOLDER); } catch (Exception ex) { MessageBox.Show(string.Format(Strings.Program.StartupFailure, ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!SingleInstance.IsFirstInstance) { //Linux shows this output Console.WriteLine(Strings.Program.AnotherInstanceDetected); return; } Version sqliteVersion = new Version((string)SQLiteLoader.SQLiteConnectionType.GetProperty("SQLiteVersion").GetValue(null, null)); if (sqliteVersion < new Version(3, 6, 3)) { //The official Mono SQLite provider is also broken with less than 3.6.3 MessageBox.Show(string.Format(Strings.Program.WrongSQLiteVersion, sqliteVersion, "3.6.3"), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //Create the connection instance System.Data.IDbConnection con = (System.Data.IDbConnection)Activator.CreateInstance(SQLiteLoader.SQLiteConnectionType); try { #if DEBUG //Default is to not use encryption for debugging Program.UseDatabaseEncryption = commandlineOptions.ContainsKey("unencrypted-database") ? !Library.Utility.Utility.ParseBoolOption(commandlineOptions, "unencrypted-database") : false; #else //Default is to use encryption for release Program.UseDatabaseEncryption = !Library.Utility.Utility.ParseBoolOption(commandlineOptions, "unencrypted-database"); #endif OpenSettingsDatabase(con, Program.DATAFOLDER); } catch (Exception ex) { //Unwrap the reflection exceptions if (ex is System.Reflection.TargetInvocationException && ex.InnerException != null) ex = ex.InnerException; MessageBox.Show(string.Format(Strings.Program.DatabaseOpenError, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DataConnection = new DataFetcherWithRelations(new SQLiteDataProvider(con)); string displayLanguage = new Datamodel.ApplicationSettings(DataConnection).DisplayLanguage; if (!string.IsNullOrEmpty(displayLanguage) && displayLanguage != Library.Utility.Utility.DefaultCulture.Name) { try { System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo(displayLanguage); System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo(displayLanguage); } catch (Exception ex) { MessageBox.Show(string.Format(Strings.Program.LanguageSelectionError, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); //This is non-fatal, just keep running with system default language } } try { DataFetcherNested logcon = new DataFetcherNested(DataConnection); Log[] items = logcon.GetObjects<Log>("Subaction LIKE ?", "InProgress"); if (items != null && items.Length > 0) { foreach (Log l in items) l.SubAction = "Primary"; logcon.CommitAllRecursive(); } } catch { //Non-fatal but any interrupted backup will not show } LiveControl = new LiveControls(new ApplicationSettings(DataConnection)); LiveControl.StateChanged += new EventHandler(LiveControl_StateChanged); LiveControl.ThreadPriorityChanged += new EventHandler(LiveControl_ThreadPriorityChanged); LiveControl.ThrottleSpeedChanged += new EventHandler(LiveControl_ThrottleSpeedChanged); Runner = new XervBackupRunner(); WorkThread = new WorkerThread<IDuplicityTask>(new WorkerThread<IDuplicityTask>.ProcessItemDelegate(Runner.ExecuteTask), LiveControl.State == LiveControls.LiveControlState.Paused); Scheduler = new Scheduler(DataConnection, WorkThread, MainLock); DataConnection.AfterDataConnection += new DataConnectionEventHandler(DataConnection_AfterDataConnection); DisplayHelper = new MainForm(); DisplayHelper.InitialArguments = args; Program.IsRunningMainLoop = true; Application.Run(DisplayHelper); Program.IsRunningMainLoop = false; } catch (Exception ex) { //If the helper thread aborts the main thread, it also sets IsRunningMainLoop to false // and in that case we accept the abort call if (ex is System.Threading.ThreadAbortException && !Program.IsRunningMainLoop) System.Threading.Thread.ResetAbort(); else MessageBox.Show(string.Format(Strings.Program.SeriousError, ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } try { //Find logs that are no longer displayed, and delete them DataFetcherNested con = new DataFetcherNested(DataConnection); foreach (Log x in con.GetObjects<Log>("EndTime < ?", Library.Utility.Timeparser.ParseTimeInterval(new ApplicationSettings(con).RecentBackupDuration, DateTime.Now, true))) { if (x.Blob != null) //Load the blob part if required con.DeleteObject(x.Blob); con.DeleteObject(x); } con.CommitAllRecursive(); } catch { } try { //Compact the database using (System.Data.IDbCommand vaccum_cmd = DataConnection.Provider.Connection.CreateCommand()) { vaccum_cmd.CommandText = "VACUUM;"; vaccum_cmd.ExecuteNonQuery(); } } catch { } if (Scheduler != null) Scheduler.Terminate(true); if (WorkThread != null) WorkThread.Terminate(true); if (SingleInstance != null) SingleInstance.Dispose(); #if DEBUG using(XervBackup.Library.Logging.Log.CurrentLog as XervBackup.Library.Logging.StreamLog) XervBackup.Library.Logging.Log.CurrentLog = null; #endif }
static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //If we are on Windows, append the bundled "win-tools" programs to the search path //We add it last, to allow the user to override with other versions if (!Library.Utility.Utility.IsClientLinux) { string wintools = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "win-tools"); Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + System.IO.Path.PathSeparator.ToString() + wintools + System.IO.Path.PathSeparator.ToString() + System.IO.Path.Combine(wintools, "gpg") //GPG needs to be in a subfolder for wrapping reasons ); } Library.Utility.UrlUtillity.ErrorHandler = new Duplicati.Library.Utility.UrlUtillity.ErrorHandlerDelegate(DisplayURLOpenError); //If we are on windows we encrypt the database by default //We do not encrypt on Linux as most distros use a SQLite library without encryption support, //Linux users can use an encrypted home folder, or install a SQLite library with encryption support if (!Library.Utility.Utility.IsClientLinux && string.IsNullOrEmpty(Environment.GetEnvironmentVariable(DB_KEY_ENV_NAME))) { //Note that the password here is a default password and public knowledge // //The purpose of this is to prevent casual read of the database, as well // as protect from harddisk string scans, not to protect from determined // attacks. // //If you desire better security, start Duplicati once with the commandline option // --unencrypted-database to decrypt the database. //Then set the environment variable DUPLICATI_DB_KEY to the desired key, // and run Duplicati again without the --unencrypted-database option // to re-encrypt it with the new key // //If you change the key, please note that you need to supply the same // key when restoring the setup, as the setup being backed up will // be encrypted as well. Environment.SetEnvironmentVariable(DB_KEY_ENV_NAME, "Duplicati_Key_42"); } //Find commandline options here for handling special startup cases Dictionary <string, string> commandlineOptions = CommandLine.CommandLineParser.ExtractOptions(new List <string>(args)); foreach (string s in args) { if ( s.Equals("help", StringComparison.InvariantCultureIgnoreCase) || s.Equals("/help", StringComparison.InvariantCultureIgnoreCase) || s.Equals("usage", StringComparison.InvariantCultureIgnoreCase) || s.Equals("/usage", StringComparison.InvariantCultureIgnoreCase)) { commandlineOptions["help"] = ""; } } //If the commandline issues --help, just stop here if (commandlineOptions.ContainsKey("help")) { List <string> lines = new List <string>(); foreach (Library.Interface.ICommandLineArgument arg in SupportedCommands) { lines.Add(string.Format(Strings.Program.HelpDisplayFormat, arg.Name, arg.LongDescription)); } MessageBox.Show(string.Format(Strings.Program.HelpDisplayDialog, string.Join(Environment.NewLine, lines.ToArray())), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (commandlineOptions.ContainsKey("trayless")) { Program.TraylessMode = Library.Utility.Utility.ParseBoolOption(commandlineOptions, "trayless"); } #if DEBUG //Log various information in the logfile if (!commandlineOptions.ContainsKey("log-file")) { commandlineOptions["log-file"] = System.IO.Path.Combine(Application.StartupPath, "Duplicati.debug.log"); commandlineOptions["log-level"] = Duplicati.Library.Logging.LogMessageType.Profiling.ToString(); } #endif if (commandlineOptions.ContainsKey("log-level")) { foreach (string s in Enum.GetNames(typeof(Duplicati.Library.Logging.LogMessageType))) { if (s.Equals(commandlineOptions["log-level"].Trim(), StringComparison.InvariantCultureIgnoreCase)) { Duplicati.Library.Logging.Log.LogLevel = (Duplicati.Library.Logging.LogMessageType)Enum.Parse(typeof(Duplicati.Library.Logging.LogMessageType), s); } } } if (commandlineOptions.ContainsKey("log-file")) { if (System.IO.File.Exists(commandlineOptions["log-file"])) { System.IO.File.Delete(commandlineOptions["log-file"]); } Duplicati.Library.Logging.Log.CurrentLog = new Duplicati.Library.Logging.StreamLog(commandlineOptions["log-file"]); } //Set the %DUPLICATI_HOME% env variable, if it is not already set if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable(DATAFOLDER_ENV_NAME))) { #if DEBUG //debug mode uses a lock file located in the app folder Environment.SetEnvironmentVariable(DATAFOLDER_ENV_NAME, System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); #else bool portableMode = Library.Utility.Utility.ParseBoolOption(commandlineOptions, "portable-mode"); if (portableMode) { //Portable mode uses a data folder in the application home dir Environment.SetEnvironmentVariable(DATAFOLDER_ENV_NAME, System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "data")); } else { //Normal release mode uses the systems "Application Data" folder Environment.SetEnvironmentVariable(DATAFOLDER_ENV_NAME, System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Application.ProductName)); } #endif } try { try { //This will also create Program.DATAFOLDER if it does not exist SingleInstance = new SingleInstance(Application.ProductName, Program.DATAFOLDER); } catch (Exception ex) { MessageBox.Show(string.Format(Strings.Program.StartupFailure, ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!SingleInstance.IsFirstInstance) { //Linux shows this output Console.WriteLine(Strings.Program.AnotherInstanceDetected); return; } Version sqliteVersion = new Version((string)SQLiteLoader.SQLiteConnectionType.GetProperty("SQLiteVersion").GetValue(null, null)); if (sqliteVersion < new Version(3, 6, 3)) { //The official Mono SQLite provider is also broken with less than 3.6.3 MessageBox.Show(string.Format(Strings.Program.WrongSQLiteVersion, sqliteVersion, "3.6.3"), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //Create the connection instance System.Data.IDbConnection con = (System.Data.IDbConnection)Activator.CreateInstance(SQLiteLoader.SQLiteConnectionType); try { #if DEBUG //Default is to not use encryption for debugging Program.UseDatabaseEncryption = commandlineOptions.ContainsKey("unencrypted-database") ? !Library.Utility.Utility.ParseBoolOption(commandlineOptions, "unencrypted-database") : false; #else //Default is to use encryption for release Program.UseDatabaseEncryption = !Library.Utility.Utility.ParseBoolOption(commandlineOptions, "unencrypted-database"); #endif OpenSettingsDatabase(con, Program.DATAFOLDER); } catch (Exception ex) { //Unwrap the reflection exceptions if (ex is System.Reflection.TargetInvocationException && ex.InnerException != null) { ex = ex.InnerException; } MessageBox.Show(string.Format(Strings.Program.DatabaseOpenError, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DataConnection = new DataFetcherWithRelations(new SQLiteDataProvider(con)); string displayLanguage = new Datamodel.ApplicationSettings(DataConnection).DisplayLanguage; if (!string.IsNullOrEmpty(displayLanguage) && displayLanguage != Library.Utility.Utility.DefaultCulture.Name) { try { System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo(displayLanguage); System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo(displayLanguage); } catch (Exception ex) { MessageBox.Show(string.Format(Strings.Program.LanguageSelectionError, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); //This is non-fatal, just keep running with system default language } } try { DataFetcherNested logcon = new DataFetcherNested(DataConnection); Log[] items = logcon.GetObjects <Log>("Subaction LIKE ?", "InProgress"); if (items != null && items.Length > 0) { foreach (Log l in items) { l.SubAction = "Primary"; } logcon.CommitAllRecursive(); } } catch { //Non-fatal but any interrupted backup will not show } LiveControl = new LiveControls(new ApplicationSettings(DataConnection)); LiveControl.StateChanged += new EventHandler(LiveControl_StateChanged); LiveControl.ThreadPriorityChanged += new EventHandler(LiveControl_ThreadPriorityChanged); LiveControl.ThrottleSpeedChanged += new EventHandler(LiveControl_ThrottleSpeedChanged); Runner = new DuplicatiRunner(); WorkThread = new WorkerThread <IDuplicityTask>(new WorkerThread <IDuplicityTask> .ProcessItemDelegate(Runner.ExecuteTask), LiveControl.State == LiveControls.LiveControlState.Paused); Scheduler = new Scheduler(DataConnection, WorkThread, MainLock); DataConnection.AfterDataConnection += new DataConnectionEventHandler(DataConnection_AfterDataConnection); DisplayHelper = new MainForm(); DisplayHelper.InitialArguments = args; Program.IsRunningMainLoop = true; Application.Run(DisplayHelper); Program.IsRunningMainLoop = false; } catch (Exception ex) { //If the helper thread aborts the main thread, it also sets IsRunningMainLoop to false // and in that case we accept the abort call if (ex is System.Threading.ThreadAbortException && !Program.IsRunningMainLoop) { System.Threading.Thread.ResetAbort(); } else { MessageBox.Show(string.Format(Strings.Program.SeriousError, ex.ToString()), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } } try { //Find logs that are no longer displayed, and delete them DataFetcherNested con = new DataFetcherNested(DataConnection); foreach (Log x in con.GetObjects <Log>("EndTime < ?", Library.Utility.Timeparser.ParseTimeInterval(new ApplicationSettings(con).RecentBackupDuration, DateTime.Now, true))) { if (x.Blob != null) //Load the blob part if required { con.DeleteObject(x.Blob); } con.DeleteObject(x); } con.CommitAllRecursive(); } catch { } try { //Compact the database using (System.Data.IDbCommand vaccum_cmd = DataConnection.Provider.Connection.CreateCommand()) { vaccum_cmd.CommandText = "VACUUM;"; vaccum_cmd.ExecuteNonQuery(); } } catch { } if (Scheduler != null) { Scheduler.Terminate(true); } if (WorkThread != null) { WorkThread.Terminate(true); } if (SingleInstance != null) { SingleInstance.Dispose(); } #if DEBUG using (Duplicati.Library.Logging.Log.CurrentLog as Duplicati.Library.Logging.StreamLog) Duplicati.Library.Logging.Log.CurrentLog = null; #endif }
private void ApplicationSetup_Load(object sender, EventArgs e) { try { this.Text = string.Format(Strings.ApplicationSetup.DialogTitle, Assembly.GetEntryAssembly().GetName().Version /*System.Reflection.Assembly.GetEntryAssembly().GetName().Version*/); m_isUpdating = true; m_connection = new DataFetcherNested(Program.DataConnection); m_settings = new ApplicationSettings(m_connection); RecentDuration.Value = m_settings.RecentBackupDuration; TempPath.Text = m_settings.TempPath; UseCommonPassword.Checked = m_settings.UseCommonPassword; CommonPassword.Text = CommonPassword.InitialPassword = m_settings.CommonPassword; CommonPassword.AskToEnterNewPassword = !string.IsNullOrEmpty(CommonPassword.Text); if (EncryptionModule.Items.Count > 0) { bool foundEncryption = false; int defaultIndex = 0; for (int i = 0; i < EncryptionModule.Items.Count; i++) { if (((ComboBoxItemPair <Library.Interface.IEncryption>)EncryptionModule.Items[i]).Value.FilenameExtension == m_settings.CommonPasswordEncryptionModule) { foundEncryption = true; EncryptionModule.SelectedIndex = i; break; } else if (((ComboBoxItemPair <Library.Interface.IEncryption>)EncryptionModule.Items[i]).Value.FilenameExtension == "aes") { defaultIndex = i; } } if (!foundEncryption) { EncryptionModule.SelectedIndex = defaultIndex; } } else { PasswordDefaultsGroup.Enabled = false; } SignatureCacheEnabled.Checked = m_settings.SignatureCacheEnabled; SignatureCachePath.Text = m_settings.SignatureCachePath; CalculateSignatureCacheSize(); StartupDelayDuration.Value = m_settings.StartupDelayDuration; ThreadPriorityPicker.SelectedPriority = m_settings.ThreadPriorityOverride; Bandwidth.UploadLimit = m_settings.UploadSpeedLimit; Bandwidth.DownloadLimit = m_settings.DownloadSpeedLimit; HideDonateButton.Checked = true;//m_settings.HideDonateButton; HideDonateButton.Visible = false; BalloonNotificationLevel.SelectedItem = null; foreach (ComboBoxItemPair <ApplicationSettings.NotificationLevel> p in BalloonNotificationLevel.Items) { if (p.Value == m_settings.BallonNotificationLevel) { BalloonNotificationLevel.SelectedItem = p; break; } } if (string.IsNullOrEmpty(m_settings.DisplayLanguage)) { LanguageSelection.SelectedIndex = 0; } else { try { LanguageSelection.SelectedIndex = -1; System.Globalization.CultureInfo cci = System.Globalization.CultureInfo.GetCultureInfo(m_settings.DisplayLanguage); for (int i = 0; i < LanguageSelection.Items.Count; i++) { if (((ComboBoxItemPair <CultureInfo>)LanguageSelection.Items[i]).Value == cci) { LanguageSelection.SelectedIndex = i; break; } } } catch { LanguageSelection.SelectedIndex = -1; } } try { foreach (Library.Interface.ISettingsControl ic in Library.DynamicLoader.SettingsControlLoader.Modules) { Control c = ic.GetControl(m_settings.CreateDetachedCopy(), Datamodel.SettingExtension.GetExtensions(m_connection, ic.Key)); c.Dock = DockStyle.Fill; TabPage tab = new TabPage(); tab.Text = ic.PageTitle; tab.ToolTipText = ic.PageDescription; tab.Controls.Add(c); tab.Tag = ic; TabContainer.TabPages.Add(tab); } } catch (Exception ex) { MessageBox.Show(this, string.Format(Strings.ApplicationSetup.SettingControlsLoadError, ex.Message), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error); } //Place the license page last TabContainer.TabPages.Remove(LicenseTab); //TabContainer.TabPages.Insert(TabContainer.TabPages.Count, LicenseTab); //drc //string licensePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "licenses"); //List<Duplicati.License.LicenseEntry> licenses = Duplicati.License.LicenseReader.ReadLicenses(licensePath); //licenses.Insert(0, new Duplicati.License.LicenseEntry("Duplicati", System.IO.Path.Combine(licensePath, "duplicati-url.txt"), System.IO.Path.Combine(licensePath, "license.txt"))); //licenses.Insert(0, new Duplicati.License.LicenseEntry("Acknowledgements", System.IO.Path.Combine(licensePath, "duplicati-url.txt"), System.IO.Path.Combine(licensePath, "acknowledgements.txt"))); //LicenseSections.Items.Clear(); //LicenseSections.Items.AddRange(licenses.ToArray()); //LicenseSections.SelectedIndex = -1; //LicenseSections.SelectedIndex = 0; //-drc } finally { m_isUpdating = false; } }