// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // We have multiple implementations of IScan. This is a wrapper class for the GUI so that the // implementation used is controllable via user settings. // Over time, this class will go away when the LibHB and process isolation code matures. // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrakeWPF.Services { using System; using HandBrake.ApplicationServices.Exceptions; using HandBrake.ApplicationServices.Isolation; using HandBrake.ApplicationServices.Parsing; using HandBrake.ApplicationServices.Services; using HandBrake.ApplicationServices.Services.Interfaces; using HandBrake.Interop; using HandBrake.Interop.Interfaces; /// /// We have multiple implementations of IScan. This is a wrapper class for the GUI so that the /// implementation used is controllable via user settings. /// Over time, this class will go away when the LibHB and process isolation code matures. /// public class ScanServiceWrapper : IScanServiceWrapper { #region Constants and Fields /// /// The handbrake instance. /// public static IHandBrakeInstance HandbrakeInstance; /// /// The scan service. /// private readonly IScan scanService; #endregion #region Constructors and Destructors /// /// Initializes a new instance of the class. /// /// /// The user setting service. /// public ScanServiceWrapper(IUserSettingService userSettingService) { var useLibHb = userSettingService.GetUserSetting(UserSettingConstants.EnableLibHb); var useProcessIsolation = userSettingService.GetUserSetting(UserSettingConstants.EnableProcessIsolation); string port = userSettingService.GetUserSetting(UserSettingConstants.ServerPort); if (useLibHb) { try { if (useProcessIsolation) { this.scanService = new IsolatedScanService(port); } else { HandbrakeInstance = new HandBrakeInstance(); this.scanService = new LibScan(userSettingService, HandbrakeInstance); } } catch(Exception exc) { // Try to recover from errors. userSettingService.SetUserSetting(UserSettingConstants.EnableLibHb, false); throw new GeneralApplicationException("Unable to initialise LibHB or Background worker service", "Falling back to using HandBrakeCLI.exe. Setting has been reset", exc); } } else { this.scanService = new ScanService(userSettingService); } this.scanService.ScanCompleted += this.ScanServiceScanCompleted; this.scanService.ScanStared += this.ScanServiceScanStared; this.scanService.ScanStatusChanged += this.ScanServiceScanStatusChanged; } /// /// The scan service scan status changed event /// /// /// The sender. /// /// /// The ScanProgressEventArgs. /// private void ScanServiceScanStatusChanged(object sender, HandBrake.ApplicationServices.EventArgs.ScanProgressEventArgs e) { this.ScanStatusChanged(sender, e); } /// /// The scan service scan stared event /// /// /// The sender. /// /// /// The EventArgs /// private void ScanServiceScanStared(object sender, EventArgs e) { this.ScanStared(sender, e); } /// /// The scan service scan completed event /// /// /// The sender. /// /// /// The ScanCompletedEventArgs /// private void ScanServiceScanCompleted(object sender, HandBrake.ApplicationServices.EventArgs.ScanCompletedEventArgs e) { this.ScanCompleted(sender, e); } #endregion #region Events /// /// The scan completed. /// public event ScanCompletedStatus ScanCompleted; /// /// The scan stared. /// public event EventHandler ScanStared; /// /// The scan status changed. /// public event ScanProgessStatus ScanStatusChanged; #endregion #region Properties /// /// Gets ActivityLog. /// public string ActivityLog { get { return this.scanService.ActivityLog; } } /// /// Gets a value indicating whether IsScanning. /// public bool IsScanning { get { return this.scanService.IsScanning; } } /// /// Gets the Souce Data. /// public Source SouceData { get { return this.scanService.SouceData; } } #endregion #region Implemented Interfaces #region IScan /// /// Take a Scan Log file, and process it as if it were from the CLI. /// /// /// The path to the log file. /// public void DebugScanLog(string path) { this.scanService.DebugScanLog(path); } /// /// Shutdown the service. /// public void Shutdown() { this.scanService.Shutdown(); } /// /// Scan a Source Path. /// Title 0: scan all /// /// /// Path to the file to scan /// /// /// int title number. 0 for scan all /// /// /// The preview Count. /// /// /// The post Action. /// public void Scan(string sourcePath, int title, int previewCount, Action postAction) { this.scanService.Scan(sourcePath, title, previewCount, postAction); } /// /// Kill the scan /// public void Stop() { this.scanService.Stop(); } #endregion #endregion } }