source: 2013/30/MiskaK/MW2(My Warfare 2)/My Warfare 2 Launcher/Update.cs @ 4507

Revision 4507, 9.6 KB checked in by anlakane, 6 years ago (diff)

Talletus.

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.IO;
6using System.IO.Compression;
7using System.Net;
8using System.Windows.Controls;
9using System.Reflection;
10using ICSharpCode.SharpZipLib.Zip;
11using System.Windows;
12
13namespace My_Warfare_2_Launcher
14{
15    /// <summary>
16    /// Pelin päivitys.
17    /// </summary>
18    public class Update
19    {
20        /// <summary>
21        /// Tiedoston osoite, josta löytyy linkki uusimpaan development buildiin.
22        /// </summary>
23        private static String DevelopmentBuildListUrl = "https://dl.dropboxusercontent.com/u/25754602/My%20Warfare%202%20Launcher%20Data/newest_development.txt";
24
25        /// <summary>
26        /// Tiedoston osoite, josta löytyy linkki uusimpaan stable buildiin.
27        /// </summary>
28        private static String StableBuildListUrl = "https://dl.dropboxusercontent.com/u/25754602/My%20Warfare%202%20Launcher%20Data/newest_stable.txt";
29
30        private static ProgressBar ProgressBar { get; set; }
31
32        private static Label StatusBox { get; set; }
33
34        private static Button LaunchButton { get; set; }
35
36        private static Button UpdateButton { get; set; }
37
38        private static Label VersionNumber { get; set; }
39
40        /// <summary>
41        /// Launcherin osoite.
42        /// </summary>
43        private static String LauncherinHakemistoPolku = Path.GetDirectoryName(Assembly.GetAssembly(typeof(MainWindow)).CodeBase).Remove(0, 6);
44
45
46        /// <summary>
47        /// Ladataan uusin valitun tyyppinen versio ja asennetaan se.
48        /// </summary>
49        /// <param name="kaytetaankoDevelopmentBuildia">Ladataanko development build. False: Stable-versio, True: Development-versio.</param>
50        /// <returns>Onnistuiko päivitys.</returns>
51        public static void UpdateGame(bool kaytetaankoDevelopmentBuildia, ProgressBar etenemisPalkki, Label statusBox, Button startButton, Button updateButton, Label versionNumber)
52        {
53            string updateFileUrl; // uusimman version URL
54            Update.ProgressBar = etenemisPalkki;
55            Update.StatusBox = statusBox;
56            Update.StatusBox.Content = "Starting update...";
57            Update.LaunchButton = startButton;
58            LaunchButton.IsEnabled = false;
59            Update.UpdateButton = updateButton;
60            UpdateButton.IsEnabled = false;
61            Update.VersionNumber = versionNumber;
62
63            if (kaytetaankoDevelopmentBuildia) updateFileUrl = LueTekstiaNetista(DevelopmentBuildListUrl);
64            else updateFileUrl = LueTekstiaNetista(StableBuildListUrl);
65
66            if (updateFileUrl == "ERROR") // jos osoiteen haku failaa
67            {
68                Update.StatusBox.Content = "Update failed!";
69                LaunchButton.IsEnabled = File.Exists(LauncherinHakemistoPolku + "\\bin\\MW2(My Warfare 2)");
70                UpdateButton.IsEnabled = true;
71                return;
72            }
73
74            if (updateFileUrl == "" && kaytetaankoDevelopmentBuildia) // jos osoitetta ei ole
75            {
76                Update.StatusBox.Content = "No development versions available!";
77                LaunchButton.IsEnabled = File.Exists(LauncherinHakemistoPolku + "\\bin\\MW2(My Warfare 2)");
78                UpdateButton.IsEnabled = true;
79                return;
80            }
81
82            if (updateFileUrl == "" && !kaytetaankoDevelopmentBuildia) // jos osoitetta ei ole
83            {
84                Update.StatusBox.Content = "No stable versions available!";
85                LaunchButton.IsEnabled = File.Exists(LauncherinHakemistoPolku + "\\bin\\MW2(My Warfare 2)");
86                UpdateButton.IsEnabled = true;
87                return;
88            }
89
90            if (Directory.Exists(LauncherinHakemistoPolku + "\\bin")) Directory.Delete(LauncherinHakemistoPolku + "\\bin", true);
91
92            WebClient webClient = new WebClient();
93            webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(Completed);
94            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
95            webClient.DownloadFileAsync(new Uri(updateFileUrl), LauncherinHakemistoPolku + "\\temp");
96            Update.StatusBox.Content = "Downloading update...";
97            Update.ProgressBar.Visibility = Visibility.Visible;
98            return;
99        }
100
101        /// <summary>
102        /// Luetaan tekstiä annetusta tekstitiedostosta.
103        /// </summary>
104        /// <param name="versiolistanUrl">Tiedoston URL.</param>
105        /// <returns>Tiedoston sisältö tekstinä.</returns>
106        public static String LueTekstiaNetista(string tiedostonURL)
107        {
108            HttpWebResponse response = null;
109            StreamReader reader = null;
110            StringBuilder teksti = new StringBuilder();
111            try
112            {
113                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(tiedostonURL);
114                request.Method = "GET";
115                response = (HttpWebResponse)request.GetResponse();
116                reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
117                while (!reader.EndOfStream)
118                {
119                    teksti.Append(reader.ReadLine() + "\n");
120                }
121            }
122
123            catch (WebException)
124            {
125                return "ERROR";
126            }
127
128            finally
129            {
130                if (reader != null)
131                    reader.Close();
132                if (response != null)
133                    response.Close();
134            }
135            return teksti.ToString();
136        }
137
138        private static void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
139        {
140            Update.ProgressBar.Value = e.ProgressPercentage;
141        }
142
143        private static void Completed(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
144        {
145            Update.StatusBox.Content = "Extracting...";
146            DecompressFiles(LauncherinHakemistoPolku + "\\temp", LauncherinHakemistoPolku + "\\bin", ""); // \bin luodaan DecompressFilesissa
147            Update.StatusBox.Content = "Game updated";
148
149            if (File.Exists(LauncherinHakemistoPolku + "\\temp")) File.Delete(LauncherinHakemistoPolku + "\\temp");
150
151            Update.ProgressBar.Value = 0;
152            Update.ProgressBar.Visibility = Visibility.Hidden;
153            LaunchButton.IsEnabled = true;
154            UpdateButton.IsEnabled = true;
155            VersionNumber.Content = Update.CheckVersionNumber(LauncherinHakemistoPolku + "\\bin\\version.txt");
156        }
157
158        /// <summary>
159        /// Puretaan Zip-tiedosto.
160        /// </summary>
161        /// <param name="ZipPath">Tiedoston polku.</param>
162        /// <param name="Destination">Mihin tiedostot puretaan. Jos hakemistoa ei ole, se luodaan.</param>
163        /// <param name="Password">Zipin salasana.</param>
164        public static void DecompressFiles(String ZipPath, String Destination, String Password)
165        {
166            using (ZipInputStream s = new ZipInputStream(File.OpenRead(ZipPath)))
167            {
168                if (Password != null && Password != String.Empty)
169                {
170                    s.Password = Password;
171                }
172
173                ZipEntry entry;
174                String tmpEntry = String.Empty;
175
176                while ((entry = s.GetNextEntry()) != null)
177                {
178                    String dirName = Destination;
179                    String fileName = Path.GetFileName(entry.Name);
180
181                    if (dirName != "")
182                    {
183                        Directory.CreateDirectory(dirName);
184                    }
185
186                    if (fileName != String.Empty)
187                    {
188                        if (entry.Name.IndexOf(".ini") < 0)
189                        {
190                            String FileName = dirName + "\\" + entry.Name;
191                            FileName = FileName.Replace("\\ ", "\\");
192
193                            String FolderName = Path.GetDirectoryName(FileName);
194
195                            if (Directory.Exists(FolderName) == false)
196                            {
197                                Directory.CreateDirectory(FolderName);
198                            }
199
200                            FileStream fStream = File.Create(FileName);
201                            int StreamSize = 2048;
202                            byte[] buffer = new byte[2048];
203
204                            while (true)
205                            {
206                                StreamSize = s.Read(buffer, 0, buffer.Length);
207                                if (StreamSize > 0)
208                                {
209                                    fStream.Write(buffer, 0, StreamSize);
210                                }
211                                else
212                                {
213                                    break;
214                                }
215                            }
216                            fStream.Close();
217                        }
218                    }
219                }
220                s.Close();
221            }
222        }
223
224        /// <summary>
225        /// Palauttaa annetun tiedoston sisällön.
226        /// </summary>
227        /// <param name="path">Tiedoston polku.</param>
228        /// <returns>Tiedoston sisällön ensimmäinen rivi.</returns>
229        public static String CheckVersionNumber(string path)
230        {
231            if (!File.Exists(path)) return "Not installed!";
232            using (StreamReader inStream = new StreamReader(path))
233                return inStream.ReadLine();
234        }
235    }
236}
Note: See TracBrowser for help on using the repository browser.