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

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