Merge pull request #1097 from kc284/REQ-156

CA-217843 + some other issues on the PatchingWizard_SelectPatchPage
This commit is contained in:
Gabor Apati-Nagy 2016-08-09 13:50:18 +01:00 committed by GitHub
commit db4e5e6d6b
11 changed files with 843 additions and 425 deletions

View File

@ -0,0 +1,92 @@
/* Copyright (c) Citrix Systems Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Text;
using XenAdmin.Network;
using XenAdmin.Core;
using System.Linq;
using XenAPI;
namespace XenAdmin.Actions
{
public class RestoreDismissedUpdatesAction : AsyncAction
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public RestoreDismissedUpdatesAction(IXenConnection connection)
: base(connection, "restore_dismissed_updates", "restore_dismissed_updates", true)
{
}
protected override void Run()
{
if (!AllowedToRestoreDismissedUpdates())
return;
XenAPI.Pool pool = Helpers.GetPoolOfOne(Connection);
if (pool == null)
return;
Dictionary<string, string> other_config = pool.other_config;
if (other_config.ContainsKey(IgnorePatchAction.IgnorePatchKey))
other_config.Remove(IgnorePatchAction.IgnorePatchKey);
if (other_config.ContainsKey(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY))
other_config.Remove(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY);
XenAPI.Pool.set_other_config(Connection.Session, pool.opaque_ref, other_config);
}
/// <summary>
/// Checks the user has sufficient RBAC privileges to restore dismissed alerts on a given connection
/// </summary>
private bool AllowedToRestoreDismissedUpdates()
{
if (Connection == null || Connection.Session == null)
return false;
if (Connection.Session.IsLocalSuperuser)
return true;
List<Role> rolesAbleToCompleteAction = Role.ValidRoleList("Pool.set_other_config", Connection);
foreach (Role possibleRole in rolesAbleToCompleteAction)
{
if (Connection.Session.Roles.Contains(possibleRole))
return true;
}
return false;
}
}
}

View File

@ -47,6 +47,7 @@ namespace XenAdmin.Core
public static event Action<bool, string> CheckForUpdatesCompleted;
public static event Action CheckForUpdatesStarted;
public static event Action RestoreDismissedUpdatesStarted;
private static readonly object downloadedUpdatesLock = new object();
private static List<XenServerVersion> XenServerVersionsForAutoCheck = new List<XenServerVersion>();
@ -198,9 +199,8 @@ namespace XenAdmin.Core
Properties.Settings.Default.AllowXenServerUpdates || force,
Properties.Settings.Default.AllowPatchesUpdates || force,
Updates.CheckForUpdatesUrl);
{
action.Completed += actionCompleted;
}
action.Completed += actionCompleted;
if (CheckForUpdatesStarted != null)
CheckForUpdatesStarted();
@ -652,53 +652,28 @@ namespace XenAdmin.Core
public static void RestoreDismissedUpdates()
{
foreach (IXenConnection _connection in ConnectionsManager.XenConnectionsCopy)
{
if (!AllowedToRestoreDismissedUpdates(_connection))
continue;
var actions = new List<AsyncAction>();
foreach (IXenConnection connection in ConnectionsManager.XenConnectionsCopy)
actions.Add(new RestoreDismissedUpdatesAction(connection));
XenAPI.Pool pool = Helpers.GetPoolOfOne(_connection);
if (pool == null)
continue;
var action = new ParallelAction(Messages.RESTORE_DISMISSED_UPDATES, Messages.RESTORING, Messages.COMPLETED, actions, true, false);
action.Completed += action_Completed;
Dictionary<string, string> other_config = pool.other_config;
if (RestoreDismissedUpdatesStarted != null)
RestoreDismissedUpdatesStarted();
if (other_config.ContainsKey(IgnorePatchAction.IgnorePatchKey))
{
other_config.Remove(IgnorePatchAction.IgnorePatchKey);
}
if (other_config.ContainsKey(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY))
{
other_config.Remove(IgnoreServerAction.LAST_SEEN_SERVER_VERSION_KEY);
}
XenAPI.Pool.set_other_config(_connection.Session, pool.opaque_ref, other_config);
}
Properties.Settings.Default.LatestXenCenterSeen = "";
Settings.TrySaveSettings();
Updates.CheckForUpdates(true);
action.RunAsync();
}
/// <summary>
/// Checks the user has sufficient RBAC privileges to restore dismissed alerts on a given connection
/// </summary>
public static bool AllowedToRestoreDismissedUpdates(IXenConnection c)
private static void action_Completed(ActionBase action)
{
if (c == null || c.Session == null)
return false;
if (c.Session.IsLocalSuperuser)
return true;
List<Role> rolesAbleToCompleteAction = Role.ValidRoleList("Pool.set_other_config", c);
foreach (Role possibleRole in rolesAbleToCompleteAction)
Program.Invoke(Program.MainWindow, () =>
{
if (c.Session.Roles.Contains(possibleRole))
return true;
}
return false;
Properties.Settings.Default.LatestXenCenterSeen = "";
Settings.TrySaveSettings();
CheckForUpdates(true);
});
}
}
}

View File

@ -16,6 +16,7 @@
if (disposing)
{
XenAdmin.Core.Updates.DeregisterCollectionChanged(UpdatesCollectionChanged);
XenAdmin.Core.Updates.RestoreDismissedUpdatesStarted -= Updates_RestoreDismissedUpdatesStarted;
XenAdmin.Core.Updates.CheckForUpdatesStarted -= CheckForUpdates_CheckForUpdatesStarted;
XenAdmin.Core.Updates.CheckForUpdatesCompleted -= CheckForUpdates_CheckForUpdatesCompleted;

View File

@ -64,6 +64,7 @@ namespace XenAdmin.TabPages
private List<string> selectedUpdates = new List<string>();
private int checksQueue;
private bool PageWasRefreshed;
private bool CheckForUpdatesInProgress;
public ManageUpdatesPage()
{
@ -74,6 +75,7 @@ namespace XenAdmin.TabPages
dataGridViewUpdates.Sort(ColumnDate, ListSortDirection.Descending);
informationLabel.Click += informationLabel_Click;
Updates.RegisterCollectionChanged(UpdatesCollectionChanged);
Updates.RestoreDismissedUpdatesStarted += Updates_RestoreDismissedUpdatesStarted;
Updates.CheckForUpdatesStarted += CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted += CheckForUpdates_CheckForUpdatesCompleted;
pictureBox1.Image = SystemIcons.Information.ToBitmap();
@ -94,23 +96,35 @@ namespace XenAdmin.TabPages
private void CheckForUpdates_CheckForUpdatesStarted()
{
Program.Invoke(Program.MainWindow, () =>
{
checksQueue++;
if (checksQueue > 1)
return;
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
toolStripButtonRefresh.Enabled = false;
toolStripButtonRestoreDismissed.Enabled = false;
private void Updates_RestoreDismissedUpdatesStarted()
{
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
StoreSelectedUpdates();
dataGridViewUpdates.Rows.Clear();
dataGridViewUpdates.Refresh();
private void StartCheckForUpdates()
{
if (CheckForUpdatesInProgress)
return;
spinningTimer.Start();
tableLayoutPanel3.Visible = true;
labelProgress.Text = Messages.AVAILABLE_UPDATES_SEARCHING;
});
CheckForUpdatesInProgress = true;
checksQueue++;
if (checksQueue > 1)
return;
toolStripButtonRefresh.Enabled = false;
toolStripButtonRestoreDismissed.Enabled = false;
StoreSelectedUpdates();
dataGridViewUpdates.Rows.Clear();
dataGridViewUpdates.Refresh();
spinningTimer.Start();
tableLayoutPanel3.Visible = true;
labelProgress.Text = Messages.AVAILABLE_UPDATES_SEARCHING;
}
private void CheckForUpdates_CheckForUpdatesCompleted(bool succeeded, string errorMessage)
@ -145,6 +159,8 @@ namespace XenAdmin.TabPages
? Messages.AVAILABLE_UPDATES_NOT_FOUND
: errorMessage;
}
CheckForUpdatesInProgress = false;
});
}

View File

@ -33,58 +33,99 @@ namespace XenAdmin.Wizards.PatchingWizard
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PatchingWizard_SelectPatchPage));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.automaticOptionLabel = new System.Windows.Forms.Label();
this.labelWithoutAutomatic = new System.Windows.Forms.Label();
this.labelWithAutomatic = new System.Windows.Forms.Label();
this.AutomaticRadioButton = new System.Windows.Forms.RadioButton();
this.automaticOptionLabel = new System.Windows.Forms.Label();
this.downloadUpdateRadioButton = new System.Windows.Forms.RadioButton();
this.RefreshListButton = new System.Windows.Forms.Button();
this.RestoreDismUpdatesButton = new System.Windows.Forms.Button();
this.selectFromDiskRadioButton = new System.Windows.Forms.RadioButton();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.label2 = new System.Windows.Forms.Label();
this.fileNameTextBox = new System.Windows.Forms.TextBox();
this.BrowseButton = new System.Windows.Forms.Button();
this.selectFromDiskRadioButton = new System.Windows.Forms.RadioButton();
this.downloadUpdateRadioButton = new System.Windows.Forms.RadioButton();
this.label3 = new System.Windows.Forms.Label();
this.RefreshListButton = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel();
this.tableLayoutPanelSpinner = new System.Windows.Forms.TableLayoutPanel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.label1 = new System.Windows.Forms.Label();
this.dataGridViewPatches = new XenAdmin.Controls.DataGridViewEx.DataGridViewEx();
this.ColumnUpdate = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnDescription = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnDate = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.webPageColumn = new System.Windows.Forms.DataGridViewLinkColumn();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.panel1.SuspendLayout();
this.tableLayoutPanelSpinner.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dataGridViewPatches)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel1
//
resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1");
this.tableLayoutPanel1.Controls.Add(this.automaticOptionLabel, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.labelWithoutAutomatic, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.labelWithAutomatic, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.AutomaticRadioButton, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.RestoreDismUpdatesButton, 1, 5);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 7);
this.tableLayoutPanel1.Controls.Add(this.fileNameTextBox, 1, 7);
this.tableLayoutPanel1.Controls.Add(this.BrowseButton, 2, 7);
this.tableLayoutPanel1.Controls.Add(this.selectFromDiskRadioButton, 1, 6);
this.tableLayoutPanel1.Controls.Add(this.automaticOptionLabel, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.downloadUpdateRadioButton, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.dataGridViewPatches, 0, 4);
this.tableLayoutPanel1.Controls.Add(this.RefreshListButton, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.RefreshListButton, 1, 6);
this.tableLayoutPanel1.Controls.Add(this.RestoreDismUpdatesButton, 2, 6);
this.tableLayoutPanel1.Controls.Add(this.selectFromDiskRadioButton, 0, 7);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 8);
this.tableLayoutPanel1.Controls.Add(this.panel1, 1, 5);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
//
// automaticOptionLabel
// labelWithoutAutomatic
//
resources.ApplyResources(this.automaticOptionLabel, "automaticOptionLabel");
this.tableLayoutPanel1.SetColumnSpan(this.automaticOptionLabel, 3);
this.automaticOptionLabel.Name = "automaticOptionLabel";
resources.ApplyResources(this.labelWithoutAutomatic, "labelWithoutAutomatic");
this.tableLayoutPanel1.SetColumnSpan(this.labelWithoutAutomatic, 3);
this.labelWithoutAutomatic.Name = "labelWithoutAutomatic";
//
// labelWithAutomatic
//
resources.ApplyResources(this.labelWithAutomatic, "labelWithAutomatic");
this.tableLayoutPanel1.SetColumnSpan(this.labelWithAutomatic, 3);
this.labelWithAutomatic.Name = "labelWithAutomatic";
//
// AutomaticRadioButton
//
resources.ApplyResources(this.AutomaticRadioButton, "AutomaticRadioButton");
this.AutomaticRadioButton.Checked = true;
this.tableLayoutPanel1.SetColumnSpan(this.AutomaticRadioButton, 3);
this.AutomaticRadioButton.Name = "AutomaticRadioButton";
this.AutomaticRadioButton.TabStop = true;
this.AutomaticRadioButton.UseVisualStyleBackColor = true;
this.AutomaticRadioButton.CheckedChanged += new System.EventHandler(this.AutomaticRadioButton_CheckedChanged);
this.AutomaticRadioButton.TabStopChanged += new System.EventHandler(this.AutomaticRadioButton_TabStopChanged);
//
// automaticOptionLabel
//
resources.ApplyResources(this.automaticOptionLabel, "automaticOptionLabel");
this.tableLayoutPanel1.SetColumnSpan(this.automaticOptionLabel, 2);
this.automaticOptionLabel.Name = "automaticOptionLabel";
//
// downloadUpdateRadioButton
//
resources.ApplyResources(this.downloadUpdateRadioButton, "downloadUpdateRadioButton");
this.tableLayoutPanel1.SetColumnSpan(this.downloadUpdateRadioButton, 3);
this.downloadUpdateRadioButton.Name = "downloadUpdateRadioButton";
this.downloadUpdateRadioButton.UseVisualStyleBackColor = true;
this.downloadUpdateRadioButton.CheckedChanged += new System.EventHandler(this.downloadUpdateRadioButton_CheckedChanged);
this.downloadUpdateRadioButton.TabStopChanged += new System.EventHandler(this.downloadUpdateRadioButton_TabStopChanged);
//
// RefreshListButton
//
resources.ApplyResources(this.RefreshListButton, "RefreshListButton");
this.RefreshListButton.Name = "RefreshListButton";
this.RefreshListButton.UseVisualStyleBackColor = true;
this.RefreshListButton.Click += new System.EventHandler(this.RefreshListButton_Click);
//
// RestoreDismUpdatesButton
//
@ -93,6 +134,24 @@ namespace XenAdmin.Wizards.PatchingWizard
this.RestoreDismUpdatesButton.UseVisualStyleBackColor = true;
this.RestoreDismUpdatesButton.Click += new System.EventHandler(this.RestoreDismUpdatesButton_Click);
//
// selectFromDiskRadioButton
//
resources.ApplyResources(this.selectFromDiskRadioButton, "selectFromDiskRadioButton");
this.tableLayoutPanel1.SetColumnSpan(this.selectFromDiskRadioButton, 3);
this.selectFromDiskRadioButton.Name = "selectFromDiskRadioButton";
this.selectFromDiskRadioButton.UseVisualStyleBackColor = true;
this.selectFromDiskRadioButton.CheckedChanged += new System.EventHandler(this.selectFromDiskRadioButton_CheckedChanged);
this.selectFromDiskRadioButton.TabStopChanged += new System.EventHandler(this.selectFromDiskRadioButton_TabStopChanged);
//
// tableLayoutPanel2
//
resources.ApplyResources(this.tableLayoutPanel2, "tableLayoutPanel2");
this.tableLayoutPanel1.SetColumnSpan(this.tableLayoutPanel2, 2);
this.tableLayoutPanel2.Controls.Add(this.label2, 0, 0);
this.tableLayoutPanel2.Controls.Add(this.fileNameTextBox, 1, 0);
this.tableLayoutPanel2.Controls.Add(this.BrowseButton, 2, 0);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
//
// label2
//
resources.ApplyResources(this.label2, "label2");
@ -112,63 +171,70 @@ namespace XenAdmin.Wizards.PatchingWizard
this.BrowseButton.UseVisualStyleBackColor = true;
this.BrowseButton.Click += new System.EventHandler(this.BrowseButton_Click);
//
// selectFromDiskRadioButton
// panel1
//
resources.ApplyResources(this.selectFromDiskRadioButton, "selectFromDiskRadioButton");
this.tableLayoutPanel1.SetColumnSpan(this.selectFromDiskRadioButton, 4);
this.selectFromDiskRadioButton.Name = "selectFromDiskRadioButton";
this.selectFromDiskRadioButton.UseVisualStyleBackColor = true;
this.selectFromDiskRadioButton.CheckedChanged += new System.EventHandler(this.selectFromDiskRadioButton_CheckedChanged);
this.tableLayoutPanel1.SetColumnSpan(this.panel1, 2);
this.panel1.Controls.Add(this.tableLayoutPanelSpinner);
this.panel1.Controls.Add(this.dataGridViewPatches);
resources.ApplyResources(this.panel1, "panel1");
this.panel1.Name = "panel1";
//
// downloadUpdateRadioButton
// tableLayoutPanelSpinner
//
resources.ApplyResources(this.downloadUpdateRadioButton, "downloadUpdateRadioButton");
this.downloadUpdateRadioButton.Checked = true;
this.tableLayoutPanel1.SetColumnSpan(this.downloadUpdateRadioButton, 3);
this.downloadUpdateRadioButton.Name = "downloadUpdateRadioButton";
this.downloadUpdateRadioButton.TabStop = true;
this.downloadUpdateRadioButton.UseVisualStyleBackColor = true;
this.downloadUpdateRadioButton.CheckedChanged += new System.EventHandler(this.downloadUpdateRadioButton_CheckedChanged);
resources.ApplyResources(this.tableLayoutPanelSpinner, "tableLayoutPanelSpinner");
this.tableLayoutPanelSpinner.BackColor = System.Drawing.SystemColors.Window;
this.tableLayoutPanelSpinner.Controls.Add(this.pictureBox1, 0, 0);
this.tableLayoutPanelSpinner.Controls.Add(this.label1, 1, 0);
this.tableLayoutPanelSpinner.Name = "tableLayoutPanelSpinner";
//
// label3
// pictureBox1
//
resources.ApplyResources(this.label3, "label3");
this.tableLayoutPanel1.SetColumnSpan(this.label3, 3);
this.label3.Name = "label3";
this.pictureBox1.BackColor = System.Drawing.SystemColors.Window;
this.pictureBox1.Image = global::XenAdmin.Properties.Resources.ajax_loader;
resources.ApplyResources(this.pictureBox1, "pictureBox1");
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.TabStop = false;
//
// RefreshListButton
// label1
//
resources.ApplyResources(this.RefreshListButton, "RefreshListButton");
this.RefreshListButton.Name = "RefreshListButton";
this.RefreshListButton.UseVisualStyleBackColor = true;
this.RefreshListButton.Click += new System.EventHandler(this.RefreshListButton_Click);
resources.ApplyResources(this.label1, "label1");
this.label1.BackColor = System.Drawing.SystemColors.Window;
this.label1.Name = "label1";
//
// dataGridViewPatches
//
this.dataGridViewPatches.AllowUserToResizeColumns = false;
this.dataGridViewPatches.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dataGridViewPatches.BackgroundColor = System.Drawing.SystemColors.Window;
this.dataGridViewPatches.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.Raised;
this.dataGridViewPatches.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None;
this.dataGridViewPatches.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridViewPatches.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.ColumnUpdate,
this.ColumnDescription,
this.ColumnDate,
this.webPageColumn});
this.tableLayoutPanel1.SetColumnSpan(this.dataGridViewPatches, 3);
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridViewPatches.DefaultCellStyle = dataGridViewCellStyle4;
resources.ApplyResources(this.dataGridViewPatches, "dataGridViewPatches");
this.dataGridViewPatches.HideSelection = true;
this.dataGridViewPatches.Name = "dataGridViewPatches";
this.dataGridViewPatches.ReadOnly = true;
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridViewPatches.RowHeadersDefaultCellStyle = dataGridViewCellStyle4;
dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridViewPatches.RowsDefaultCellStyle = dataGridViewCellStyle5;
dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dataGridViewPatches.RowHeadersDefaultCellStyle = dataGridViewCellStyle5;
dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridViewPatches.RowsDefaultCellStyle = dataGridViewCellStyle6;
this.dataGridViewPatches.RowTemplate.Resizable = System.Windows.Forms.DataGridViewTriState.True;
this.dataGridViewPatches.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridViewPatches_CellContentClick);
this.dataGridViewPatches.CellMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dataGridViewPatches_CellMouseClick);
@ -227,6 +293,13 @@ namespace XenAdmin.Wizards.PatchingWizard
this.Name = "PatchingWizard_SelectPatchPage";
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout();
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel2.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.tableLayoutPanelSpinner.ResumeLayout(false);
this.tableLayoutPanelSpinner.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dataGridViewPatches)).EndInit();
this.ResumeLayout(false);
@ -242,7 +315,7 @@ namespace XenAdmin.Wizards.PatchingWizard
private System.Windows.Forms.RadioButton selectFromDiskRadioButton;
private System.Windows.Forms.Button RefreshListButton;
private System.Windows.Forms.RadioButton downloadUpdateRadioButton;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label labelWithAutomatic;
private System.Windows.Forms.Button RestoreDismUpdatesButton;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnUpdate;
private System.Windows.Forms.DataGridViewTextBoxColumn ColumnDescription;
@ -250,5 +323,11 @@ namespace XenAdmin.Wizards.PatchingWizard
private System.Windows.Forms.DataGridViewLinkColumn webPageColumn;
private System.Windows.Forms.Label automaticOptionLabel;
private System.Windows.Forms.RadioButton AutomaticRadioButton;
private System.Windows.Forms.Label labelWithoutAutomatic;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanelSpinner;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label label1;
}
}

View File

@ -36,7 +36,6 @@ using System.Windows.Forms;
using XenAdmin.Controls;
using XenAdmin.Controls.DataGridViewEx;
using XenAdmin.Core;
using XenAdmin.Network;
using XenAdmin.Properties;
using XenAPI;
using System.ComponentModel;
@ -59,34 +58,51 @@ namespace XenAdmin.Wizards.PatchingWizard
public PatchingWizard_SelectPatchPage()
{
InitializeComponent();
PopulatePatchesBox();
tableLayoutPanelSpinner.Visible = false;
labelWithAutomatic.Visible = automaticOptionLabel.Visible = AutomaticRadioButton.Visible = false;
downloadUpdateRadioButton.Checked = true;
dataGridViewPatches.Sort(ColumnDate, ListSortDirection.Descending);
}
private void CheckForUpdates_CheckForUpdatesStarted()
{
Program.Invoke(Program.MainWindow, () =>
{
RestoreDismUpdatesButton.Enabled = false;
RefreshListButton.Enabled = false;
});
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
private void Updates_RestoreDismissedUpdatesStarted()
{
Program.Invoke(Program.MainWindow, StartCheckForUpdates);
}
private void StartCheckForUpdates()
{
if (CheckForUpdatesInProgress)
return;
CheckForUpdatesInProgress = true;
dataGridViewPatches.Rows.Clear();
dataGridViewPatches.Focus();
tableLayoutPanelSpinner.Visible = true;
RestoreDismUpdatesButton.Enabled = false;
RefreshListButton.Enabled = false;
OnPageUpdated();
}
private void CheckForUpdates_CheckForUpdatesCompleted(bool succeeded, string errorMessage)
{
Program.Invoke(Program.MainWindow, delegate
{
tableLayoutPanelSpinner.Visible = false;
if (!IsInAutomaticMode)
{
PopulatePatchesBox();
}
RefreshListButton.Enabled = true;
RestoreDismUpdatesButton.Enabled = true;
CheckForUpdatesInProgress = false;
OnPageUpdated();
RestoreDismUpdatesButton.Enabled = true;
});
}
@ -126,18 +142,27 @@ namespace XenAdmin.Wizards.PatchingWizard
public override void PageLoaded(PageLoadedDirection direction)
{
base.PageLoaded(direction);
RefreshListButton.Enabled = true;
Updates.CheckForUpdatesStarted += CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted += CheckForUpdates_CheckForUpdatesCompleted;
Updates.RestoreDismissedUpdatesStarted += Updates_RestoreDismissedUpdatesStarted;
if (direction == PageLoadedDirection.Forward)
{
//if any connected host is licensed for automatic updating
bool autoUpdatePossible = ConnectionsManager.XenConnectionsCopy.Any(c => c != null && c.Cache.Hosts.Any(h => !Host.RestrictBatchHotfixApply(h)));
labelWithAutomatic.Visible = automaticOptionLabel.Visible = AutomaticRadioButton.Visible = autoUpdatePossible;
labelWithoutAutomatic.Visible = !autoUpdatePossible;
AutomaticRadioButton.Checked = autoUpdatePossible;
downloadUpdateRadioButton.Checked = !autoUpdatePossible;
PopulatePatchesBox();
UpdateEnablement();
OnPageUpdated();
}
}
public bool IsInAutomaticMode { get { return AutomaticRadioButton.Checked && AutomaticRadioButton.Enabled; } }
public bool IsInAutomaticMode { get { return AutomaticRadioButton.Visible && AutomaticRadioButton.Checked; } }
public override void PageLeave(PageLoadedDirection direction, ref bool cancel)
{
@ -185,20 +210,21 @@ namespace XenAdmin.Wizards.PatchingWizard
else //In Automatic Mode
{
var downloadUpdatesAction = new DownloadUpdatesXmlAction(false, true, true, Updates.CheckForUpdatesUrl);
var dialog = new ActionProgressDialog(downloadUpdatesAction, ProgressBarStyle.Marquee);
dialog.ShowDialog(this.Parent); //Will block until dialog closes, action completed
using (var dialog = new ActionProgressDialog(downloadUpdatesAction, ProgressBarStyle.Marquee))
dialog.ShowDialog(this.Parent); //Will block until dialog closes, action completed
if (!downloadUpdatesAction.Succeeded)
{
cancel = true;
}
}
}
if (!cancel) //unsubscribe only if we are really leaving this page
{
Updates.RestoreDismissedUpdatesStarted -= Updates_RestoreDismissedUpdatesStarted;
Updates.CheckForUpdatesStarted -= CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted -= CheckForUpdates_CheckForUpdatesCompleted;
}
base.PageLeave(direction, ref cancel);
@ -258,6 +284,8 @@ namespace XenAdmin.Wizards.PatchingWizard
public override void PageCancelled()
{
Updates.RestoreDismissedUpdatesStarted -= Updates_RestoreDismissedUpdatesStarted;
Updates.CheckForUpdatesStarted -= CheckForUpdates_CheckForUpdatesStarted;
Updates.CheckForUpdatesCompleted -= CheckForUpdates_CheckForUpdatesCompleted;
}
@ -294,6 +322,11 @@ namespace XenAdmin.Wizards.PatchingWizard
return false;
}
public override bool EnablePrevious()
{
return !CheckForUpdatesInProgress;
}
private string UpdateExtension
{
get { return "." + Branding.Update; }
@ -305,18 +338,6 @@ namespace XenAdmin.Wizards.PatchingWizard
return !string.IsNullOrEmpty(fileName) && File.Exists(fileName) && (fileName.EndsWith(UpdateExtension) || fileName.EndsWith(".iso"));
}
private void UpdateEnablement()
{
dataGridViewPatches.HideSelection = !downloadUpdateRadioButton.Checked;
//if any connected host is licensed for automatic updating
if (ConnectionsManager.XenConnectionsCopy.Any(c => c != null && c.Cache.Hosts.Any(h => !Host.RestrictBatchHotfixApply(h))))
automaticOptionLabel.Visible = AutomaticRadioButton.Visible = true;
OnPageUpdated();
}
private void BrowseButton_Click(object sender, EventArgs e)
{
// Showing this dialog has the (undocumented) side effect of changing the working directory
@ -328,18 +349,19 @@ namespace XenAdmin.Wizards.PatchingWizard
try
{
oldDir = Directory.GetCurrentDirectory();
OpenFileDialog dlg = new OpenFileDialog();
dlg.Multiselect = false;
dlg.ShowReadOnly = false;
dlg.Filter = string.Format(Messages.PATCHINGWIZARD_SELECTPATCHPAGE_UPDATESEXT, Branding.Update);
dlg.FilterIndex = 0;
dlg.CheckFileExists = true;
dlg.ShowHelp = false;
dlg.Title = Messages.PATCHINGWIZARD_SELECTPATCHPAGE_CHOOSE;
if (dlg.ShowDialog(this) == DialogResult.OK && dlg.CheckFileExists)
using (OpenFileDialog dlg = new OpenFileDialog
{
Multiselect = false,
ShowReadOnly = false,
Filter = string.Format(Messages.PATCHINGWIZARD_SELECTPATCHPAGE_UPDATESEXT, Branding.Update),
FilterIndex = 0,
CheckFileExists = true,
ShowHelp = false,
Title = Messages.PATCHINGWIZARD_SELECTPATCHPAGE_CHOOSE
})
{
AddFile(dlg.FileName);
if (dlg.ShowDialog(this) == DialogResult.OK && dlg.CheckFileExists)
AddFile(dlg.FileName);
}
OnPageUpdated();
}
@ -390,15 +412,11 @@ namespace XenAdmin.Wizards.PatchingWizard
}
}
#region DataGridView
private void dataGridViewPatches_SelectionChanged(object sender, EventArgs e)
{
UpdateEnablement();
}
private void fileNameTextBox_TextChanged(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
UpdateEnablement();
OnPageUpdated();
}
private void dataGridViewPatches_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
@ -411,26 +429,11 @@ namespace XenAdmin.Wizards.PatchingWizard
return;
PatchGridViewRow row = (PatchGridViewRow)dataGridViewPatches.Rows[e.RowIndex];
row.toggleExpandedState();
UpdateEnablement();
}
private void RefreshListButton_Click(object sender, EventArgs e)
{
dataGridViewPatches.Focus();
CheckForUpdatesInProgress = true;
Updates.CheckForUpdates(true);
PopulatePatchesBox();
}
private void selectFromDiskRadioButton_CheckedChanged(object sender, EventArgs e)
{
UpdateEnablement();
OnPageUpdated();
}
private void dataGridViewPatches_SortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
Alert alert1 = ((PatchGridViewRow)dataGridViewPatches.Rows[e.RowIndex1]).UpdateAlert;
Alert alert2 = ((PatchGridViewRow)dataGridViewPatches.Rows[e.RowIndex2]).UpdateAlert;
@ -448,14 +451,9 @@ namespace XenAdmin.Wizards.PatchingWizard
PopulatePatchesBox();
}
private void fileNameTextBox_Enter(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
UpdateEnablement();
}
private void dataGridViewPatches_CellContentClick(object sender, DataGridViewCellEventArgs e)
{ // The click is on a column header
{
// The click is on a column header
if (e.RowIndex == -1)
{
return;
@ -464,14 +462,13 @@ namespace XenAdmin.Wizards.PatchingWizard
if (row != null && e.ColumnIndex == 3)
{
row.UpdateAlert.FixLinkAction();
return;
}
}
private void dataGridViewPatches_Enter(object sender, EventArgs e)
{
downloadUpdateRadioButton.Checked = true;
UpdateEnablement();
OnPageUpdated();
}
private class PatchGridViewRow : DataGridViewExRow, IEquatable<PatchGridViewRow>
@ -599,21 +596,81 @@ namespace XenAdmin.Wizards.PatchingWizard
}
}
#endregion
#region Buttons
private void RestoreDismUpdatesButton_Click(object sender, EventArgs e)
{
Updates.RestoreDismissedUpdates();
}
private void RefreshListButton_Click(object sender, EventArgs e)
{
Updates.CheckForUpdates(true);
}
#endregion
#region TextBox
private void fileNameTextBox_Enter(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
OnPageUpdated();
}
private void fileNameTextBox_TextChanged(object sender, EventArgs e)
{
selectFromDiskRadioButton.Checked = true;
OnPageUpdated();
}
#endregion
#region RadioButtons
private void AutomaticRadioButton_CheckedChanged(object sender, EventArgs e)
{
UpdateEnablement();
OnPageUpdated();
}
private void downloadUpdateRadioButton_CheckedChanged(object sender, EventArgs e)
{
UpdateEnablement();
}
dataGridViewPatches.HideSelection = !downloadUpdateRadioButton.Checked;
if (downloadUpdateRadioButton.Checked)
dataGridViewPatches.Focus();
OnPageUpdated();
}
private void selectFromDiskRadioButton_CheckedChanged(object sender, EventArgs e)
{
OnPageUpdated();
}
private void AutomaticRadioButton_TabStopChanged(object sender, EventArgs e)
{
if (!AutomaticRadioButton.TabStop)
AutomaticRadioButton.TabStop = true;
}
private void downloadUpdateRadioButton_TabStopChanged(object sender, EventArgs e)
{
if (!downloadUpdateRadioButton.TabStop)
downloadUpdateRadioButton.TabStop = true;
}
private void selectFromDiskRadioButton_TabStopChanged(object sender, EventArgs e)
{
if (!selectFromDiskRadioButton.TabStop)
selectFromDiskRadioButton.TabStop = true;
}
#endregion
}
public enum UpdateType { NewRetail, Existing, NewSuppPack}
}
}

View File

@ -121,49 +121,79 @@
<data name="tableLayoutPanel1.ColumnCount" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="automaticOptionLabel.AutoSize" type="System.Boolean, mscorlib">
<data name="labelWithoutAutomatic.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="automaticOptionLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<data name="labelWithoutAutomatic.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="automaticOptionLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="labelWithoutAutomatic.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="automaticOptionLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 65</value>
<data name="labelWithoutAutomatic.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 40</value>
</data>
<data name="automaticOptionLabel.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 3, 3, 3</value>
<data name="labelWithoutAutomatic.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 0, 3, 6</value>
</data>
<data name="automaticOptionLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>562, 26</value>
<data name="labelWithoutAutomatic.Size" type="System.Drawing.Size, System.Drawing">
<value>745, 17</value>
</data>
<data name="automaticOptionLabel.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
<data name="labelWithoutAutomatic.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="automaticOptionLabel.Text" xml:space="preserve">
<value>[XenCenter] will &amp;automatically download and install all current updates from [Citrix], usually with only a single reboot at the end.</value>
<data name="labelWithoutAutomatic.Text" xml:space="preserve">
<value>Select an update to be downloaded from [Citrix], or browse your computer for an update or supplemental pack file.</value>
</data>
<data name="automaticOptionLabel.Visible" type="System.Boolean, mscorlib">
<value>False</value>
<data name="&gt;&gt;labelWithoutAutomatic.Name" xml:space="preserve">
<value>labelWithoutAutomatic</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Name" xml:space="preserve">
<value>automaticOptionLabel</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Type" xml:space="preserve">
<data name="&gt;&gt;labelWithoutAutomatic.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Parent" xml:space="preserve">
<data name="&gt;&gt;labelWithoutAutomatic.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.ZOrder" xml:space="preserve">
<data name="&gt;&gt;labelWithoutAutomatic.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="AutomaticRadioButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left</value>
<data name="labelWithAutomatic.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="labelWithAutomatic.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="labelWithAutomatic.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="labelWithAutomatic.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
</data>
<data name="labelWithAutomatic.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 0, 3, 6</value>
</data>
<data name="labelWithAutomatic.Size" type="System.Drawing.Size, System.Drawing">
<value>745, 34</value>
</data>
<data name="labelWithAutomatic.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="labelWithAutomatic.Text" xml:space="preserve">
<value>Select Automatic mode or choose an update to be downloaded from [Citrix], or browse your computer for an update or supplemental pack file.</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.Name" xml:space="preserve">
<value>labelWithAutomatic</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;labelWithAutomatic.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="AutomaticRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -172,25 +202,19 @@
<value>NoControl</value>
</data>
<data name="AutomaticRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 42</value>
<value>3, 75</value>
</data>
<data name="AutomaticRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 16, 3, 3</value>
</data>
<data name="AutomaticRadioButton.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>No</value>
<value>3, 12, 3, 3</value>
</data>
<data name="AutomaticRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>72, 17</value>
<value>91, 21</value>
</data>
<data name="AutomaticRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>10</value>
<value>2</value>
</data>
<data name="AutomaticRadioButton.Text" xml:space="preserve">
<value>Automatic</value>
</data>
<data name="AutomaticRadioButton.Visible" type="System.Boolean, mscorlib">
<value>False</value>
<value>&amp;Automatic</value>
</data>
<data name="&gt;&gt;AutomaticRadioButton.Name" xml:space="preserve">
<value>AutomaticRadioButton</value>
@ -202,25 +226,121 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;AutomaticRadioButton.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="RestoreDismUpdatesButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
<data name="automaticOptionLabel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="automaticOptionLabel.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="automaticOptionLabel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="automaticOptionLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 99</value>
</data>
<data name="automaticOptionLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>725, 34</value>
</data>
<data name="automaticOptionLabel.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="automaticOptionLabel.Text" xml:space="preserve">
<value>[XenCenter] will automatically download and install all current updates from [Citrix], usually with only a single reboot at the end.</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Name" xml:space="preserve">
<value>automaticOptionLabel</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;automaticOptionLabel.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="downloadUpdateRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="downloadUpdateRadioButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="downloadUpdateRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 145</value>
</data>
<data name="downloadUpdateRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 12, 3, 3</value>
</data>
<data name="downloadUpdateRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>213, 21</value>
</data>
<data name="downloadUpdateRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="downloadUpdateRadioButton.Text" xml:space="preserve">
<value>&amp;Download update from [Citrix]</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Name" xml:space="preserve">
<value>downloadUpdateRadioButton</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="RefreshListButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="RefreshListButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="RefreshListButton.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 429</value>
</data>
<data name="RefreshListButton.Size" type="System.Drawing.Size, System.Drawing">
<value>94, 27</value>
</data>
<data name="RefreshListButton.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="RefreshListButton.Text" xml:space="preserve">
<value>&amp;Refresh List</value>
</data>
<data name="&gt;&gt;RefreshListButton.Name" xml:space="preserve">
<value>RefreshListButton</value>
</data>
<data name="&gt;&gt;RefreshListButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;RefreshListButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;RefreshListButton.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="RestoreDismUpdatesButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="RestoreDismUpdatesButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="RestoreDismUpdatesButton.Location" type="System.Drawing.Point, System.Drawing">
<value>118, 337</value>
<value>123, 429</value>
</data>
<data name="RestoreDismUpdatesButton.Size" type="System.Drawing.Size, System.Drawing">
<value>178, 23</value>
<value>193, 27</value>
</data>
<data name="RestoreDismUpdatesButton.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
<value>7</value>
</data>
<data name="RestoreDismUpdatesButton.Text" xml:space="preserve">
<value>Restore &amp;Dismissed Updates</value>
<value>Restore Dismissed &amp;Updates</value>
</data>
<data name="&gt;&gt;RestoreDismUpdatesButton.Name" xml:space="preserve">
<value>RestoreDismUpdatesButton</value>
@ -232,101 +352,8 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;RestoreDismUpdatesButton.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="label2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 404</value>
</data>
<data name="label2.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 5, 3, 0</value>
</data>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 13</value>
</data>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
</data>
<data name="label2.Text" xml:space="preserve">
<value>&amp;Filename:</value>
</data>
<data name="label2.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="fileNameTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Left, Right</value>
</data>
<data name="fileNameTextBox.Location" type="System.Drawing.Point, System.Drawing">
<value>118, 402</value>
</data>
<data name="fileNameTextBox.Size" type="System.Drawing.Size, System.Drawing">
<value>388, 20</value>
</data>
<data name="fileNameTextBox.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Name" xml:space="preserve">
<value>fileNameTextBox</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;fileNameTextBox.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="BrowseButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BrowseButton.Location" type="System.Drawing.Point, System.Drawing">
<value>512, 402</value>
</data>
<data name="BrowseButton.Size" type="System.Drawing.Size, System.Drawing">
<value>70, 22</value>
</data>
<data name="BrowseButton.TabIndex" type="System.Int32, mscorlib">
<value>8</value>
</data>
<data name="BrowseButton.Text" xml:space="preserve">
<value>&amp;Browse...</value>
</data>
<data name="&gt;&gt;BrowseButton.Name" xml:space="preserve">
<value>BrowseButton</value>
</data>
<data name="&gt;&gt;BrowseButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BrowseButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;BrowseButton.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="selectFromDiskRadioButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Bottom, Left</value>
</data>
<data name="selectFromDiskRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@ -334,16 +361,16 @@
<value>NoControl</value>
</data>
<data name="selectFromDiskRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 379</value>
<value>3, 471</value>
</data>
<data name="selectFromDiskRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 16, 3, 3</value>
<value>3, 12, 3, 3</value>
</data>
<data name="selectFromDiskRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>240, 17</value>
<value>316, 21</value>
</data>
<data name="selectFromDiskRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
<value>8</value>
</data>
<data name="selectFromDiskRadioButton.Text" xml:space="preserve">
<value>&amp;Select update or supplemental pack from disk</value>
@ -358,80 +385,230 @@
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;selectFromDiskRadioButton.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="downloadUpdateRadioButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left</value>
</data>
<data name="downloadUpdateRadioButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="downloadUpdateRadioButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="downloadUpdateRadioButton.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 110</value>
</data>
<data name="downloadUpdateRadioButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 16, 3, 3</value>
</data>
<data name="downloadUpdateRadioButton.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>No</value>
</data>
<data name="downloadUpdateRadioButton.Size" type="System.Drawing.Size, System.Drawing">
<value>163, 17</value>
</data>
<data name="downloadUpdateRadioButton.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="downloadUpdateRadioButton.Text" xml:space="preserve">
<value>Download &amp;update from [Citrix]</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Name" xml:space="preserve">
<value>downloadUpdateRadioButton</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;downloadUpdateRadioButton.ZOrder" xml:space="preserve">
<value>7</value>
</data>
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
<data name="tableLayoutPanel2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label3.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
<data name="tableLayoutPanel2.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
<value>GrowAndShrink</value>
</data>
<data name="label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<data name="tableLayoutPanel2.ColumnCount" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="label2.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left</value>
</data>
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 0</value>
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 8</value>
</data>
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
<value>595, 26</value>
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 17</value>
</data>
<data name="label3.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
<data name="label2.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="label3.Text" xml:space="preserve">
<value>Select Automatic mode or manually select an update to be downloaded from [Citrix], or browse an update or supplemental pack file from your computer.</value>
<data name="label2.Text" xml:space="preserve">
<value>&amp;Filename:</value>
</data>
<data name="&gt;&gt;label3.Name" xml:space="preserve">
<value>label3</value>
<data name="label2.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleLeft</value>
</data>
<data name="&gt;&gt;label3.Type" xml:space="preserve">
<data name="&gt;&gt;label2.Name" xml:space="preserve">
<value>label2</value>
</data>
<data name="&gt;&gt;label2.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label3.Parent" xml:space="preserve">
<data name="&gt;&gt;label2.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;label2.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="fileNameTextBox.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left, Right</value>
</data>
<data name="fileNameTextBox.Location" type="System.Drawing.Point, System.Drawing">
<value>78, 5</value>
</data>
<data name="fileNameTextBox.Size" type="System.Drawing.Size, System.Drawing">
<value>562, 22</value>
</data>
<data name="fileNameTextBox.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Name" xml:space="preserve">
<value>fileNameTextBox</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;fileNameTextBox.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;fileNameTextBox.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="BrowseButton.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="BrowseButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="BrowseButton.Location" type="System.Drawing.Point, System.Drawing">
<value>646, 3</value>
</data>
<data name="BrowseButton.Size" type="System.Drawing.Size, System.Drawing">
<value>76, 27</value>
</data>
<data name="BrowseButton.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="BrowseButton.Text" xml:space="preserve">
<value>&amp;Browse...</value>
</data>
<data name="&gt;&gt;BrowseButton.Name" xml:space="preserve">
<value>BrowseButton</value>
</data>
<data name="&gt;&gt;BrowseButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;BrowseButton.Parent" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;BrowseButton.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="tableLayoutPanel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="tableLayoutPanel2.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 498</value>
</data>
<data name="tableLayoutPanel2.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tableLayoutPanel2.Size" type="System.Drawing.Size, System.Drawing">
<value>725, 33</value>
</data>
<data name="tableLayoutPanel2.TabIndex" type="System.Int32, mscorlib">
<value>9</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Name" xml:space="preserve">
<value>tableLayoutPanel2</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanel2.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;label3.ZOrder" xml:space="preserve">
<data name="&gt;&gt;tableLayoutPanel2.ZOrder" xml:space="preserve">
<value>8</value>
</data>
<data name="tableLayoutPanel2.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="label2" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="fileNameTextBox" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="BrowseButton" Row="0" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,Percent,100,AutoSize,0" /&gt;&lt;Rows Styles="AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<data name="tableLayoutPanelSpinner.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>None</value>
</data>
<data name="tableLayoutPanelSpinner.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="tableLayoutPanelSpinner.AutoSizeMode" type="System.Windows.Forms.AutoSizeMode, System.Windows.Forms">
<value>GrowAndShrink</value>
</data>
<data name="tableLayoutPanelSpinner.ColumnCount" type="System.Int32, mscorlib">
<value>2</value>
</data>
<data name="pictureBox1.Location" type="System.Drawing.Point, System.Drawing">
<value>3, 3</value>
</data>
<data name="pictureBox1.Size" type="System.Drawing.Size, System.Drawing">
<value>16, 16</value>
</data>
<data name="pictureBox1.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
<value>AutoSize</value>
</data>
<data name="pictureBox1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="&gt;&gt;pictureBox1.Name" xml:space="preserve">
<value>pictureBox1</value>
</data>
<data name="&gt;&gt;pictureBox1.Type" xml:space="preserve">
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;pictureBox1.Parent" xml:space="preserve">
<value>tableLayoutPanelSpinner</value>
</data>
<data name="&gt;&gt;pictureBox1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="label1.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Left, Right</value>
</data>
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
<value>25, 2</value>
</data>
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
<value>154, 17</value>
</data>
<data name="label1.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="label1.Text" xml:space="preserve">
<value>Checking for updates...</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>tableLayoutPanelSpinner</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="tableLayoutPanelSpinner.Location" type="System.Drawing.Point, System.Drawing">
<value>253, 112</value>
</data>
<data name="tableLayoutPanelSpinner.RowCount" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="tableLayoutPanelSpinner.Size" type="System.Drawing.Size, System.Drawing">
<value>182, 22</value>
</data>
<data name="tableLayoutPanelSpinner.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.Name" xml:space="preserve">
<value>tableLayoutPanelSpinner</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.Type" xml:space="preserve">
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.Parent" xml:space="preserve">
<value>panel1</value>
</data>
<data name="&gt;&gt;tableLayoutPanelSpinner.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tableLayoutPanelSpinner.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="pictureBox1" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="label1" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="AutoSize,0,AutoSize,0" /&gt;&lt;Rows Styles="AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="ColumnUpdate.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
@ -442,7 +619,7 @@
<value>50</value>
</data>
<data name="ColumnUpdate.Width" type="System.Int32, mscorlib">
<value>67</value>
<value>83</value>
</data>
<metadata name="ColumnDescription.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
@ -481,19 +658,16 @@
<value>Fill</value>
</data>
<data name="dataGridViewPatches.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 133</value>
</data>
<data name="dataGridViewPatches.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 3, 3, 3</value>
<value>0, 0</value>
</data>
<data name="dataGridViewPatches.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
<value>Vertical</value>
</data>
<data name="dataGridViewPatches.Size" type="System.Drawing.Size, System.Drawing">
<value>562, 198</value>
<value>725, 251</value>
</data>
<data name="dataGridViewPatches.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
<value>0</value>
</data>
<data name="&gt;&gt;dataGridViewPatches.Name" xml:space="preserve">
<value>dataGridViewPatches</value>
@ -502,43 +676,34 @@
<value>XenAdmin.Controls.DataGridViewEx.DataGridViewEx, XenCenterMain, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null</value>
</data>
<data name="&gt;&gt;dataGridViewPatches.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
<value>panel1</value>
</data>
<data name="&gt;&gt;dataGridViewPatches.ZOrder" xml:space="preserve">
<value>9</value>
<value>1</value>
</data>
<data name="RefreshListButton.Anchor" type="System.Windows.Forms.AnchorStyles, System.Windows.Forms">
<value>Top, Bottom, Left</value>
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
</data>
<data name="RefreshListButton.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 172</value>
</data>
<data name="RefreshListButton.Location" type="System.Drawing.Point, System.Drawing">
<value>36, 337</value>
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
<value>725, 251</value>
</data>
<data name="RefreshListButton.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>36, 3, 3, 3</value>
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
</data>
<data name="RefreshListButton.Size" type="System.Drawing.Size, System.Drawing">
<value>71, 23</value>
<data name="&gt;&gt;panel1.Name" xml:space="preserve">
<value>panel1</value>
</data>
<data name="RefreshListButton.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
<data name="&gt;&gt;panel1.Type" xml:space="preserve">
<value>System.Windows.Forms.Panel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="RefreshListButton.Text" xml:space="preserve">
<value>&amp;Refresh List</value>
</data>
<data name="&gt;&gt;RefreshListButton.Name" xml:space="preserve">
<value>RefreshListButton</value>
</data>
<data name="&gt;&gt;RefreshListButton.Type" xml:space="preserve">
<value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;RefreshListButton.Parent" xml:space="preserve">
<data name="&gt;&gt;panel1.Parent" xml:space="preserve">
<value>tableLayoutPanel1</value>
</data>
<data name="&gt;&gt;RefreshListButton.ZOrder" xml:space="preserve">
<value>10</value>
<data name="&gt;&gt;panel1.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="tableLayoutPanel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value>
@ -550,10 +715,10 @@
<value>9</value>
</data>
<data name="tableLayoutPanel1.Size" type="System.Drawing.Size, System.Drawing">
<value>601, 427</value>
<value>751, 534</value>
</data>
<data name="tableLayoutPanel1.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
<value>0</value>
</data>
<data name="&gt;&gt;tableLayoutPanel1.Name" xml:space="preserve">
<value>tableLayoutPanel1</value>
@ -568,16 +733,19 @@
<value>0</value>
</data>
<data name="tableLayoutPanel1.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="automaticOptionLabel" Row="3" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="AutomaticRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="RestoreDismUpdatesButton" Row="5" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="label2" Row="7" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;Control Name="fileNameTextBox" Row="7" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="BrowseButton" Row="7" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;Control Name="selectFromDiskRadioButton" Row="6" RowSpan="1" Column="1" ColumnSpan="4" /&gt;&lt;Control Name="downloadUpdateRadioButton" Row="4" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="label3" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="dataGridViewPatches" Row="4" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="RefreshListButton" Row="5" RowSpan="1" Column="0" ColumnSpan="1" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Absolute,115,Percent,100,Absolute,92" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Percent,100,AutoSize,0,AutoSize,0,AutoSize,0,Absolute,20" /&gt;&lt;/TableLayoutSettings&gt;</value>
<value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;TableLayoutSettings&gt;&lt;Controls&gt;&lt;Control Name="labelWithoutAutomatic" Row="1" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="labelWithAutomatic" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="AutomaticRadioButton" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="automaticOptionLabel" Row="3" RowSpan="1" Column="1" ColumnSpan="2" /&gt;&lt;Control Name="downloadUpdateRadioButton" Row="4" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="RefreshListButton" Row="6" RowSpan="1" Column="1" ColumnSpan="1" /&gt;&lt;Control Name="RestoreDismUpdatesButton" Row="6" RowSpan="1" Column="2" ColumnSpan="1" /&gt;&lt;Control Name="selectFromDiskRadioButton" Row="7" RowSpan="1" Column="0" ColumnSpan="3" /&gt;&lt;Control Name="tableLayoutPanel2" Row="8" RowSpan="1" Column="1" ColumnSpan="2" /&gt;&lt;Control Name="panel1" Row="5" RowSpan="1" Column="1" ColumnSpan="2" /&gt;&lt;/Controls&gt;&lt;Columns Styles="Absolute,20,AutoSize,0,Percent,100,Absolute,20" /&gt;&lt;Rows Styles="AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,AutoSize,0,Percent,100,AutoSize,0,AutoSize,0,AutoSize,0" /&gt;&lt;/TableLayoutSettings&gt;</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>
<value>120, 120</value>
</data>
<data name="$this.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 4, 4, 4</value>
</data>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
<value>601, 427</value>
<value>751, 534</value>
</data>
<data name="&gt;&gt;ColumnUpdate.Name" xml:space="preserve">
<value>ColumnUpdate</value>

View File

@ -97,6 +97,7 @@
<Compile Include="Actions\GUIActions\ExportResourceReportAction.cs" />
<Compile Include="Actions\GUIActions\DeleteAllAlertsAction.cs" />
<Compile Include="Actions\GUIActions\ExternalPluginAction.cs" />
<Compile Include="Actions\GUIActions\RestoreDismissedUpdatesAction.cs" />
<Compile Include="Actions\GUIActions\MeddlingAction.cs" />
<Compile Include="Actions\GUIActions\IgnoreServerAction.cs" />
<Compile Include="Actions\GUIActions\IgnorePatchAction.cs" />

View File

@ -166,9 +166,12 @@ namespace XenAdmin.Actions
lock (_lock)
{
i++;
PercentComplete = 100 * i / subActions.Count;
if (i == subActions.Count)
int totalCount = actionsByConnection.Count + actionsWithNoConnection.Count;
PercentComplete = 100 * i / totalCount;
if (i == totalCount)
{
Monitor.Pulse(_lock);
}
}
}

View File

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.34209
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@ -26099,7 +26099,7 @@ namespace XenAdmin {
}
/// <summary>
/// Looks up a localized string similar to This server cannot be updated automatically..
/// Looks up a localized string similar to This server cannot be updated automatically.
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_NOT_AUTO_UPGRADABLE {
get {
@ -26135,7 +26135,8 @@ namespace XenAdmin {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Select one or more pools or standalone hosts that you want to have automatically updated.
///Greyed out servers cannot be updated automatically..
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_AUTOMATIC_MODE {
get {
@ -26144,7 +26145,8 @@ namespace XenAdmin {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Select one or more servers from the list of available servers.
///Servers where the selected update cannot be applied appear disabled in this list..
/// </summary>
public static string PATCHINGWIZARD_SELECTSERVERPAGGE_RUBRIC_DEFAULT {
get {
@ -28312,6 +28314,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Restore dismissed updates.
/// </summary>
public static string RESTORE_DISMISSED_UPDATES {
get {
return ResourceManager.GetString("RESTORE_DISMISSED_UPDATES", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Backup file loaded to server &apos;{0}&apos;. Refer to the &quot;[XenServer product] Administrator&apos;s Guide&quot; for instructions on how to complete the restore procedure..
/// </summary>
@ -28330,6 +28341,15 @@ namespace XenAdmin {
}
}
/// <summary>
/// Looks up a localized string similar to Restoring....
/// </summary>
public static string RESTORING {
get {
return ResourceManager.GetString("RESTORING", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Restoring server &apos;{0}&apos;.
/// </summary>

View File

@ -9022,7 +9022,7 @@ However, there is not enough space to perform the repartitioning, so the current
<value>Update not applicable</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_NOT_AUTO_UPGRADABLE" xml:space="preserve">
<value>This server cannot be updated automatically.</value>
<value>This server cannot be updated automatically</value>
</data>
<data name="PATCHINGWIZARD_SELECTSERVERPAGE_SERVER_UP_TO_DATE" xml:space="preserve">
<value>This server is already up-to-date.</value>
@ -9859,12 +9859,18 @@ Click Server Status Report to open the Compile Server Status Report Wizard or cl
<data name="RESOLVED_AS" xml:space="preserve">
<value>Resolved as {0}</value>
</data>
<data name="RESTORE_DISMISSED_UPDATES" xml:space="preserve">
<value>Restore dismissed updates</value>
</data>
<data name="RESTORE_FROM_BACKUP_FINALIZE" xml:space="preserve">
<value>Backup file loaded to server '{0}'. Refer to the "[XenServer product] Administrator's Guide" for instructions on how to complete the restore procedure.</value>
</data>
<data name="RESTORE_HOST" xml:space="preserve">
<value>Restore From Backup...</value>
</data>
<data name="RESTORING" xml:space="preserve">
<value>Restoring...</value>
</data>
<data name="RESTORING_HOST" xml:space="preserve">
<value>Restoring server '{0}'</value>
</data>