프로젝트

일반

사용자정보

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

markus / SmartUpdate / MainWindow.xaml.cs @ f7e7a61a

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

1
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
        public MainWindow()
39
        {
40
            InitializeComponent();            
41
            WindowStartupLocation = WindowStartupLocation.CenterOwner; //창 가운데로
42
            WindowStartupLocation = WindowStartupLocation.CenterScreen; //창 가운데로            
43
            Topmost = true; //창 최상위로
44
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
45
        }
46

    
47
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
48
        {           
49
            m_bLoop = true;
50
            lastIndex = index = 0;
51
            theProgBarThread = new Thread(new ThreadStart(Step));
52
            theProgBarThread.Start();
53
            Thread.Sleep(100);
54
            PartialDownloadProgressBar.Maximum = 100;            
55
            strArg = Environment.GetCommandLineArgs(); //KCOM 접속 파라미터 값 받기 위해            
56
            ConnectUpgradeServer(); //여기서부터 XML 파싱 및 파일 다운로드
57
        }
58

    
59
        public class ItemInfo
60
        {
61
            public string FileName { get; set; }
62
            public string Version { get; set; }
63
            public ImageSource SIcon { get; set; }
64
        }
65

    
66
        List<ItemInfo> itemInfoList = new List<ItemInfo>();
67
        List<ItemInfo> downloadList = new List<ItemInfo>();
68

    
69
        private void SetXmlParseing() 
70
        {            
71
            try
72
            {
73
                XmlDocument xdoc = new XmlDocument();              
74
                if (Environment.Is64BitProcess == true) //64 bit machine
75
                {
76
                    versionPath = SmartUpdate.Properties.Settings.Default.UpdateVer64;
77
                }
78
                else //32 bit machine
79
                {
80
                    versionPath = SmartUpdate.Properties.Settings.Default.UpdateVer86;
81
                }
82
                // XML 데이타를 파일에서 로드
83
                xdoc.Load(versionPath);
84
                // 특정 노드들을 필터링
85
                XmlNodeList nodes = xdoc.SelectNodes("/RootElement/Item");
86

    
87
                foreach (XmlNode emp in nodes)
88
                {
89
                    string Filename = emp.SelectSingleNode("Filename").InnerText;
90
                    string Version = emp.SelectSingleNode("Version").InnerText;                    
91
                    
92
                    try
93
                    {
94
                        //해당 파일이 서버에 있는지 확인
95
                        HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(Filename);
96
                        HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse();
97
                        webres.Close();
98
                        webreq = null;
99
                        webres = null;
100
                       
101
                        if (File.Exists(AppDomain.CurrentDomain.BaseDirectory + @Path.GetFileName(Filename))) //해당 파일이 클라이언트에 있는가?
102
                        {
103
                            if (IsAccessAble(AppDomain.CurrentDomain.BaseDirectory + @Path.GetFileName(Filename)) == false) //다운받으려는 파일이 다른곳에서 점유중인지 확인.
104
                            {
105
                                ErrorLogFileWrite("실행중인 파일로 인해 업데이트 실패 : " + @Path.GetFileName(Filename));
106
                                SmartUpdateExit("실행중인 "+ msgFileName + "가 있습니다. \n모두 닫은 후 다시 실행해주세요."); //스마트 업데이트 종료
107
                            }
108
                            else if (FileVersionInfo.GetVersionInfo(AppDomain.CurrentDomain.BaseDirectory + @Path.GetFileName(Filename)).FileVersion != Version) //두개의 버전이 다른가?
109
                            {
110
                                itemInfoList.Add(new ItemInfo() { FileName = Filename, Version = Version });                               
111
                                ImageSource icon = IconManager.GetIcon(@Path.GetFileName(Filename), false, false);                                
112
                                downloadList.Add(new ItemInfo() { FileName = @Path.GetFileName(Filename), Version = Version, SIcon = icon });
113
                            }
114
                        }
115
                        else
116
                        {
117
                            itemInfoList.Add(new ItemInfo() { FileName = Filename, Version = Version });
118
                            ImageSource icon = IconManager.GetIcon(@Path.GetFileName(Filename), false, false);
119
                            downloadList.Add(new ItemInfo() { FileName = @Path.GetFileName(Filename), Version = Version, SIcon = icon });
120
                        }                        
121
                    }
122
                    catch(Exception ex) //다운로드 받아야할 파일이 서버에 없을 경우 스마트업데이트 강제 종료.
123
                    {
124
                        ErrorLogFileWrite("Err : " + ex);
125
                        SmartUpdateExit("서버에 파일이 없습니다.");
126
                    }
127
                }
128
                
129
                downloadlist.ItemsSource = downloadList;
130
                SetDown();                  
131
            }
132
            catch(Exception ex) //version.xml 파일이 없을 경우 스마트업데이트 강제 종료.
133
            {
134
                ErrorLogFileWrite("Err : " + ex);
135
                SmartUpdateExit("File Loading Error SmartUpdate를 종료합니다."); //스마트 업데이트 종료
136
            }                 
137
        }
