diff --git a/Build/Updater.exe b/Build/Updater.exe index 95fe67fafcb583f926cf43b55dcd843fef247466..4b1372e3066f6b4828573fcf840010e7c2c4e011 100644 Binary files a/Build/Updater.exe and b/Build/Updater.exe differ diff --git a/Source/Tools/Updater/MainForm.cs b/Source/Tools/Updater/MainForm.cs index d195c2b4e54fa43eccd289da798a5f35f1f5e7b3..3de91037059fea051bfb33fbfda70516d6f3fd16 100644 --- a/Source/Tools/Updater/MainForm.cs +++ b/Source/Tools/Updater/MainForm.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; +using System.Drawing; using System.IO; using System.Reflection; using System.Security.AccessControl; @@ -46,8 +47,9 @@ namespace mxd.GZDBUpdater public static string ErrorDescription; public static bool AppClosing { get { return appclosing; } } + public static Icon AppIcon { get { return me.Icon; } } - #endregion + #endregion #region ======================== Constructor @@ -126,49 +128,51 @@ namespace mxd.GZDBUpdater { try { - Process[] processes = Process.GetProcesses(); - List<Process> toclose = new List<Process>(); - - // Gather all running editor processes... - foreach(Process process in processes) - { - if(process.ProcessName == processToEnd && Path.GetDirectoryName(process.MainModule.FileName) == Application.StartupPath) - { - toclose.Add(process); - break; - } - } + // Gather processes... + List<Process> toclose = GetProcesses(processToEnd); // Ask the user how to proceed... if(toclose.Count > 0) { TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Paused); - - switch(MessageBox.Show(this, "The editor needs to be closed.\n\n" - + "Press \"Abort\" to cancel the update.\n" - + "Close the editor, then press \"Retry\" to proceed with the update.\n" - + "Press \"Ignore\" to terminate the editor and proceed with the update.", - MESSAGEBOX_TITLE, MessageBoxButtons.AbortRetryIgnore)) + UpdateBlockedForm form = new UpdateBlockedForm(); + switch(form.ShowDialog(this)) { - case DialogResult.Abort: return false; - case DialogResult.Retry: return EditorClosed(); - case DialogResult.Ignore: + case DialogResult.Cancel: return false; + case DialogResult.OK: UpdateLabel(label1, "3/6: Stopping " + processToEnd); - Thread.Sleep(500); + Thread.Sleep(50); + toclose = GetProcesses(processToEnd); // Re-gather processes foreach(Process p in toclose) if(p != null) p.Kill(); - break; + return true; } } } catch(Exception ex) { - ErrorDescription = "Failed to stop the main process...\n" + ex.Message; + ErrorDescription = "Failed to stop the editor process...\n" + ex.Message; return false; } return true; } + private static List<Process> GetProcesses(string processToEnd) + { + Process[] processes = Process.GetProcesses(); + List<Process> toclose = new List<Process>(); + + // Gather all running editor processes... + foreach(Process process in processes) + { + if(process.ProcessName == processToEnd + && Path.GetDirectoryName(process.MainModule.FileName) == Application.StartupPath) + toclose.Add(process); + } + + return toclose; + } + private static void StopBackgroundWorker() { if(worker != null && !worker.CancellationPending) diff --git a/Source/Tools/Updater/Properties/AssemblyInfo.cs b/Source/Tools/Updater/Properties/AssemblyInfo.cs index afb0930e19598ae354a2e78fc8e4f7a4f4343b95..4a4f974cec851fad1df1a1b2d006004328df920e 100644 --- a/Source/Tools/Updater/Properties/AssemblyInfo.cs +++ b/Source/Tools/Updater/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Build Number // Revision // -[assembly: AssemblyVersion("1.0.0.4")] -[assembly: AssemblyFileVersion("1.0.0.4")] +[assembly: AssemblyVersion("1.0.0.5")] +[assembly: AssemblyFileVersion("1.0.0.5")] diff --git a/Source/Tools/Updater/UpdateBlockedForm.Designer.cs b/Source/Tools/Updater/UpdateBlockedForm.Designer.cs new file mode 100644 index 0000000000000000000000000000000000000000..8994bda1041d030814e07edd42be0a72546f3428 --- /dev/null +++ b/Source/Tools/Updater/UpdateBlockedForm.Designer.cs @@ -0,0 +1,138 @@ +namespace mxd.GZDBUpdater +{ + partial class UpdateBlockedForm + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if(disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.accept = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.panel2 = new System.Windows.Forms.Panel(); + this.proceed = new System.Windows.Forms.RadioButton(); + this.cancel = new System.Windows.Forms.RadioButton(); + this.panel1.SuspendLayout(); + this.panel2.SuspendLayout(); + this.SuspendLayout(); + // + // accept + // + this.accept.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.accept.Location = new System.Drawing.Point(244, 114); + this.accept.Name = "accept"; + this.accept.Size = new System.Drawing.Size(120, 28); + this.accept.TabIndex = 0; + this.accept.Text = "Continue"; + this.accept.UseVisualStyleBackColor = true; + this.accept.Click += new System.EventHandler(this.accept_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); + this.label1.Location = new System.Drawing.Point(12, 24); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(245, 13); + this.label1.TabIndex = 1; + this.label1.Text = "The editor needs to be closed to apply the update."; + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.panel1.Controls.Add(this.panel2); + this.panel1.Controls.Add(this.label1); + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Margin = new System.Windows.Forms.Padding(0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(369, 109); + this.panel1.TabIndex = 2; + // + // panel2 + // + this.panel2.Controls.Add(this.proceed); + this.panel2.Controls.Add(this.cancel); + this.panel2.Location = new System.Drawing.Point(12, 55); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(354, 51); + this.panel2.TabIndex = 4; + // + // proceed + // + this.proceed.AutoSize = true; + this.proceed.Checked = true; + this.proceed.Location = new System.Drawing.Point(3, 3); + this.proceed.Name = "proceed"; + this.proceed.Size = new System.Drawing.Size(322, 17); + this.proceed.TabIndex = 2; + this.proceed.TabStop = true; + this.proceed.Text = "Proceed with the update (this will automatically close the editor)"; + this.proceed.UseVisualStyleBackColor = true; + // + // cancel + // + this.cancel.AutoSize = true; + this.cancel.Location = new System.Drawing.Point(3, 26); + this.cancel.Name = "cancel"; + this.cancel.Size = new System.Drawing.Size(94, 17); + this.cancel.TabIndex = 3; + this.cancel.Text = "Cancel update"; + this.cancel.UseVisualStyleBackColor = true; + // + // UpdateBlockedForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(369, 147); + this.Controls.Add(this.panel1); + this.Controls.Add(this.accept); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "UpdateBlockedForm"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "GZDoom Builder Updater"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.UpdateBlockedForm_FormClosing); + this.panel1.ResumeLayout(false); + this.panel1.PerformLayout(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button accept; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.RadioButton cancel; + private System.Windows.Forms.RadioButton proceed; + private System.Windows.Forms.Panel panel2; + } +} \ No newline at end of file diff --git a/Source/Tools/Updater/UpdateBlockedForm.cs b/Source/Tools/Updater/UpdateBlockedForm.cs new file mode 100644 index 0000000000000000000000000000000000000000..ba66e22fe6e2fcdd912ae5298ab0c11f64be76b0 --- /dev/null +++ b/Source/Tools/Updater/UpdateBlockedForm.cs @@ -0,0 +1,27 @@ +using System; +using System.Windows.Forms; + +namespace mxd.GZDBUpdater +{ + public partial class UpdateBlockedForm : Form + { + private bool formaccepted; + + public UpdateBlockedForm() + { + InitializeComponent(); + this.Icon = MainForm.AppIcon; + } + + private void UpdateBlockedForm_FormClosing(object sender, FormClosingEventArgs e) + { + this.DialogResult = (formaccepted && proceed.Checked ? DialogResult.OK : DialogResult.Cancel); + } + + private void accept_Click(object sender, EventArgs e) + { + formaccepted = true; + this.Close(); + } + } +} diff --git a/Source/Tools/Updater/UpdateBlockedForm.resx b/Source/Tools/Updater/UpdateBlockedForm.resx new file mode 100644 index 0000000000000000000000000000000000000000..ff31a6db56e23b5a334f34387830ba5b4bd33eb8 --- /dev/null +++ b/Source/Tools/Updater/UpdateBlockedForm.resx @@ -0,0 +1,120 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/Source/Tools/Updater/Updater.csproj b/Source/Tools/Updater/Updater.csproj index 2bce076ddfbcd9356e5d48af7c4fb6f1e46f25e2..888ef3d891e866cf09b010d4333eb7cd1e1b29a8 100644 --- a/Source/Tools/Updater/Updater.csproj +++ b/Source/Tools/Updater/Updater.csproj @@ -65,8 +65,10 @@ <Reference Include="System.Core"> <RequiredTargetFramework>3.5</RequiredTargetFramework> </Reference> + <Reference Include="System.Data" /> <Reference Include="System.Drawing" /> <Reference Include="System.Windows.Forms" /> + <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="Helpers\EmbeddedAssembly.cs" /> @@ -97,6 +99,12 @@ </None> <Compile Include="Helpers\TaskbarProgress.cs" /> <Compile Include="Helpers\Webdata.cs" /> + <Compile Include="UpdateBlockedForm.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="UpdateBlockedForm.Designer.cs"> + <DependentUpon>UpdateBlockedForm.cs</DependentUpon> + </Compile> </ItemGroup> <ItemGroup> <BootstrapperPackage Include="Microsoft.Net.Client.3.5"> @@ -130,6 +138,9 @@ </ItemGroup> <ItemGroup> <EmbeddedResource Include="SharpCompressStripped.dll" /> + <EmbeddedResource Include="UpdateBlockedForm.resx"> + <DependentUpon>UpdateBlockedForm.cs</DependentUpon> + </EmbeddedResource> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <!-- To modify your build process, add your task inside one of the targets below and uncomment it.