From ccd60c79e7bbe7e961885c8d7eb24a6536aeb670 Mon Sep 17 00:00:00 2001 From: sr55 Date: Sat, 1 Sep 2012 21:55:29 +0000 Subject: WinGui: Further work in the process isolation service. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4927 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- .../Services/Interfaces/IServerService.cs | 5 +- .../Services/ServerService.cs | 8 +-- win/CS/HandBrake.Server/Program.cs | 13 ++++- .../Isolation/BackgroundServiceConnector.cs | 25 ++++++++-- .../Isolation/IsolatedEncodeService.cs | 7 ++- .../HandBrakeWPF/Isolation/IsolatedScanService.cs | 6 ++- win/CS/HandBrakeWPF/UserSettingConstants.cs | 10 ++++ win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs | 16 +++--- win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs | 57 ++++++++++++++++++++-- win/CS/HandBrakeWPF/Views/MainView.xaml | 2 +- win/CS/HandBrakeWPF/Views/OptionsView.xaml | 18 +++++++ win/CS/HandBrakeWPF/defaultsettings.xml | 17 +++++++ 12 files changed, 158 insertions(+), 26 deletions(-) (limited to 'win') diff --git a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IServerService.cs b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IServerService.cs index 49eedffa5..60d9d0b57 100644 --- a/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IServerService.cs +++ b/win/CS/HandBrake.ApplicationServices/Services/Interfaces/IServerService.cs @@ -63,7 +63,10 @@ namespace HandBrake.ApplicationServices.Services.Interfaces /// /// Start the WCF Service /// - void Start(); + /// + /// The port. + /// + void Start(string port); /// /// Stop the WCF Service diff --git a/win/CS/HandBrake.ApplicationServices/Services/ServerService.cs b/win/CS/HandBrake.ApplicationServices/Services/ServerService.cs index 9984ade21..277a7c5b3 100644 --- a/win/CS/HandBrake.ApplicationServices/Services/ServerService.cs +++ b/win/CS/HandBrake.ApplicationServices/Services/ServerService.cs @@ -146,15 +146,15 @@ namespace HandBrake.ApplicationServices.Services /// /// Start the service /// - public void Start() + public void Start(string port) { - using (this.host = new ServiceHost(typeof(ServerService), new Uri("net.tcp://localhost:8000"))) + using (this.host = new ServiceHost(typeof(ServerService), new Uri(string.Format("net.tcp://127.0.0.1:{0}", port)))) { // Setup a listener this.host.AddServiceEndpoint(typeof(IServerService), new NetTcpBinding(), "IHbService"); this.host.Open(); - Console.WriteLine("::: HandBrake Server :::"); - Console.WriteLine("Service Started"); + Console.WriteLine("::: HandBrake Isolation Server:::"); + Console.WriteLine("Service Started. Waiting for Clients..."); // Setup the services we are going to use. scanService = new ScanService(new UserSettingService()); // TODO this needs wired up with castle diff --git a/win/CS/HandBrake.Server/Program.cs b/win/CS/HandBrake.Server/Program.cs index baf39e692..3ec5e2248 100644 --- a/win/CS/HandBrake.Server/Program.cs +++ b/win/CS/HandBrake.Server/Program.cs @@ -1,6 +1,7 @@ namespace HandBrake.Server { using System; + using System.Linq; using HandBrake.ApplicationServices.Services; using HandBrake.ApplicationServices.Services.Interfaces; @@ -18,8 +19,16 @@ /// static void Main(string[] args) { - IServerService server = new ServerService(); - server.Start(); + if (args.Count() != 1) + { + Console.WriteLine("Invalid Arguments"); + Console.ReadLine(); + } + else + { + IServerService server = new ServerService(); + server.Start(args[0]); + } } } } diff --git a/win/CS/HandBrakeWPF/Isolation/BackgroundServiceConnector.cs b/win/CS/HandBrakeWPF/Isolation/BackgroundServiceConnector.cs index 0d08f2dca..db175b45a 100644 --- a/win/CS/HandBrakeWPF/Isolation/BackgroundServiceConnector.cs +++ b/win/CS/HandBrakeWPF/Isolation/BackgroundServiceConnector.cs @@ -35,6 +35,11 @@ namespace HandBrakeWPF.Isolation /// private readonly IErrorService errorService; + /// + /// The user setting service. + /// + private readonly IUserSettingService userSettingService; + /// /// Gets or sets the pipe factory. /// DuplexChannelFactory is necessary for Callbacks. @@ -56,9 +61,13 @@ namespace HandBrakeWPF.Isolation /// /// The error service. /// - public BackgroundServiceConnector(IErrorService errorService) + /// + /// The user Setting Service. + /// + public BackgroundServiceConnector(IErrorService errorService, IUserSettingService userSettingService) { this.errorService = errorService; + this.userSettingService = userSettingService; } /// @@ -91,9 +100,19 @@ namespace HandBrakeWPF.Isolation /// public void Connect() { + string port = this.userSettingService.GetUserSetting(UserSettingConstants.ServerPort); + if (backgroundProcess == null) { - // backgroundProcess = Process.Start("HandBrake.Server.exe"); + ProcessStartInfo processStartInfo = new ProcessStartInfo( + "HandBrake.Server.exe", port) + { + UseShellExecute = false, + CreateNoWindow = false, + }; + + backgroundProcess = new Process { StartInfo = processStartInfo }; + backgroundProcess.Start(); } ThreadPool.QueueUserWorkItem(delegate @@ -103,7 +122,7 @@ namespace HandBrakeWPF.Isolation pipeFactory = new DuplexChannelFactory( new InstanceContext(this), new NetTcpBinding(), - new EndpointAddress("net.tcp://127.0.0.1:8000/IHbService")); + new EndpointAddress(string.Format("net.tcp://127.0.0.1:{0}/IHbService", port))); // Connect and Subscribe to the Server Service = pipeFactory.CreateChannel(); diff --git a/win/CS/HandBrakeWPF/Isolation/IsolatedEncodeService.cs b/win/CS/HandBrakeWPF/Isolation/IsolatedEncodeService.cs index 3c5363c28..504024b43 100644 --- a/win/CS/HandBrakeWPF/Isolation/IsolatedEncodeService.cs +++ b/win/CS/HandBrakeWPF/Isolation/IsolatedEncodeService.cs @@ -34,8 +34,11 @@ namespace HandBrakeWPF.Isolation /// /// The error Service. /// - public IsolatedEncodeService(IErrorService errorService) - : base(errorService) + /// + /// The user Setting Service. + /// + public IsolatedEncodeService(IErrorService errorService, IUserSettingService userSettingService) + : base(errorService, userSettingService) { try { diff --git a/win/CS/HandBrakeWPF/Isolation/IsolatedScanService.cs b/win/CS/HandBrakeWPF/Isolation/IsolatedScanService.cs index 608b00c21..b50f1b3ea 100644 --- a/win/CS/HandBrakeWPF/Isolation/IsolatedScanService.cs +++ b/win/CS/HandBrakeWPF/Isolation/IsolatedScanService.cs @@ -60,7 +60,11 @@ namespace HandBrakeWPF.Isolation /// /// The error Service. /// - public IsolatedScanService(IErrorService errorService) : base(errorService) + /// + /// The user Setting Service. + /// + public IsolatedScanService(IErrorService errorService, IUserSettingService userSettingService) + : base(errorService, userSettingService) { try { diff --git a/win/CS/HandBrakeWPF/UserSettingConstants.cs b/win/CS/HandBrakeWPF/UserSettingConstants.cs index 9397a3e6c..865847d87 100644 --- a/win/CS/HandBrakeWPF/UserSettingConstants.cs +++ b/win/CS/HandBrakeWPF/UserSettingConstants.cs @@ -161,6 +161,16 @@ namespace HandBrakeWPF /// public const string VLC_Path = "VLC_Path"; + /// + /// The enable process isolation. + /// + public const string EnableProcessIsolation = "EnableProcessIsolation"; + + /// + /// The server port. + /// + public const string ServerPort = "ServerPort"; + #endregion } } \ No newline at end of file diff --git a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs index 59d442393..a6ae77489 100644 --- a/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/MainViewModel.cs @@ -166,9 +166,6 @@ namespace HandBrakeWPF.ViewModels /// Initializes a new instance of the class. /// The viewmodel for HandBrakes main window. /// - /// - /// The window manager. - /// /// /// The User Setting Service /// @@ -193,7 +190,7 @@ namespace HandBrakeWPF.ViewModels /// /// The drive Detect Service. /// - public MainViewModel(IWindowManager windowManager, IUserSettingService userSettingService, IScan scanService, IEncode encodeService, IPresetService presetService, + public MainViewModel(IUserSettingService userSettingService, IScan scanService, IEncode encodeService, IPresetService presetService, IErrorService errorService, IShellViewModel shellViewModel, IUpdateService updateService, IDriveDetectService driveDetectService) { GeneralUtilities.SetInstanceId(); @@ -808,6 +805,11 @@ namespace HandBrakeWPF.ViewModels this.SourceMenu = this.GenerateSourceMenu(); this.driveDetectService.StartDetection(this.DriveTrayChanged); + + if (this.userSettingService.GetUserSetting(UserSettingConstants.EnableProcessIsolation)) + { + this.EnableIsolationServices(); + } } /// @@ -1181,7 +1183,7 @@ namespace HandBrakeWPF.ViewModels /// The test isolation services. /// Swaps out the implementation of IScan to the IsolatedScanService version. /// - public void TestIsolationServices() + public void EnableIsolationServices() { // Unhook the old services this.scanService.ScanStared -= this.ScanStared; @@ -1190,8 +1192,8 @@ namespace HandBrakeWPF.ViewModels this.queueProcessor.EncodeService.EncodeStatusChanged -= this.EncodeStatusChanged; // Replace the Services - this.scanService = new IsolatedScanService(this.errorService); - this.encodeService = new IsolatedEncodeService(this.errorService); + this.scanService = new IsolatedScanService(this.errorService, this.userSettingService); + this.encodeService = new IsolatedEncodeService(this.errorService, this.userSettingService); this.queueProcessor.SwapEncodeService(this.encodeService); // Add the new Event Hooks diff --git a/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs index 119cb9d10..963abdf60 100644 --- a/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs +++ b/win/CS/HandBrakeWPF/ViewModels/OptionsViewModel.cs @@ -22,6 +22,7 @@ namespace HandBrakeWPF.ViewModels using Caliburn.Micro; using HandBrake.ApplicationServices; + using HandBrake.ApplicationServices.Exceptions; using HandBrake.ApplicationServices.Services.Interfaces; using HandBrake.ApplicationServices.Utilities; @@ -338,6 +339,16 @@ namespace HandBrakeWPF.ViewModels /// private UpdateCheckInformation updateInfo; + /// + /// The enable process isolation. + /// + private bool enableProcessIsolation; + + /// + /// The server port. + /// + private int serverPort; + #endregion #region Constructors and Destructors @@ -345,9 +356,6 @@ namespace HandBrakeWPF.ViewModels /// /// Initializes a new instance of the class. /// - /// - /// The window manager. - /// /// /// The user Setting Service. /// @@ -357,7 +365,7 @@ namespace HandBrakeWPF.ViewModels /// /// The update Service. /// - public OptionsViewModel(IWindowManager windowManager, IUserSettingService userSettingService, IShellViewModel shellViewModel, IUpdateService updateService ) + public OptionsViewModel(IUserSettingService userSettingService, IShellViewModel shellViewModel, IUpdateService updateService ) { this.Title = "Options"; this.userSettingService = userSettingService; @@ -1313,6 +1321,38 @@ namespace HandBrakeWPF.ViewModels } } + /// + /// Gets or sets a value indicating whether ClearQueueOnEncodeCompleted. + /// + public bool EnableProcessIsolation + { + get + { + return this.enableProcessIsolation; + } + set + { + this.enableProcessIsolation = value; + this.NotifyOfPropertyChange(() => this.EnableProcessIsolation); + } + } + + /// + /// Gets or sets the server port. + /// + public int ServerPort + { + get + { + return this.serverPort; + } + set + { + this.serverPort = value; + this.NotifyOfPropertyChange(() => this.ServerPort); + } + } + #endregion #endregion @@ -1601,8 +1641,13 @@ namespace HandBrakeWPF.ViewModels // Min Title Length this.MinLength = this.userSettingService.GetUserSetting(ASUserSettingConstants.MinScanDuration); - // Use Experimental dvdnav + // Use dvdnav this.DisableLibdvdNav = userSettingService.GetUserSetting(ASUserSettingConstants.DisableLibDvdNav); + + int port; + int.TryParse(userSettingService.GetUserSetting(UserSettingConstants.ServerPort), out port); + this.ServerPort = port; + this.EnableProcessIsolation = userSettingService.GetUserSetting(UserSettingConstants.EnableProcessIsolation); } /// @@ -1817,6 +1862,8 @@ namespace HandBrakeWPF.ViewModels } userSettingService.SetUserSetting(ASUserSettingConstants.DisableLibDvdNav, this.DisableLibdvdNav); + userSettingService.SetUserSetting(UserSettingConstants.EnableProcessIsolation, this.EnableProcessIsolation); + userSettingService.SetUserSetting(UserSettingConstants.ServerPort, this.ServerPort.ToString()); } /// diff --git a/win/CS/HandBrakeWPF/Views/MainView.xaml b/win/CS/HandBrakeWPF/Views/MainView.xaml index c7f6c14c4..fdf204744 100644 --- a/win/CS/HandBrakeWPF/Views/MainView.xaml +++ b/win/CS/HandBrakeWPF/Views/MainView.xaml @@ -134,7 +134,7 @@ - + diff --git a/win/CS/HandBrakeWPF/Views/OptionsView.xaml b/win/CS/HandBrakeWPF/Views/OptionsView.xaml index f8a853476..7c3ead9cf 100644 --- a/win/CS/HandBrakeWPF/Views/OptionsView.xaml +++ b/win/CS/HandBrakeWPF/Views/OptionsView.xaml @@ -331,6 +331,24 @@ + + + + + + + + + + + + + + + + + + false + + + + ServerPort + + + 8000 + + + + + EnableProcessIsolation + + + false + + \ No newline at end of file -- cgit v1.2.3