public void ShowOldFiles(UpdateInfo oldUpdate, ReadOnlyCollection <string> updateFiles, string newBasePath) { caption.Text = "Existing version: " + oldUpdate.NewVersion.ToString(); descriptionText.Text = String.Format(CultureInfo.CurrentCulture, "Published: {0:F}\r\n\r\n{1}", oldUpdate.PublishDate, oldUpdate.GetChanges(new Version())); descriptionText.Properties.ReadOnly = true; var filesData = new List <TreeFile>(oldUpdate.Files.Select(uf => new TreeFile(uf, updateFiles, newBasePath)).OrderBy(tf => tf.Name)); filesData.AddRange( GetFolders(filesData.Select(f => f.FullPath)) .Select(d => new TreeFile(d, isFolder: true)) .OrderBy(tf => tf.Name) ); files.RootValue = "/"; files.DataSource = filesData; files.ExpandAll(); }
///<summary>Called on the UI thread to download and apply an update.</summary> ///<returns>True if the update was downloaded and applied.</returns> public static bool ApplyUpdate(UpdateInfo update) { if (Updater.RestartPending) { if (DialogResult.Yes == XtraMessageBox.Show("An update has already been downloaded.\r\nDo you want to restart the program and apply the update?", "Shomrei Torah Billing", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { Application.Exit(); } return(true); } UserLookAndFeel.Default.SkinName = "Office 2010 Blue"; //This must be set here in case we're on the splash thread at launch time. SkinManager.EnableFormSkins(); var parent = (IWin32Window)Program.UIInvoker; //For some reason, I must set the parent to MainForm or it won't be properly modal. var description = update.GetChanges(Checker.CurrentVersion); if (DialogResult.No == XtraMessageBox.Show(parent, "An update is available. Do you want to install it?\r\n\r\nThis update provides the following features:\r\n" + description, "Shomrei Torah Billing", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { return(false); } string updatePath = null; try { if (!ProgressWorker.Execute(parent, ui => { ui.Caption = "Downloading update..."; updatePath = update.DownloadFiles(existingFiles: Program.AppDirectory, organizationId: Config.ReadAttribute("Updates", "OrganizationId"), ui: ui); if (!ui.WasCanceled) { ui.Caption = "Applying update"; } }, true)) { return(false); } } catch (TargetInvocationException tex) { Exception ex = tex.GetBaseException(); if (!Debugger.IsAttached) { Email.Warn("Billing Update Error", "New Version: " + update.NewVersion + "\r\nDescription: \r\n" + description + "\r\n\r\n" + ex); } XtraMessageBox.Show(parent, "An error occurred while downloading the update.\r\n" + ex, "Shomrei Torah Billing", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } if (updatePath == null) { return(false); } //Updates will (usually) include a billing config file, //but I don't want a billing config file at home. if (!File.Exists(Path.Combine(Program.AppDirectory, "ShomreiTorah.Billing.Config.xml"))) { File.Delete(Path.Combine(updatePath, "ShomreiTorah.Billing.Config.xml")); //File.Delete doesn't throw FileNotFound } if (Program.Current.SyncContext != null) //If an update was applied at launch, the database will not have been loaded yet. { Program.Current.SaveDatabase(); } UpdateChecker.ApplyUpdate(updatePath, Program.AppDirectory); try { Email.Default.Send(Email.AlertsAddress, Email.AdminAddress, Environment.UserName + " updated ShomreiTorah.Billing on " + Environment.MachineName, "Old version: " + Checker.CurrentVersion + "\r\n" + "New version: " + update.NewVersion + " (Published on " + update.PublishDate.ToString("F", CultureInfo.InvariantCulture) + ")\r\n\r\nPath: " + Program.AppDirectory + "\r\n\r\nChanges:\r\n" + description + "\r\n\r\nUpdated files:\r\n • " + update.Files.Where(f => !f.Matches(Program.AppDirectory)).Join("\r\n • ", f => f.RelativePath) + "\r\n\r\nPre-update files:\r\n • " + String.Join("\r\n • ", Directory.GetFiles(Program.AppDirectory, "*.*", SearchOption.AllDirectories)) , false); } catch (SmtpException) { } timer.Stop(); //In case we were called by the Update button in MainForm RestartPending = true; var cea = new CancelEventArgs(); Application.Exit(cea); if (cea.Cancel) { XtraMessageBox.Show(parent, "The update will be applied after you exit the program.", "Shomrei Torah Billing"); } return(true); }