138

    
139
        private void SetDown()
140
        {
141
            try
142
            {                
143
                for (int i = 0; i < itemInfoList.Count; i++)
144
                {
145
                    WebClient theDownloadThread = new WebClient();
146
                    Uri url = new Uri(itemInfoList[i].FileName);
147
                    theDownloadThread.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);   
148
                    theDownloadThread.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
149
                    string filename = Path.GetFileName(itemInfoList[i].FileName);
150
                    theDownloadThread.DownloadFileAsync(url, AppDomain.CurrentDomain.BaseDirectory + filename);
151
                   
152
                }               
153
            }
154
            catch(Exception ee) //다운로드 도중 에러시 스마트업데이트 강제 종료. 
155
            {
156
                ErrorLogFileWrite("SetDown()  \r\n 상세로그 : " + ee);
157
                SmartUpdateExit("File Download Error SmartUpdate를 종료합니다."); //스마트 업데이트 종료
158
            }            
159
        }
160

    
161
        private void ConnectUpgradeServer()
162
        {
163
            try
164
            {              
165
                SetXmlParseing();                
166
            }
167
            catch (Exception er)
168
            {
169
                string strError = er.ToString();
170
                MarkusStart(strError);
171
            }
172
        }
173
                     
174

    
175
        private void MarkusStart(string MessageStr)
176
        {
177
            try
178
            {
179
                ErrorLogFileWrite("상세로그 : " + MessageStr);
180

    
181
                ProcessStartInfo proInfo = new ProcessStartInfo();
182
                proInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + FileName;
183
                if (strArg.Length > 1)
184
                {
185
                    proInfo.Arguments = strArg[1];
186
                }
187
                Process.Start(proInfo);
188

    
189
                //현재 실행되고 있는 자기 자신 프로세스의 정보
190
                Process proc = Process.GetCurrentProcess();
191
                proc.Kill();
192
            }
193
            catch (Exception ee)
194
            {
195
                ErrorLogFileWrite("Err로그 : " + ee);
196
                //MessageBox.Show(ee + "MARKUS를 재실행 해주시기 바랍니다.");
197
            }
198
        }
199

    
200
        private void SmartUpdateExit(string MessageStr)
201
        {
202
            try
203
            {
204
                MessageBox.Show(MessageStr, "종료합니다.", MessageBoxButton.OK);
205
                //현재 실행되고 있는 자기 자신 프로세스의 정보
206
                Process proc = Process.GetCurrentProcess();
207
                proc.Kill();
208
            }
209
            catch //(Exception ex)
210
            {
211
                ErrorLogFileWrite("SmartUpdateExit()  \r\n 상세로그 : " + MessageStr);
212
            }
213
        }
214

    
215

    
216
        //http://blog.naver.com/PostView.nhn?blogId=nersion&logNo=140150987526&parentCategoryNo=&categoryNo=56&viewDate=&isShowPopularPosts=true&from=search
217
        private bool IsAccessAble(String path)
218
        {
219
            FileStream fs = null;
220
            try
221
            {
222
                //앞단에서 파일이 있는 경우에만 타도록 했음 그렇지 않으면 파일 자체가 없을때도 false 반환
223
                fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None);                                
224
            }
225
            catch (IOException)
226
            {
227
                //에러가 발생한 이유는 이미 다른 프로세서에서 점유중.               
228
                return false;
229
            }
230
            finally
231
            {
232
                if (fs != null)
233
                {
234
                    //만약에 파일이 정상적으로 열렸다면 점유중이 아니다.
235
                    //다시 파일을 닫아줘야 한다.
236
                    fs.Close();
237
                }
238
            }
239
            return true;
240
        }
241
        
242
        protected XmlNode CreateNode(XmlDocument xmlDoc, string name, string innerXml)
243
        {
244
            XmlNode node = xmlDoc.CreateElement(string.Empty, name, string.Empty);
245
            node.InnerXml = innerXml;
246

    
247
            return node;
248
        }
249

    
250
        private void Step()
