} //end LauncherForm_KeyDown private void updateChecker_DoWork(object sender, DoWorkEventArgs e) { try { var force = e.Argument != null && (bool)e.Argument; var versionInfo = Helpers.GetVersionInfo(this._config.VersionInfoUrl, this._config.PublicKey); var launcherKey = Registry.CurrentUser.OpenSubKey(@"Software\" + this._config.KeyName, true); var lastUpdatedCheck = launcherKey.GetValue("LastUpdated"); var updatesLastRun = (int?)lastUpdatedCheck ?? 0; if (versionInfo == null) { return; } var settings = Helpers.LoadSettings(this._config.KeyName); if (Helpers.UpdateConfig(versionInfo)) { MessageBox.Show("Configuration information was updated from the server.\n\nThe launcher will close. Please re-launch.", @"Configuration Updated", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); return; } var applicationPath = Application.ExecutablePath; var appDataPath = Directory.GetParent(Application.UserAppDataPath).ToString(); var updaterLocation = Path.Combine(appDataPath, "Updater.exe"); var updaterChecksum = Helpers.GetChecksum(updaterLocation); if (!File.Exists(updaterLocation) || updaterChecksum != versionInfo.FileChecksums["Updater.exe"]) { using (var client = new WebClient()) { client.DownloadProgressChanged += client_DownloadProgressChanged; client.DownloadFileAsyncSync(new Uri(this._config.UpdaterUrl.ToString()), updaterLocation); } this.updateChecker.ReportProgress(1); } //end if if (versionInfo.Version != Version) { var result = DialogResult.Cancel; // push to the UI thread to actually display the dialog... ugly hack var dialog = this.BeginInvoke(new MethodInvoker(delegate { result = new UpdateForm(versionInfo).ShowDialog(); })); this.EndInvoke(dialog); if (result == DialogResult.OK) { var info = new ProcessStartInfo(updaterLocation); info.Arguments = "\"" + applicationPath + "\""; if (Environment.OSVersion.Version.Major >= 6) { info.Verb = "runas"; } Process.Start(info); } //end if } //end if if (versionInfo.LastUpdated < updatesLastRun && !force) { return; } // checks for > 1 because the Updater.exe is always present. if (versionInfo.FileChecksums != null && versionInfo.FileChecksums.Count > 1) { Helpers.SetControlPropertyThreadSafe(this.prgUpdates, "Maximum", versionInfo.FileChecksums.Count); for (var i = 1; i < versionInfo.FileChecksums.Count; i++) { var file = versionInfo.FileChecksums.ElementAt(i).Key; var checksum = versionInfo.FileChecksums.ElementAt(i).Value; var filePath = Path.Combine(this._config.InstallDir, file); if (!File.Exists(filePath) || Helpers.GetChecksum(filePath) != checksum) { var extension = Path.GetExtension(file); using (var client = new WebClient()) { client.DownloadProgressChanged += client_DownloadProgressChanged; if (File.Exists(filePath) && extension != null && extension.Equals(".pak", StringComparison.CurrentCultureIgnoreCase) && !file.Contains("zelgo")) { var idxFile = filePath.Replace(".pak", ".idx"); var pakIndex = PakTools.RebuildPak(filePath, versionInfo.PakFiles[file], true); PakTools.RebuildIndex(idxFile, pakIndex, true); } else { client.DownloadFileAsyncSync( new Uri(this._config.UpdaterFilesRoot + file.Replace("\\", "/")), filePath); } } } this.updateChecker.ReportProgress(i); } //end for var currentTime = DateTime.UtcNow - new DateTime(1970, 1, 1); launcherKey.SetValue("LastUpdated", (int)currentTime.TotalSeconds, RegistryValueKind.DWord); string versionName; var isWin8OrHigher = Helpers.IsWin8OrHigher(out versionName); if (isWin8OrHigher && versionName == "Windows 10" && settings.ClientBin.ToLower() != "s3ep1u.bin") { settings.ClientBin = "S3EP1U.bin"; Helpers.SaveSettings(this._config.KeyName, settings, this._config.InstallDir, true); MessageBox.Show( "You're running Windows 10, but aren't using the S3EP1U.bin file. It has now been automatically set.\n\n" + @"If you want to use the normal S3EP1.bin file, you can update it under Settings -> Client Settings.", @"Windows 10 Detected", MessageBoxButtons.OK, MessageBoxIcon.Information); } //end if } //end if } finally { this.updateChecker.ReportProgress(this.prgUpdates.Maximum); } //end try/finally } //end updateChecker
} //end updateChecker private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { Helpers.SetControlPropertyThreadSafe(this.prgUpdateCurrent, "Maximum", (int)e.TotalBytesToReceive / 100); Helpers.SetControlPropertyThreadSafe(this.prgUpdateCurrent, "Value", (int)e.BytesReceived / 100); } //end client_DownloadProgressChanged
private bool CheckServerStatus(bool threaded) { var returnValue = false; var host = string.Empty; var port = -1; //add a delay so the "pinging..." actually shows up. Otherwise it kind of looks //like it isn't trying to check if (threaded) { Helpers.SetControlPropertyThreadSafe(this.btnPlay, "Enabled", false); Thread.Sleep(500); cmbServer.Invoke(new Action( () => { host = this._config.Servers[this.cmbServer.Text].IpOrDns; port = this._config.Servers[this.cmbServer.Text].Port; })); } else { this.btnPlay.Enabled = false; host = this._config.Servers[this.cmbServer.Text].IpOrDns; port = this._config.Servers[this.cmbServer.Text].Port; } //should never happen, but let's handle it just in case if (host == string.Empty || port == -1) { return(false); } using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { try { var result = socket.BeginConnect(host, port, null, null); result.AsyncWaitHandle.WaitOne(2000, true); if (!socket.Connected) { Helpers.SetControlPropertyThreadSafe(this.lblServerStatus, "Text", "OFFLINE"); Helpers.SetControlPropertyThreadSafe(this.lblServerStatus, "ForeColor", Color.Red); } else { returnValue = true; Helpers.SetControlPropertyThreadSafe(this.lblServerStatus, "Text", "ONLINE"); Helpers.SetControlPropertyThreadSafe(this.lblServerStatus, "ForeColor", Color.Green); var updateCheckComplete = false; prgUpdates.Invoke(new Action(() => { updateCheckComplete = prgUpdates.Value == prgUpdates.Maximum; })); if (updateCheckComplete) { Helpers.SetControlPropertyThreadSafe(this.btnPlay, "Enabled", true); } } } catch (Exception) { Helpers.SetControlPropertyThreadSafe(this.lblServerStatus, "Text", "OFFLINE"); Helpers.SetControlPropertyThreadSafe(this.lblServerStatus, "ForeColor", Color.Red); } finally { socket.Close(); } //end try/catch/finally } //end using return(returnValue); } //end checkServerStatus