source: trunk/CrypUpdater/App.xaml.cs @ 2181

Last change on this file since 2181 was 2153, checked in by sauer, 11 years ago

CrypUpdater: Improved handling with other, remaining CrypStartup processes preventing the update

File size: 8.3 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Configuration;
4using System.Data;
5using System.Diagnostics;
6using System.Linq;
7using System.Windows;
8using System.Collections;
9using System.Threading;
10using System.Windows.Threading;
11using Ionic.Zip;
12
13
14namespace CrypUpdater
15{
16    /// <summary>
17    /// Interaktionslogik für "App.xaml"
18    /// </summary>
19    public partial class App : Application
20    {
21
22        private MainWindow m;
23
24        internal static string CryptoolExePath;
25
26        private string ZipFilePath;
27
28        private string CryptoolFolderPath;
29
30        private Process p;
31
32        private List<Process> unwantedProcesses = new List<Process>();
33
34
35        private void Application_Startup(object sender, StartupEventArgs e)
36        {
37
38            m = new CrypUpdater.MainWindow();
39            m.Show();
40            int CryptoolProcessID;
41           
42
43            try
44            {
45                ZipFilePath = e.Args[0];
46                CryptoolFolderPath = e.Args[1];
47                CryptoolExePath = e.Args[2];
48                CryptoolProcessID = Convert.ToInt32(e.Args[3]);
49                p = Process.GetProcessById(CryptoolProcessID);
50
51                if (p.WaitForExit(1000 * 30))
52                {
53                    unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
54                    if (unwantedProcesses.Count == 0)
55                        UnpackZip(ZipFilePath, CryptoolFolderPath);
56                    else
57                    {
58                        AskForLicenseToKill();
59                    }
60
61                }
62                else
63                {
64                    MessageBoxButton b = MessageBoxButton.OKCancel;
65                    string caption = "Timeout error";
66                    MessageBoxResult result;
67                    result = MessageBox.Show("CrypTool 2.0 failed to shut down. Kill the process to proceed?", caption, b);
68                    if (result == MessageBoxResult.OK)
69                    {
70                        try
71                        {
72                            p.Kill();
73                            p.WaitForExit();
74                            unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
75                            if (unwantedProcesses.Count == 0)
76                                UnpackZip(ZipFilePath, CryptoolFolderPath);
77                            else
78                            {
79                                AskForLicenseToKill();
80                            }
81                        }
82                        catch (Exception)
83                        {
84                            unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
85                            if (unwantedProcesses.Count == 0)
86                                UnpackZip(ZipFilePath, CryptoolFolderPath);
87                            else
88                            {
89                                AskForLicenseToKill();
90                            }
91                        }
92                    }
93                    else
94                    {
95                        MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.");
96                        RestartCryptool();
97                    }
98                   
99
100                }
101
102            }
103            catch (IndexOutOfRangeException) // parameter not set
104            {
105                if (CryptoolExePath != null)
106                {
107                    MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.", "Error");
108                    RestartCryptool();
109                }
110                else
111                {
112                    UpdateFailure();
113                }
114            }
115            catch (FormatException) // no id was parsable
116            {
117                UpdateFailure();
118            }
119            catch (ArgumentException) // the invoking process has already exited (no such process with this id exists)
120            {
121                unwantedProcesses = FindCrypToolProcesses(CryptoolExePath);
122                if (unwantedProcesses.Count == 0)
123                    UnpackZip(ZipFilePath, CryptoolFolderPath);
124                else
125                {
126                    AskForLicenseToKill();
127                }
128            }
129
130        }
131
132        private void AskForLicenseToKill()
133        {
134            MessageBoxButton mbb = MessageBoxButton.YesNo;
135            string caption = "Error";
136            string messagePart1;
137            string messagePart2;
138            string messagePart3;
139            if (unwantedProcesses.Count > 1)
140            {
141                messagePart1 = "Several instances";
142                messagePart2 = "are";
143                messagePart3 = "these processes";
144            }
145            else
146            {
147                messagePart1 = "Another instance";
148                messagePart2 = "is";
149                messagePart3 = "this process";
150            }
151            MessageBoxResult result;
152            result = MessageBox.Show(messagePart1 + " of CrypTool 2.0 using the same resources " + messagePart2 + " still running. Kill " + messagePart3 + " to proceed?", caption, mbb);
153            if (result == MessageBoxResult.Yes)
154            {
155                KillOtherProcesses(unwantedProcesses);
156                UnpackZip(ZipFilePath, CryptoolFolderPath);
157            }
158            else
159            {
160                MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.");
161                RestartCryptool();
162            }
163        }
164
165        private static void KillOtherProcesses(List<Process> unwantedProcesses)
166        {
167            try
168            {
169                foreach (Process pr in unwantedProcesses)
170                {
171                    if (!pr.HasExited)
172                    {
173                        pr.Kill();
174                        pr.WaitForExit();
175                    }
176                }
177            }
178            catch (Exception)
179            {
180                MessageBox.Show("Update failed. Not able to remove remaining CrypTool 2.0 instances.", "Error");
181                RestartCryptool();
182            }
183        }
184
185        private static void UpdateFailure()
186        {
187            MessageBox.Show("Update failed, wrong parameters!", "Error");
188            Application.Current.Shutdown();
189        }
190
191        private static void RestartCryptool()
192        {
193            try
194            {
195                System.Diagnostics.Process.Start(CryptoolExePath);
196                Application.Current.Shutdown();
197            }
198            catch (Exception)
199            {
200                MessageBoxButton bu = MessageBoxButton.OK;
201                string caption2 = "Error";
202                MessageBoxResult res = MessageBox.Show("CrypTool 2.0 could not be restarted! Try again later.", caption2, bu);
203                if (res == MessageBoxResult.OK)
204                {
205                    Application.Current.Shutdown();
206                }
207            }
208        }
209
210
211        private void UnpackZip(string ZipFilePath, string CryptoolFolderPath)
212        {
213
214            try
215            {
216                using (ZipFile zip = ZipFile.Read(ZipFilePath))
217                {
218                    int count = zip.Entries.Count;
219                    int i = 0;
220                    int progress = 0;
221
222                    foreach (ZipEntry e in zip)
223                    {
224                        e.Extract(CryptoolFolderPath, ExtractExistingFileAction.OverwriteSilently);
225                        i++;
226                        progress = i * 100 / count;
227                        m.UpdateProgress(progress);
228                    }
229
230                    RestartCryptool();
231
232                }
233            }
234            catch (Exception)
235            {
236                MessageBox.Show("Update failed. CrypTool 2.0 will be restarted.", "Error");
237                RestartCryptool();
238            }
239
240        }
241
242
243        private List<Process> FindCrypToolProcesses(string cryptoolExePath)
244        {
245            List<Process> processList = new List<Process>();
246
247            foreach (Process p in Process.GetProcesses())
248            {
249                if (p.ProcessName == "CrypStartup" && p.MainModule.FileName == cryptoolExePath)
250                    processList.Add(p);
251            }
252
253            return processList;
254        }
255
256    }
257}
Note: See TracBrowser for help on using the repository browser.