OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / frmDownload.cs
1 /*  frmDownload.cs $\r
2         \r
3            This file is part of the HandBrake source code.\r
4            Homepage: <http://handbrake.fr>.\r
5            It may be used under the terms of the GNU General Public License. */\r
6 \r
7 namespace Handbrake\r
8 {\r
9     using System;\r
10     using System.Diagnostics;\r
11     using System.IO;\r
12     using System.Net;\r
13     using System.Threading;\r
14     using System.Windows.Forms;\r
15 \r
16     public partial class frmDownload : Form\r
17     {\r
18         private readonly Thread _downloadThread;\r
19         private Stream _responceStream;\r
20         private Stream _loacalStream;\r
21         private HttpWebRequest _webRequest;\r
22         private HttpWebResponse _webResponse;\r
23         private static int _progress;\r
24         private bool _killThread;\r
25 \r
26         private delegate void UpdateProgessCallback(long bytesRead, long totalBytes);\r
27 \r
28         private delegate void DownloadCompleteCallback();\r
29 \r
30         private delegate void DownloadFailedCallback();\r
31 \r
32 \r
33         public frmDownload(string filename)\r
34         {\r
35             InitializeComponent();\r
36 \r
37             _downloadThread = new Thread(Download);\r
38             _downloadThread.Start(filename);\r
39         }\r
40 \r
41         private void Download(object file)\r
42         {\r
43             string tempPath = Path.Combine(Path.GetTempPath(), "handbrake-setup.exe");\r
44             string hbUpdate = (string) file;\r
45             WebClient wcDownload = new WebClient();\r
46 \r
47             try\r
48             {\r
49                 if (File.Exists(tempPath))\r
50                     File.Delete(tempPath);\r
51 \r
52                 _webRequest = (HttpWebRequest) WebRequest.Create(hbUpdate);\r
53                 _webRequest.Credentials = CredentialCache.DefaultCredentials;\r
54                 _webResponse = (HttpWebResponse) _webRequest.GetResponse();\r
55                 long fileSize = _webResponse.ContentLength;\r
56 \r
57                 _responceStream = wcDownload.OpenRead(hbUpdate);\r
58                 _loacalStream = new FileStream(tempPath, FileMode.Create, FileAccess.Write, FileShare.None);\r
59 \r
60                 int bytesSize;\r
61                 byte[] downBuffer = new byte[2048];\r
62 \r
63                 long flength = 0;\r
64                 while ((bytesSize = _responceStream.Read(downBuffer, 0, downBuffer.Length)) > 0)\r
65                 {\r
66                     if (_killThread)\r
67                         return;\r
68                     _loacalStream.Write(downBuffer, 0, bytesSize);\r
69                     flength = _loacalStream.Length;\r
70                     Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] {_loacalStream.Length, fileSize});\r
71                 }\r
72 \r
73                 _responceStream.Close();\r
74                 _loacalStream.Close();\r
75 \r
76                 if (flength != fileSize)\r
77                     Invoke(new DownloadFailedCallback(this.DownloadFailed));\r
78                 else\r
79                     Invoke(new DownloadCompleteCallback(this.DownloadComplete));\r
80             }\r
81             catch\r
82             {\r
83                 // Do Nothing \r
84             }\r
85         }\r
86 \r
87         private void UpdateProgress(long bytesRead, long totalBytes)\r
88         {\r
89             long p = (bytesRead*100)/totalBytes;\r
90             int.TryParse(p.ToString(), out _progress);\r
91             progress_download.Value = _progress;\r
92             lblProgress.Text = (bytesRead/1024) + "k of " + (totalBytes/1024) + "k ";\r
93         }\r
94 \r
95         private void DownloadComplete()\r
96         {\r
97             lblProgress.Text = "Download Complete";\r
98             btn_cancel.Text = "Close";\r
99 \r
100             Process.Start(Path.Combine(Path.GetTempPath(), "handbrake-setup.exe"));\r
101             this.Close();\r
102             Application.Exit();\r
103         }\r
104 \r
105         private void DownloadFailed()\r
106         {\r
107             lblProgress.Text = "Download Failed";\r
108             btn_cancel.Text = "Close";\r
109         }\r
110 \r
111         private void btn_cancel_Click(object sender, EventArgs e)\r
112         {\r
113             _killThread = true;\r
114             lblProgress.Text = "Cancelling ...";\r
115             if (_webResponse != null) _webResponse.Close();\r
116             if (_responceStream != null) _responceStream.Close();\r
117             if (_loacalStream != null) _loacalStream.Close();\r
118             this.Close();\r
119         }\r
120     }\r
121 }