프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / SmartUpdate / MainWindow.xaml.cs @ 3074202c

이력 | 보기 | 이력해설 | 다운로드 (18.2 KB)

1 c4a4d59c ljiyeon
using System;
2
using System.Collections.Generic;
3
using System.ComponentModel;
4
using System.Diagnostics;
5
using System.IO;
6
using System.Net;
7
using System.Threading;
8
using System.Windows;
9
using System.Windows.Controls;
10
using System.Windows.Input;
11
using System.Xml;
12
using System.Drawing;
13
using System.Windows.Media;
14
using Image = System.Windows.Controls.Image;
15
using System.Windows.Media.Imaging;
16
using System.Text;
17
using System.Runtime.InteropServices;
18
using System.Security;
19
20
namespace SmartUpdate
21
{
22
    /// <summary>
23
    /// MainWindow.xaml에 대한 상호 작용 논리
24
    /// </summary>
25
    public partial class MainWindow : Window
26
    {
27
        private int index = 0; //업데이트시 파일 하나씩 넘어가게 하기 위해서
28
        private bool check = false; //다운완료된것 체크
29
        private int lastIndex;
30
        private Thread theProgBarThread;
31
        private bool m_bLoop;        
32
        private string versionPath = null; //64, 86 버전에 따른 서버 파일 위치        
33
        private string[] strArg; //KCOM 접속 파라미터 값 받기 위해        
34
        private int c_index = 1; //마지막 파일 확인 후 종료하기 위해        
35
        private string msgFileName = SmartUpdate.Properties.Settings.Default.msgFileName; //메시지창에 띄워줄 프로그램명        
36
        private string FileName = SmartUpdate.Properties.Settings.Default.FileName; //실행파일명
37
38 97cde7e3 ljiyeon
        private string[] url; // msi 파일 url
39
        string destfilepath = string.Empty;
40
        public static string TempFolder
41
        {
42
            get
43
            {
44
                return Path.Combine(Path.GetTempPath(), "MARKUS");
45
            }
46
        }
47
48 c4a4d59c ljiyeon
        public MainWindow()
49
        {
50
            InitializeComponent();            
51
            WindowStartupLocation = WindowStartupLocation.CenterOwner; //창 가운데로
52
            WindowStartupLocation = WindowStartupLocation.CenterScreen; //창 가운데로            
53
            Topmost = true; //창 최상위로
54
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
55
        }
56
57
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
58
        {           
59 97cde7e3 ljiyeon
            //m_bLoop = true;
60
            //lastIndex = index = 0;
61
            //theProgBarThread = new Thread(new ThreadStart(Step));
62
            //theProgBarThread.Start();
63
            //Thread.Sleep(100);
64
            //PartialDownloadProgressBar.Maximum = 100;
65
            url = Environment.GetCommandLineArgs(); //file url                  
66
            destfilepath = System.IO.Path.Combine(TempFolder, System.IO.Path.GetFileName(url[1]));
67
            splashText.Text = "Update Download Start...";
68
            WebClient client = new WebClient();
69
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
70
            client.DownloadFileCompleted += new AsyncCompletedEventHandler(Client_DownloadFileCompleted);
71
            client.DownloadFileAsync(new Uri(url[1]), destfilepath);
72
            //ConnectUpgradeServer(); //여기서부터 XML 파싱 및 파일 다운로드
73
        }
74
75
        private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
76
        {
77
            Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate
78
            {
79
                double bytesIn = double.Parse(e.BytesReceived.ToString());
80
                double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
81
                double percentage = bytesIn / totalBytes * 100;
82
                splashText.Text = "Download : " + Math.Truncate(percentage).ToString() + " %";
83
                progressBar.Value = int.Parse(Math.Truncate(percentage).ToString());
84
            }));
85
        }
86
87
88
        private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
89
        {
90
            try
91
            {
92
                Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new Action(delegate
93
                {
94
                    splashText.Text = "Download Completed";
95
                }));
96
97
                if (File.Exists(destfilepath))
98
                {
99
                    ProcessStartInfo update_msi = new ProcessStartInfo();
100
                    update_msi.FileName = destfilepath;
101
                    Process.Start(update_msi);
102
                }
103
                this.Close();
104
            }
105
            catch (Exception)
106
            {
107
                throw;
108
            }
109
110 c4a4d59c ljiyeon
        }
