Skip to content
This repository has been archived by the owner on Nov 15, 2018. It is now read-only.

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
luisantonioa committed Feb 5, 2012
0 parents commit 651e876
Show file tree
Hide file tree
Showing 17 changed files with 1,126 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

*.user
*.suo
/WindowsLauncher/bin
/WindowsLauncher/obj
/_ReSharper.Technic
20 changes: 20 additions & 0 deletions Technic.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsLauncher", "WindowsLauncher\WindowsLauncher.csproj", "{F8127643-FCB9-44D4-9009-9523CC1265B5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F8127643-FCB9-44D4-9009-9523CC1265B5}.Debug|x86.ActiveCfg = Debug|x86
{F8127643-FCB9-44D4-9009-9523CC1265B5}.Debug|x86.Build.0 = Debug|x86
{F8127643-FCB9-44D4-9009-9523CC1265B5}.Release|x86.ActiveCfg = Release|x86
{F8127643-FCB9-44D4-9009-9523CC1265B5}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
49 changes: 49 additions & 0 deletions WindowsLauncher/HexUtil.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System.Text;

namespace WindowsLauncher
{
public static class HexUtil
{
/// <summary>
/// Hex string lookup table.
/// </summary>
private static readonly string[] HexStringTable = new[]
{
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F",
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F",
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F",
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F",
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF",
"B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF",
"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
"D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF",
"E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF",
"F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
};

/// <summary>
/// Returns a hex string representation of an array of bytes.
/// </summary>
/// <param name="value">The array of bytes.</param>
/// <returns>A hex string representation of the array of bytes.</returns>
public static string ToHex(byte[] value)
{
StringBuilder stringBuilder = new StringBuilder();
if (value != null)
{
foreach (byte b in value)
{
stringBuilder.Append(HexStringTable[b]);
}
}

return stringBuilder.ToString();
}
}
}
74 changes: 74 additions & 0 deletions WindowsLauncher/MainForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

148 changes: 148 additions & 0 deletions WindowsLauncher/MainForm.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;

namespace TechnicLauncher
{
public partial class Form1 : Form
{
public string LauncherURL = "https://raw.github.com/TechnicPack/Technic/master/";
private const string LauncherBackupFile = Program.LaucherFile + ".bak";
private const string LauncherTempFile = Program.LaucherFile + ".temp";
private int _hashDownloadCount, _launcherDownloadCount;

public bool IsAddressible(Uri uri)
{
try
{
using (var client = new MyClient())
{
client.HeadOnly = true;
client.DownloadString(uri);
return true;
}
}
catch (Exception loi)
{

}
return false;
}

public Form1()
{
InitializeComponent();

if (File.Exists(Program.LaucherFile))
{
DownloadHash();
}
else
{
DownloadLauncher();
}
}

private void DownloadHash()
{
lblStatus.Text = @"Checking Launcher Version..";
var versionCheck = new WebClient();
versionCheck.DownloadStringCompleted += DownloadStringCompleted;
var uri = new Uri(String.Format("{0}CHECKSUM.md5", LauncherURL));
if (_hashDownloadCount < 3 && IsAddressible(uri))
{
_hashDownloadCount++;
versionCheck.DownloadStringAsync(uri, Program.LaucherFile);
}
else
{
Program.RunLauncher();
Close();
}
}

private void DownloadLauncher()
{
lblStatus.Text = String.Format(@"Downloading Launcher ({0}/{1})..", _launcherDownloadCount, 3);

if (_launcherDownloadCount < 3)
{
_launcherDownloadCount++;
var wc = new WebClient();
wc.DownloadProgressChanged += DownloadProgressChanged;
wc.DownloadFileCompleted += DownloadFileCompleted;
wc.DownloadFileAsync(new Uri(String.Format("{0}technic-launcher.jar", LauncherURL)), LauncherTempFile);
}
else
{
Program.RunLauncher();
Close();
}
}

void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
DownloadLauncher();
return;
}
lblStatus.Text = @"Running Launcher..";
pbStatus.Value = 100;

if (File.Exists(LauncherBackupFile))
File.Delete(LauncherBackupFile);
if (File.Exists(Program.LaucherFile))
File.Move(Program.LaucherFile, LauncherBackupFile);
File.Move(LauncherTempFile, Program.LaucherFile);
Program.RunLauncher();
Close();
}

void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
{
DownloadHash();
return;
}
MD5 hash = new MD5CryptoServiceProvider();
String md5, serverMD5 = null;
var sb = new StringBuilder();
using (var fs = File.Open(Program.LaucherFile, FileMode.Open, FileAccess.Read))
{
var md5Bytes = hash.ComputeHash(fs);
foreach (byte hex in md5Bytes)
sb.Append(hex.ToString("x2"));
md5 = sb.ToString().ToLowerInvariant();
}

var lines = e.Result.Split(new[] {"\r\n", "\n"}, StringSplitOptions.None);
foreach (var line in lines)
{
if (!line.Contains("technic-launcher.jar")) continue;
serverMD5 = line.Split('|')[0].ToLowerInvariant();
break;
}

if (serverMD5 != null && serverMD5.Equals(md5)) {
Program.RunLauncher();
Close();
}
else
{
DownloadLauncher();
}
}

void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
lblStatus.Text = String.Format("Downloaded {0}% of launcher..", e.ProgressPercentage);
pbStatus.Value = e.ProgressPercentage;
}
}
}
Loading

0 comments on commit 651e876

Please sign in to comment.