// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // Defines the UpdateVersionService type. // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF.Services { using System; using System.Diagnostics; using System.IO; using System.Security.Cryptography; using System.Text.RegularExpressions; using System.Windows; using HandBrake.ApplicationServices; using HandBrake.ApplicationServices.Services.Interfaces; using HandBrakeWPF.Services.Interfaces; /// /// Update Version Service - Handlers Update and Versioning. /// public class UpdateVersionService : IUpdateVersionService { /// /// The Backing field for the user setting service /// private readonly IUserSettingService userSettingService; /// /// The Error Service Backing field. /// private readonly IErrorService errorService; /// /// Initializes a new instance of the class. /// /// /// The user setting service. /// /// /// The error Service. /// public UpdateVersionService(IUserSettingService userSettingService, IErrorService errorService) { this.userSettingService = userSettingService; this.errorService = errorService; } /// /// Get's HandBrakes version data from the CLI. /// public void SetCliVersionData() { string line; // 0 = SVN Build / Version // 1 = Build Date // Get the SHA1 Hash of HandBrakeCLI byte[] hash; string starupPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); using (Stream stream = File.OpenRead(Path.Combine(starupPath, "HandBrakeCLI.exe"))) { hash = SHA1.Create().ComputeHash(stream); } string base64Hash = Convert.ToBase64String(hash); // Compare the hash with the last known hash. If it's the same, return. if (userSettingService.GetUserSetting(ASUserSettingConstants.HandBrakeExeHash) == base64Hash) { return; } // It's not the same, so start the CLI to get it's version data. Process cliProcess = new Process(); ProcessStartInfo handBrakeCli = new ProcessStartInfo("HandBrakeCLI.exe", " -u -v0") { UseShellExecute = false, RedirectStandardError = true, RedirectStandardOutput = true, CreateNoWindow = true }; cliProcess.StartInfo = handBrakeCli; try { cliProcess.Start(); // Retrieve standard output and report back to parent thread until the process is complete TextReader stdOutput = cliProcess.StandardError; while (!cliProcess.HasExited) { line = stdOutput.ReadLine() ?? string.Empty; Match m = Regex.Match(line, @"HandBrake ([svnM0-9.]*) \(([0-9]*)\)"); Match platform = Regex.Match(line, @"- ([A-Za-z0-9\s ]*) -"); if (m.Success) { string version = m.Groups[1].Success ? m.Groups[1].Value : string.Empty; string build = m.Groups[2].Success ? m.Groups[2].Value : string.Empty; int buildValue; int.TryParse(build, out buildValue); userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakeBuild, buildValue); userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakeVersion, version); } if (platform.Success) { userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakePlatform, platform.Value.Replace("-", string.Empty).Trim()); } if (cliProcess.TotalProcessorTime.Seconds > 10) // Don't wait longer than 10 seconds. { Process cli = Process.GetProcessById(cliProcess.Id); if (!cli.HasExited) { cli.Kill(); } } } userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakeExeHash, base64Hash); } catch (Exception e) { userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakeBuild, string.Empty); userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakePlatform, string.Empty); userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakeVersion, string.Empty); userSettingService.SetUserSetting(ASUserSettingConstants.HandBrakeExeHash, string.Empty); this.errorService.ShowError("Unable to Initialise HandBrake", "This error is unrecoverable. Maybe try restarting.", e); Application.Current.Shutdown(); } } } }