111
112 97cde7e3 ljiyeon
        /*
113
114 c4a4d59c ljiyeon
        public class ItemInfo
115
        {
116
            public string FileName { get; set; }
117
            public string Version { get; set; }
118
            public ImageSource SIcon { get; set; }
119
        }
120
121
        List<ItemInfo> itemInfoList = new List<ItemInfo>();
122
        List<ItemInfo> downloadList = new List<ItemInfo>();
123
124
        private void SetXmlParseing() 
125
        {            
126
            try
127
            {
128
                XmlDocument xdoc = new XmlDocument();              
129
                if (Environment.Is64BitProcess == true) //64 bit machine
130
                {
131
                    versionPath = SmartUpdate.Properties.Settings.Default.UpdateVer64;
132
                }
133
                else //32 bit machine
134
                {
135
                    versionPath = SmartUpdate.Properties.Settings.Default.UpdateVer86;
136
                }
137
                // XML 데이타를 파일에서 로드
138
                xdoc.Load(versionPath);
139
                // 특정 노드들을 필터링
140
                XmlNodeList nodes = xdoc.SelectNodes("/RootElement/Item");
141
142
                foreach (XmlNode emp in nodes)
143
                {
144
                    string Filename = emp.SelectSingleNode("Filename").InnerText;
145
                    string Version = emp.SelectSingleNode("Version").InnerText;                    
146
                    
147
                    try
148
                    {
149
                        //해당 파일이 서버에 있는지 확인
150
                        HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(Filename);
151
                        HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse();
152
                        webres.Close();
153
                        webreq = null;
154
                        webres = null;
155
                       
156
                        if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + @Path.GetFileName(Filename))) //해당 파일이 클라이언트에 있는가?
157
                        {
158
                            if (IsAccessAble(AppDomain.CurrentDomain.BaseDirectory + @Path.GetFileName(Filename)) == false) //다운받으려는 파일이 다른곳에서 점유중인지 확인.
159
                            {
160
                                ErrorLogFileWrite("실행중인 파일로 인해 업데이트 실패 : " + @Path.GetFileName(Filename));
161
                                SmartUpdateExit("실행중인 "+ msgFileName + "가 있습니다. \n모두 닫은 후 다시 실행해주세요."); //스마트 업데이트 종료
162
                            }
163
                            else if (FileVersionInfo.GetVersionInfo(AppDomain.CurrentDomain.BaseDirectory + @Path.GetFileName(Filename)).FileVersion != Version) //두개의 버전이 다른가?
164
                            {
165
                                itemInfoList.Add(new ItemInfo() { FileName = Filename, Version = Version });                               
166
                                ImageSource icon = IconManager.GetIcon(@Path.GetFileName(Filename), false, false);                                
167
                                downloadList.Add(new ItemInfo() { FileName = @Path.GetFileName(Filename), Version = Version, SIcon = icon });
168
                            }
169
                        }
170
                        else
171
                        {
172
                            itemInfoList.Add(new ItemInfo() { FileName = Filename, Version = Version });
173
                            ImageSource icon = IconManager.GetIcon(@Path.GetFileName(Filename), false, false);
174
                            downloadList.Add(new ItemInfo() { FileName = @Path.GetFileName(Filename), Version = Version, SIcon = icon });
175
                        }                        
176
                    }
177
                    catch(Exception ex) //다운로드 받아야할 파일이 서버에 없을 경우 스마트업데이트 강제 종료.
178
                    {
179
                        ErrorLogFileWrite("Err : " + ex);
180
                        SmartUpdateExit("서버에 파일이 없습니다.");
181
                    }
182
                }
183
                
184
                downloadlist.ItemsSource = downloadList;
185
                SetDown();                  
186
            }
187
            catch(Exception ex) //version.xml 파일이 없을 경우 스마트업데이트 강제 종료.
188
            {
189
                ErrorLogFileWrite("Err : " + ex);
190
                SmartUpdateExit("File Loading Error SmartUpdate를 종료합니다."); //스마트 업데이트 종료
191
            }                 
192
        }
193 97cde7e3 ljiyeon
        string destfilepath = string.Empty;
194
        public static string TempFolder
195
        {
196
            get
197
            {
198
                return Path.Combine(Path.GetTempPath(), "MARKUS");
199
            }
200
        }
201 c4a4d59c ljiyeon
        private void SetDown()
202
        {
203
            try
204 97cde7e3 ljiyeon
            {
205 c4a4d59c ljiyeon
                for (int i = 0; i < itemInfoList.Count; i++)
206
                {
207
                    WebClient theDownloadThread = new WebClient();
208
                    Uri url = new Uri(itemInfoList[i].FileName);
209
                    theDownloadThread.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);   
210
                    theDownloadThread.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
211
                    string filename = Path.GetFileName(itemInfoList[i].FileName);
212
                    theDownloadThread.DownloadFileAsync(url, AppDomain.CurrentDomain.BaseDirectory + filename);
213
                   
214
                }               
215
            }
216
            catch(Exception ee) //다운로드 도중 에러시 스마트업데이트 강제 종료. 
217
            {
218
                ErrorLogFileWrite("SetDown()  \r\n 상세로그 : " + ee);
219
                SmartUpdateExit("File Download Error SmartUpdate를 종료합니다."); //스마트 업데이트 종료
220
            }            
221
        }
222
223
        private void ConnectUpgradeServer()
224
        {
225
            try
226
            {              
227
                SetXmlParseing();                
228
            }
229
            catch (Exception er)
230
            {
231
                string strError = er.ToString();
232
                MarkusStart(strError);
233
            }
234
        }
235
                     
236
237
        private void MarkusStart(string MessageStr)
238
        {
239
            try
240
            {
241
                ErrorLogFileWrite("상세로그 : " + MessageStr);
242
243
                ProcessStartInfo proInfo = new ProcessStartInfo();
244
                proInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + FileName;
245
                if (strArg.Length > 1)
246
                {
247
                    proInfo.Arguments = strArg[1];
248
                }
249
                Process.Start(proInfo);
250
251
                //현재 실행되고 있는 자기 자신 프로세스의 정보
252
                Process proc = Process.GetCurrentProcess();
253
                proc.Kill();
254
            }
255
            catch (Exception ee)
256
            {
257
                ErrorLogFileWrite("Err로그 : " + ee);
258
                //MessageBox.Show(ee + "MARKUS를 재실행 해주시기 바랍니다.");
259
            }
260
        }
261
262
        private void SmartUpdateExit(string MessageStr)
263
        {
264
            try
265
            {
266
                MessageBox.Show(MessageStr, "종료합니다.", MessageBoxButton.OK);
267
                //현재 실행되고 있는 자기 자신 프로세스의 정보
268
                Process proc = Process.GetCurrentProcess();
269
                proc.Kill();
270
            }
271 53880c83 ljiyeon
            catch //(Exception ex)
272 c4a4d59c ljiyeon
            {
273
                ErrorLogFileWrite("SmartUpdateExit()  \r\n 상세로그 : " + MessageStr);
274
            }
275
        }
276
277
278
        //http://blog.naver.com/PostView.nhn?blogId=nersion&logNo=140150987526&parentCategoryNo=&categoryNo=56&viewDate=&isShowPopularPosts=true&from=search
279
        private bool IsAccessAble(String path)
280
        {
281
            FileStream fs = null;
282
            try
283
            {
284
                //앞단에서 파일이 있는 경우에만 타도록 했음 그렇지 않으면 파일 자체가 없을때도 false 반환
285
                fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None);                                
286
            }
287
            catch (IOException)
288
            {
289
                //에러가 발생한 이유는 이미 다른 프로세서에서 점유중.               
290
                return false;
291
            }
292
            finally
293
            {
294
                if (fs != null)
295
                {
296
                    //만약에 파일이 정상적으로 열렸다면 점유중이 아니다.
297
                    //다시 파일을 닫아줘야 한다.
298
                    fs.Close();
299
                }
300
            }
301
            return true;
302
        }
303
        
304
        protected XmlNode CreateNode(XmlDocument xmlDoc, string name, string innerXml)
305
        {
306
            XmlNode node = xmlDoc.CreateElement(string.Empty, name, string.Empty);
307
            node.InnerXml = innerXml;
308
309
            return node;
310
        }
311
312
        private void Step()
313
        {
314
            while (m_bLoop)
315
            {
316
                if (lastIndex < index)
317
                {
318
                    lastIndex++;
319
                }
320
                Thread.Sleep(1000);
321
            }
322
        }
323
324
        private void Completed(object sender, AsyncCompletedEventArgs e)
325
        {
326
            c_index++;
327
            if (c_index > itemInfoList.Count)
328
            {
329
                try
330
                {                 
331
                    ProcessStartInfo proInfo = new ProcessStartInfo();
332
                    proInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + FileName;
333
334
                    if (strArg.Length > 1)
335
                    {
336
                        proInfo.Arguments = strArg[1];
337
                    }
338
                    Process.Start(proInfo);
339
340
                    //현재 실행되고 있는 자기 자신 프로세스의 정보
341
                    Process proc = Process.GetCurrentProcess();
342
                    proc.Kill();
343
                }
344
                catch (Exception ee)
345
                {
346
                    ErrorLogFileWrite("SmartUpdate 종료 또는 "+ msgFileName + "실행에 실패했습니다.  \r\n 상세로그 : " + ee);
347
                    //MessageBox.Show(strArg[1] + "MARKUS를 재실행 해주시기 바랍니다.");
348
                }
349
            }
350
            
351
        }
352
353
        //파일 다운로드 상황을 반영한다.
354
        private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
355
        {
356
            //PartialDownloadProgressBar.Value = e.ProgressPercentage;               
357
            //이전에 다운로드 받은 파일이 완료되었다면
358
            if (e.TotalBytesToReceive == e.BytesReceived && !check)
359
            {
360
                if (index < itemInfoList.Count)
361
                {
362
                    index++;
363
                    PartialDownloadProgressBar.Value = (Convert.ToDouble(index) / Convert.ToDouble(itemInfoList.Count)) * 100;
364
                    LogFileWrite();
365
                }                
366
            }
367
            else
368
            {
369
                check = false;
370
            }
371
        }
372
373
        private void ErrorLogFileWrite(string Err)
374
        {
375
            try
376
            {
377 f7e7a61a ljiyeon
                string pathString = App.AppDataFolder + "\\SmartUpdate";
378 c4a4d59c ljiyeon
                if (!File.Exists(pathString))
379
                {                    
380
                    Directory.CreateDirectory(pathString);
381
                }
382
383
                Err = Err + "   " +DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")  + "\r\n";
384 f7e7a61a ljiyeon
                string path = pathString + "\\" + "Log_" + DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".txt";
385 c4a4d59c ljiyeon
                File.AppendAllText(path, Err);
386
            }
387
            catch (Exception er)
388
            {
389
                string strError = er.ToString();
390
            }
391
        }
392
        private void LogFileWrite()
393
        {
394
            try
395
            {
396 f7e7a61a ljiyeon
                string pathString = App.AppDataFolder + "\\SmartUpdate";
397 c4a4d59c ljiyeon
                if (!File.Exists(pathString))
398
                {                    
399
                    Directory.CreateDirectory(pathString);
400
                }                   
401
                
402 f7e7a61a ljiyeon
                FileStream fs = new FileStream(pathString + "\\Log_" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ".txt", FileMode.OpenOrCreate, FileAccess.Write);
403 c4a4d59c ljiyeon
                StreamWriter sw = new StreamWriter(fs);
404
                sw.WriteLine("<업그레이드 정보>");
405
                sw.WriteLine("<업데이트 날짜>");
406
                sw.WriteLine("{0}", DateTime.Today.ToLongDateString());
407
                sw.WriteLine("<업데이트 파일>");
408
                for (int i = 0; i < itemInfoList.Count; i++)
409
                    sw.WriteLine("{0}", itemInfoList[i].FileName);
410
411
                sw.Close();
412
                fs.Close();
413
            }
414
            catch (Exception er)
415
            {
416
                string strError = er.ToString();
417
                ErrorLogFileWrite("업데이트 파일 작성에 실패했습니다.  \r\n 상세로그 : " + strError);
418
            }
419
        }
420 97cde7e3 ljiyeon
        */
421 c4a4d59c ljiyeon
422
        private void WinState(object sender, MouseButtonEventArgs e)
423
        {
424
            switch ((e.Source as Image).Name)
425
            {
426
                case ("Win_min"):
427
                    {
428
                        WindowState = WindowState.Minimized;
429
                    }
430
                    break;
431
                case ("Win_max"):
432
                    {
433
                        if (WindowState == WindowState.Maximized)
434
                        {
435
                            WindowState = WindowState.Normal;
436
                        }
437
                        else
438
                        {
439
                            WindowState = WindowState.Maximized;
440
                        }
441
                    }
442
                    break;
443
                case ("Win_Close"):
444
                    {                       
445
                        
446
                        this.Close();
447
                    }
448
                    break;
449
            }
450
        }
451
    }
452
}
클립보드 이미지 추가 (최대 크기: 500 MB)