251
        {
252
            while (m_bLoop)
253
            {
254
                if (lastIndex < index)
255
                {
256
                    lastIndex++;
257
                }
258
                Thread.Sleep(1000);
259
            }
260
        }
261

    
262
        private void Completed(object sender, AsyncCompletedEventArgs e)
263
        {
264
            c_index++;
265
            if (c_index > itemInfoList.Count)
266
            {
267
                try
268
                {                 
269
                    ProcessStartInfo proInfo = new ProcessStartInfo();
270
                    proInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + FileName;
271

    
272
                    if (strArg.Length > 1)
273
                    {
274
                        proInfo.Arguments = strArg[1];
275
                    }
276
                    Process.Start(proInfo);
277

    
278
                    //현재 실행되고 있는 자기 자신 프로세스의 정보
279
                    Process proc = Process.GetCurrentProcess();
280
                    proc.Kill();
281
                }
282
                catch (Exception ee)
283
                {
284
                    ErrorLogFileWrite("SmartUpdate 종료 또는 "+ msgFileName + "실행에 실패했습니다.  \r\n 상세로그 : " + ee);
285
                    //MessageBox.Show(strArg[1] + "MARKUS를 재실행 해주시기 바랍니다.");
286
                }
287
            }
288
            
289
        }
290

    
291
        //파일 다운로드 상황을 반영한다.
292
        private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
293
        {
294
            //PartialDownloadProgressBar.Value = e.ProgressPercentage;               
295
            //이전에 다운로드 받은 파일이 완료되었다면
296
            if (e.TotalBytesToReceive == e.BytesReceived && !check)
297
            {
298
                if (index < itemInfoList.Count)
299
                {
300
                    index++;
301
                    PartialDownloadProgressBar.Value = (Convert.ToDouble(index) / Convert.ToDouble(itemInfoList.Count)) * 100;
302
                    LogFileWrite();
303
                }                
304
            }
305
            else
306
            {
307
                check = false;
308
            }
309
        }
310

    
311
        private void ErrorLogFileWrite(string Err)
312
        {
313
            try
314
            {
315
                string pathString = App.AppDataFolder + "\\SmartUpdate";
316
                if (!File.Exists(pathString))
317
                {                    
318
                    Directory.CreateDirectory(pathString);
319
                }
320

    
321
                Err = Err + "   " +DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")  + "\r\n";
322
                string path = pathString + "\\" + "Log_" + DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".txt";
323
                File.AppendAllText(path, Err);
324
            }
325
            catch (Exception er)
326
            {
327
                string strError = er.ToString();
328
            }
329
        }
330
        private void LogFileWrite()
331
        {
332
            try
333
            {
334
                string pathString = App.AppDataFolder + "\\SmartUpdate";
335
                if (!File.Exists(pathString))
336
                {                    
337
                    Directory.CreateDirectory(pathString);
338
                }                   
339
                
340
                FileStream fs = new FileStream(pathString + "\\Log_" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ".txt", FileMode.OpenOrCreate, FileAccess.Write);
341
                StreamWriter sw = new StreamWriter(fs);
342
                sw.WriteLine("<업그레이드 정보>");
343
                sw.WriteLine("<업데이트 날짜>");
344
                sw.WriteLine("{0}", DateTime.Today.ToLongDateString());
345
                sw.WriteLine("<업데이트 파일>");
346
                for (int i = 0; i < itemInfoList.Count; i++)
347
                    sw.WriteLine("{0}", itemInfoList[i].FileName);
348

    
349
                sw.Close();
350
                fs.Close();
351
            }
352
            catch (Exception er)
353
            {
354
                string strError = er.ToString();
355
                ErrorLogFileWrite("업데이트 파일 작성에 실패했습니다.  \r\n 상세로그 : " + strError);
356
            }
357
        }
358

    
359
        private void WinState(object sender, MouseButtonEventArgs e)
360
        {
361
            switch ((e.Source as Image).Name)
362
            {
363
                case ("Win_min"):
364
                    {
365
                        WindowState = WindowState.Minimized;
366
                    }
367
                    break;
368
                case ("Win_max"):
369
                    {
370
                        if (WindowState == WindowState.Maximized)
371
                        {
372
                            WindowState = WindowState.Normal;
373
                        }
374
                        else
375
                        {
376
                            WindowState = WindowState.Maximized;
377
                        }
378
                    }
379
                    break;
380
                case ("Win_Close"):
381
                    {                       
382
                        
383
                        this.Close();
384
                    }
385
                    break;
386
            }
387
        }
388
    }
389
}
클립보드 이미지 추가 (최대 크기: 500 MB)