using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using System.IO.Compression; using ICSharpCode.SharpZipLib.Tar; using System.Net; using System.Collections.Specialized; namespace GamerServices { public partial class FormDevUpdate : Form { class Prop{ public String Path; public String Action; } private Game G; private String CurPath = ""; private List Props = new List(); public FormDevUpdate(Game g) { G = g; CurPath = ""; CheckForIllegalCrossThreadCalls = false; this.Icon = G.Main.Icon; InitializeComponent(); } private void FormDevUpdate_Load(object sender, EventArgs e) { listBox1.Items.Clear(); listBox2.Items.Clear(); Browse(); } private void Browse() { try { string startdir = Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/"; int startpos = startdir.Length; listBox1.Items.Clear(); int slashes = 0; int lastshalsh = CurPath.IndexOf("/"); while(lastshalsh > -1){ slashes++; lastshalsh = CurPath.IndexOf("/", lastshalsh + 1); } if (slashes > 0) { listBox1.Items.Add("..."); } foreach (string dir in Directory.GetDirectories(startdir + CurPath)) { listBox1.Items.Add(dir.Substring(startpos + CurPath.Length)); } foreach (string file in Directory.GetFiles(startdir + CurPath)) { if (!(CurPath == "" && file.Substring(startpos + CurPath.Length) == "version.txt")) { listBox1.Items.Add(file.Substring(startpos + CurPath.Length)); } } } catch(Exception e) { } } private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) { if ((string)listBox1.SelectedItem == "...") { string[] splited = CurPath.Split('/'); CurPath = ""; if (splited.Length > 1) { for (int i = 0; i < splited.Length - 2; i++ ) { CurPath += splited[i] + "/"; } } } else { if (Directory.Exists(Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + CurPath + (string)listBox1.SelectedItem)) CurPath += (string)listBox1.SelectedItem + "/"; else additem(CurPath + (string)listBox1.SelectedItem); } Browse(); } private void button3_Click(object sender, EventArgs e) { groupBox1.Enabled = false; groupBox2.Enabled = false; button3.Enabled = false; timer1.Enabled = true; new System.Threading.Thread(new System.Threading.ThreadStart(TarMaker)).Start(); } private void TarMaker() { progressBar1.Value = 0; string updatedata = ""; string root = Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/"; string newver = ""; labelInfo.Text = "Recieving latest version info..."; try { System.Net.WebClient client = new System.Net.WebClient(); client.Proxy = null; string[] verdata = new StreamReader(client.OpenRead("http://" + "gs.mrag.nl/download.php?gid=" + G.GameID + "&file=updates.txt")).ReadToEnd().Replace("\r", "").Split('\n'); foreach (string line in verdata){ if (line.Length > 0) { string[] args = null; if (line.Contains("=")) args = line.Split('='); if (line.TrimStart('\t', ' ').StartsWith("#")){ }else if (args[0] == "VER"){ short[] splitver = new short[4]; string[] tmp = args[1].Split('.'); for (int i = 0; i < tmp.Length; i++) splitver[i] = byte.Parse(tmp[i]); splitver[3]++; for (int i = 2; i > -1; i--) { if (splitver[i + 1] > 255) { splitver[i]++; splitver[i + 1] = 0; } } newver = splitver[0] + "." + splitver[1] + "." + splitver[2] + "." + splitver[3]; break; } } } } catch { newver = "0.0.0.0"; } labelInfo.Text = "Initializing version " + newver; string newverfile = root + "update-" + newver.Replace('.', '_'); updatedata = "VER=" + newver; labelInfo.Text = "Removing old files..."; while (true) { try { if (File.Exists(newverfile + ".tar")) File.Delete(newverfile + ".tar"); if (File.Exists(newverfile + ".txt")) File.Delete(newverfile + ".txt"); break; } catch (Exception e){ if (MessageBox.Show(e.Message, "Error while removing old version files!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry) { break; } } } labelInfo.Text = "Counting total file size..."; int totalsize = 0; for (int i = 0; i < Props.Count; i++) { if (Props[i].Action == "ADD") { while (true) { try { totalsize += (int)new FileInfo(root + (string)listBox2.Items[i]).Length; updatedata += "\r\n" + Props[i].Action + "=" + Props[i].Path; break; } catch(Exception e) { if (MessageBox.Show(e.Message, "Error while reading filesize!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry) { break; } } } }else updatedata += "\r\n" + Props[i].Action + "=" + Props[i].Path; } progressBar1.Minimum = 0; progressBar1.Maximum = totalsize; using (TarOutputStream tarOutputStream = new TarOutputStream(File.Create(newverfile + ".tar"))) { while (Props.Count > 0) { labelInfo.Text = "Writing tar file... " + Props[0].Path; listBox2.ClearSelected(); listBox2.SetSelected(0, true); listBox2.SetSelected(0, false); if (Props[0].Action == "ADD") { while (true) { try { FileInfo info = new FileInfo(root + Props[0].Path); using (Stream inputStream = File.OpenRead(root + Props[0].Path)) { long fileSize = inputStream.Length; TarEntry entry = TarEntry.CreateTarEntry(Props[0].Path.Replace("\\", "/")); entry.Size = fileSize; tarOutputStream.PutNextEntry(entry); byte[ ] localBuffer = new byte[32 * 1024]; while (true) { int numRead = inputStream.Read(localBuffer, 0, localBuffer.Length); if (numRead <= 0) { break; } tarOutputStream.Write(localBuffer, 0, numRead); } } tarOutputStream.CloseEntry(); progressBar1.Increment((int)info.Length); break; } catch(Exception e) { if (MessageBox.Show(e.Message, "Error while parsing file!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry) { break; } } } } listBox2.Items.RemoveAt(0); Props.RemoveAt(0); } labelInfo.Text = "Saving tar file... "; } labelInfo.Text = "Writing patch config..."; File.WriteAllText(newverfile + ".txt", updatedata); labelInfo.Text = "Initializing upload..."; button2.Tag = Math.Round((double)new FileInfo(newverfile + ".tar").Length / 1024 / 1024, 3).ToString(); button3.Tag = newver; new System.Threading.Thread(new System.Threading.ThreadStart(Upload)).Start(); } private void button2_Click(object sender, EventArgs e) { for (int i = 0; i < listBox2.SelectedItems.Count; i++){ for (int i2 = 0; i2 < Props.Count; i2++) { if (Props[i2].Path == (string)listBox2.SelectedItems[i]){ Props.RemoveAt(i2); break; } } listBox2.Items.Remove((string)listBox2.SelectedItems[i]); i--; } if (listBox2.Items.Count == 0) button3.Enabled = false; } private void button1_Click(object sender, EventArgs e) { foreach (object obj in listBox1.SelectedItems) { additem(CurPath + (string)obj); if (Directory.Exists(Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + CurPath + (string)obj)) { adddir(CurPath + (string)obj); } } } private void adddir(string addpath) { string startdir = Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + addpath; string reppath = Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/"; int startpos = reppath.Length; foreach (string dir in Directory.GetDirectories(startdir)) { additem(dir.Substring(startpos)); adddir(dir.Substring(startpos)); } foreach (string file in Directory.GetFiles(startdir)) { additem(file.Substring(startpos)); } } private void additem(string item) { if (!listBox2.Items.Contains(item)) { string itempath = Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + item; Prop p = new Prop(); p.Path = item; p.Action = Directory.Exists(itempath) ? "MDR" : File.Exists(itempath) ? "ADD" : "MNF"; Props.Add(p); listBox2.Items.Add(item); listBox2.ClearSelected(); listBox2.SetSelected(listBox2.Items.Count - 1, true); listBox2.SetSelected(listBox2.Items.Count - 1, false); button3.Enabled = true; } } private void listBox2_SelectedIndexChanged(object sender, EventArgs e) { if (listBox2.SelectedItems.Count > 0){ string defcmd = ""; foreach (Prop p in Props) { if ((string)listBox2.SelectedItems[0] == p.Path) { defcmd = p.Action; break; } } if (listBox2.SelectedItems.Count > 1) { foreach (string itm in listBox2.SelectedItems) { foreach (Prop p in Props) { if (itm == p.Path) { if (p.Action != defcmd) { defcmd = "*"; break; } } } if (defcmd == "*") break; } comboCommand.Text = defcmd; textPath.Text = "*"; } else { comboCommand.Text = Props[listBox2.Items.IndexOf((string)listBox2.SelectedItems[0])].Action; textPath.Text = (string)listBox2.SelectedItems[0]; } switch (comboCommand.Text) { case "ADD": labelHelp.Text = "Adds a new file to the folder, if it already exists it wil be overwritten."; break; case "DEL": labelHelp.Text = "Deletes a file/folder."; break; case "MNF": labelHelp.Text = "Creates a new empty file."; break; case "MDR": labelHelp.Text = "Creates an folder."; break; } groupBox2.Enabled = true; }else groupBox2.Enabled = false; } private void button6_Click(object sender, EventArgs e) { additem("Empty"); } private void button4_Click(object sender, EventArgs e) { Props[listBox2.SelectedIndex].Action = comboCommand.Text; Props[listBox2.SelectedIndex].Path = textPath.Text; listBox2.Items[listBox2.SelectedIndex] = textPath.Text; } private void comboCommand_SelectionChangeCommitted(object sender, EventArgs e) { foreach (string itm in listBox2.SelectedItems) { foreach (Prop p in Props) { if (itm == p.Path) { p.Action = comboCommand.Text; break; } } } } private void comboCommand_SelectedIndexChanged(object sender, EventArgs e) { } private void Upload(){ WebClient wClient = new WebClient(); wClient.Proxy = null; labelInfo.Text = "Uploading new version file..."; string[] txt = null; int failsafe = 0; while (failsafe < 3) { try { txt = MyUploader(Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + "update-" + (button3.Tag as string).Replace('.', '_') + ".txt", "http://" + "gs.mrag.nl/api/" + G.Main.Sessionkey + "/txt/" + G.GameID).Split('\n'); break; } catch { failsafe++; } } if (failsafe > 2) { G.Main.Error(txt[1]); labelInfo.Text = "Failed to upload new patch, the WebRequest was rejected by the server."; groupBox1.Enabled = true; groupBox2.Enabled = true; timer1.Enabled = false; timeranimation = 0; radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; radioButton5.Checked = false; radioButton6.Checked = false; radioButton7.Checked = false; radioButton8.Checked = false; radioButton9.Checked = false; radioButton10.Checked = false; radioButton11.Checked = false; radioButton12.Checked = false; radioButton13.Checked = false; radioButton14.Checked = false; radioButton15.Checked = false; radioButton16.Checked = false; radioButton17.Checked = false; radioButton18.Checked = false; radioButton19.Checked = false; radioButton20.Checked = false; radioButton21.Checked = false; radioButton22.Checked = false; radioButton23.Checked = false; radioButton24.Checked = false; radioButton25.Checked = false; radioButton26.Checked = false; return; } if (txt[0] == "no") { G.Main.Error(txt[1]); labelInfo.Text = "Failed!"; groupBox1.Enabled = true; groupBox2.Enabled = true; timer1.Enabled = false; timeranimation = 0; radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; radioButton5.Checked = false; radioButton6.Checked = false; radioButton7.Checked = false; radioButton8.Checked = false; radioButton9.Checked = false; radioButton10.Checked = false; radioButton11.Checked = false; radioButton12.Checked = false; radioButton13.Checked = false; radioButton14.Checked = false; radioButton15.Checked = false; radioButton16.Checked = false; radioButton17.Checked = false; radioButton18.Checked = false; radioButton19.Checked = false; radioButton20.Checked = false; radioButton21.Checked = false; radioButton22.Checked = false; radioButton23.Checked = false; radioButton24.Checked = false; radioButton25.Checked = false; radioButton26.Checked = false; return; } labelInfo.Text = "Uploading new patch..."; string[] tar = null; failsafe = 0; while (failsafe < 3) { try { tar = MyUploader(Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + "update-" + (button3.Tag as string).Replace('.', '_') + ".tar", "http://" + "gs.mrag.nl/api/" + G.Main.Sessionkey + "/tar/" + G.GameID).Split('\n'); break; } catch { failsafe++; } } if (failsafe > 2) { G.Main.Error(txt[1]); labelInfo.Text = "Failed to upload new patch, the WebRequest was rejected by the server."; groupBox1.Enabled = true; groupBox2.Enabled = true; timer1.Enabled = false; timeranimation = 0; radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; radioButton5.Checked = false; radioButton6.Checked = false; radioButton7.Checked = false; radioButton8.Checked = false; radioButton9.Checked = false; radioButton10.Checked = false; radioButton11.Checked = false; radioButton12.Checked = false; radioButton13.Checked = false; radioButton14.Checked = false; radioButton15.Checked = false; radioButton16.Checked = false; radioButton17.Checked = false; radioButton18.Checked = false; radioButton19.Checked = false; radioButton20.Checked = false; radioButton21.Checked = false; radioButton22.Checked = false; radioButton23.Checked = false; radioButton24.Checked = false; radioButton25.Checked = false; radioButton26.Checked = false; return; } if (tar[0] == "no") { G.Main.Error(txt[1]); labelInfo.Text = "Failed!"; groupBox1.Enabled = true; groupBox2.Enabled = true; timer1.Enabled = false; timeranimation = 0; radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; radioButton5.Checked = false; radioButton6.Checked = false; radioButton7.Checked = false; radioButton8.Checked = false; radioButton9.Checked = false; radioButton10.Checked = false; radioButton11.Checked = false; radioButton12.Checked = false; radioButton13.Checked = false; radioButton14.Checked = false; radioButton15.Checked = false; radioButton16.Checked = false; radioButton17.Checked = false; radioButton18.Checked = false; radioButton19.Checked = false; radioButton20.Checked = false; radioButton21.Checked = false; radioButton22.Checked = false; radioButton23.Checked = false; radioButton24.Checked = false; radioButton25.Checked = false; radioButton26.Checked = false; return; } labelInfo.Text = "Removing temp update files..."; while (true) { try { File.Delete(Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + "update-" + (button3.Tag as string).Replace('.', '_') + ".tar"); break; } catch (Exception e) { if (MessageBox.Show(e.Message, "Error while removing temp files!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry) { break; } } } while (true) { try { File.Delete(Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/" + "update-" + (button3.Tag as string).Replace('.', '_') + ".txt"); break; } catch (Exception e) { if (MessageBox.Show(e.Message, "Error while removing temp files!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry) { break; } } } labelInfo.Text = "Updateing local version file..."; while (true) { try { File.WriteAllText(Directory.GetCurrentDirectory() + "/Games/" + G.GameID + "/version.txt", (string)button3.Tag); break; } catch (Exception e) { if (MessageBox.Show(e.Message, "Error while writing local version file!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error) != DialogResult.Retry) { break; } } } labelInfo.Text = "Done!"; groupBox1.Enabled = true; groupBox2.Enabled = true; timer1.Enabled = false; timeranimation = 0; radioButton1.Checked = false; radioButton2.Checked = false; radioButton3.Checked = false; radioButton4.Checked = false; radioButton5.Checked = false; radioButton6.Checked = false; radioButton7.Checked = false; radioButton8.Checked = false; radioButton9.Checked = false; radioButton10.Checked = false; radioButton11.Checked = false; radioButton12.Checked = false; radioButton13.Checked = false; radioButton14.Checked = false; radioButton15.Checked = false; radioButton16.Checked = false; radioButton17.Checked = false; radioButton18.Checked = false; radioButton19.Checked = false; radioButton20.Checked = false; radioButton21.Checked = false; radioButton22.Checked = false; radioButton23.Checked = false; radioButton24.Checked = false; radioButton25.Checked = false; radioButton26.Checked = false; MessageBox.Show("Uploaded patch for version " + button3.Tag + "!\nFile size: " + button2.Tag + " MB", "Done!", MessageBoxButtons.OK, MessageBoxIcon.Information); } public static string MyUploader(string strFileToUpload, string strUrl) { string strFileFormName = "file"; Uri oUri = new Uri(strUrl); string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x"); // The trailing boundary string byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); // The post message header StringBuilder sb = new StringBuilder(); sb.Append("--"); sb.Append(strBoundary); sb.Append("\r\n"); sb.Append("Content-Disposition: form-data; name=\""); sb.Append(strFileFormName); sb.Append("\"; filename=\""); sb.Append(Path.GetFileName(strFileToUpload)); sb.Append("\""); sb.Append("\r\n"); sb.Append("Content-Type: "); sb.Append("application/octet-stream"); sb.Append("\r\n"); sb.Append("\r\n"); string strPostHeader = sb.ToString(); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); // The WebRequest HttpWebRequest oWebrequest = (HttpWebRequest)WebRequest.Create(oUri); oWebrequest.ContentType = "multipart/form-data; boundary=" + strBoundary; oWebrequest.Method = "POST"; // This is important, otherwise the whole file will be read to memory anyway... oWebrequest.AllowWriteStreamBuffering = false; // Get a FileStream and set the final properties of the WebRequest FileStream oFileStream = new FileStream(strFileToUpload, FileMode.Open, FileAccess.Read); long length = postHeaderBytes.Length + oFileStream.Length + boundaryBytes.Length; oWebrequest.ContentLength = length; Stream oRequestStream = oWebrequest.GetRequestStream(); // Write the post header oRequestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); // Stream the file contents in small pieces (4096 bytes, max). byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)oFileStream.Length))]; int bytesRead = 0; while ((bytesRead = oFileStream.Read(buffer, 0, buffer.Length)) != 0) oRequestStream.Write(buffer, 0, bytesRead); oFileStream.Close(); // Add the trailing boundary oRequestStream.Write(boundaryBytes, 0, boundaryBytes.Length); WebResponse oWResponse = oWebrequest.GetResponse(); Stream s = oWResponse.GetResponseStream(); StreamReader sr = new StreamReader(s); String sReturnString = sr.ReadToEnd(); // Clean up oFileStream.Close(); oRequestStream.Close(); s.Close(); sr.Close(); return sReturnString; } private byte timeranimation = 0; private void timer1_Tick(object sender, EventArgs e) { switch (timeranimation) { case 0: radioButton1.Checked = false; radioButton2.Checked = true; break; case 1: radioButton2.Checked = false; radioButton3.Checked = true; break; case 2: radioButton3.Checked = false; radioButton4.Checked = true; break; case 3: radioButton4.Checked = false; radioButton5.Checked = true; break; case 4: radioButton5.Checked = false; radioButton6.Checked = true; break; case 5: radioButton6.Checked = false; radioButton7.Checked = true; break; case 6: radioButton7.Checked = false; radioButton8.Checked = true; break; case 7: radioButton8.Checked = false; radioButton9.Checked = true; break; case 8: radioButton9.Checked = false; radioButton10.Checked = true; break; case 9: radioButton11.Checked = false; radioButton12.Checked = true; break; case 10: radioButton12.Checked = false; radioButton13.Checked = true; break; case 11: radioButton13.Checked = false; radioButton14.Checked = true; break; case 12: radioButton14.Checked = false; radioButton15.Checked = true; break; case 13: radioButton15.Checked = false; radioButton16.Checked = true; break; case 14: radioButton16.Checked = false; radioButton17.Checked = true; break; case 15: radioButton17.Checked = false; radioButton18.Checked = true; break; case 16: radioButton18.Checked = false; radioButton19.Checked = true; break; case 17: radioButton19.Checked = false; radioButton20.Checked = true; break; case 18: radioButton20.Checked = false; radioButton21.Checked = true; break; case 19: radioButton21.Checked = false; radioButton22.Checked = true; break; case 20: radioButton22.Checked = false; radioButton23.Checked = true; break; case 21: radioButton23.Checked = false; radioButton24.Checked = true; break; case 22: radioButton24.Checked = false; radioButton25.Checked = true; break; case 23: radioButton25.Checked = false; radioButton26.Checked = true; break; case 24: radioButton26.Checked = false; radioButton1.Checked = true; break; } timeranimation++; if (timeranimation > 24) timeranimation = 0; } private void comboCommand_SelectedValueChanged(object sender, EventArgs e) { switch (comboCommand.Text) { case "ADD": labelHelp.Text = "Adds a new file to the folder, if it already exists it wil be overwritten."; break; case "DEL": labelHelp.Text = "Deletes an file/folder."; break; case "MNF": labelHelp.Text = "Creates an new empty file."; break; case "MDR": labelHelp.Text = "Creates an folder."; break; } } } }