프로젝트

일반

사용자정보

개정판 90de6e1d

ID90de6e1dadb6f06a038c5773001b01909f91b900
상위 e551f094
하위 37e754f4

백흠경이(가) 5년 이상 전에 추가함

issue #660: deploy SmartUpdate files to artifactory

Change-Id: I1836e680304873dc7b56170c703f01f975da1985

차이점 보기:

SmartUpdate/MainWindow.xaml.cs
56 56

  
57 57
        void MainWindow_Loaded(object sender, RoutedEventArgs e)
58 58
        {           
59
            //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 59
            url = Environment.GetCommandLineArgs(); //file url                  
66 60
            destfilepath = System.IO.Path.Combine(TempFolder, System.IO.Path.GetFileName(url[1]));
67 61
            splashText.Text = "Update Download Start...";
......
69 63
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
70 64
            client.DownloadFileCompleted += new AsyncCompletedEventHandler(Client_DownloadFileCompleted);
71 65
            client.DownloadFileAsync(new Uri(url[1]), destfilepath);
72
            //ConnectUpgradeServer(); //여기서부터 XML 파싱 및 파일 다운로드
73 66
        }
74 67

  
75 68
        private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
......
109 102

  
110 103
        }
111 104

  
112
        /*
113

  
114
        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
        string destfilepath = string.Empty;
194
        public static string TempFolder
195
        {
196
            get
197
            {
198
                return Path.Combine(Path.GetTempPath(), "MARKUS");
199
            }
200
        }
201
        private void SetDown()
202
        {
203
            try
204
            {
205
                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
            catch //(Exception ex)
272
            {
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
                string pathString = App.AppDataFolder + "\\SmartUpdate";
378
                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
                string path = pathString + "\\" + "Log_" + DateTime.Now.ToString("yyyy-MM-dd hh-mm") + ".txt";
385
                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
                string pathString = App.AppDataFolder + "\\SmartUpdate";
397
                if (!File.Exists(pathString))
398
                {                    
399
                    Directory.CreateDirectory(pathString);
400
                }                   
401
                
402
                FileStream fs = new FileStream(pathString + "\\Log_" + DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ".txt", FileMode.OpenOrCreate, FileAccess.Write);
403
                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
        */
421

  
422 105
        private void WinState(object sender, MouseButtonEventArgs e)
423 106
        {
424 107
            switch ((e.Source as Image).Name)

내보내기 Unified diff

클립보드 이미지 추가 (최대 크기: 500 MB)