// --------------------------------------------------------------------------------------------------------------------
//
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
//
//
// Defines the WhenDoneService type.
//
// --------------------------------------------------------------------------------------------------------------------
namespace HandBrakeWPF.Services
{
using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
using System.Windows.Media;
using Caliburn.Micro;
using HandBrake.Interop.Utilities;
using HandBrakeWPF.EventArgs;
using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.Services.Queue.Interfaces;
using HandBrakeWPF.Utilities;
using HandBrakeWPF.ViewModels.Interfaces;
using EncodeCompletedEventArgs = HandBrakeWPF.Services.Encode.EventArgs.EncodeCompletedEventArgs;
using Execute = Caliburn.Micro.Execute;
///
/// The when done service.
///
public class PrePostActionService : IPrePostActionService
{
///
/// The queue processor.
///
private readonly IQueueProcessor queueProcessor;
///
/// The user setting service.
///
private readonly IUserSettingService userSettingService;
///
/// The window manager.
///
private readonly IWindowManager windowManager;
///
/// Initializes a new instance of the class.
///
///
/// The queue processor.
///
///
/// The user Setting Service.
///
///
/// The window Manager.
///
public PrePostActionService(IQueueProcessor queueProcessor, IUserSettingService userSettingService, IWindowManager windowManager)
{
this.queueProcessor = queueProcessor;
this.userSettingService = userSettingService;
this.windowManager = windowManager;
this.queueProcessor.QueueCompleted += QueueProcessorQueueCompleted;
this.queueProcessor.EncodeService.EncodeCompleted += EncodeService_EncodeCompleted;
this.queueProcessor.EncodeService.EncodeStarted += EncodeService_EncodeStarted;
}
///
/// The encode service_ encode started.
///
///
/// The sender.
///
///
/// The e.
///
private void EncodeService_EncodeStarted(object sender, EventArgs e)
{
if (this.userSettingService.GetUserSetting(UserSettingConstants.PreventSleep))
{
Win32.PreventSleep();
}
}
///
/// The encode service_ encode completed.
///
///
/// The sender.
///
///
/// The EncodeCompletedEventArgs.
///
private void EncodeService_EncodeCompleted(object sender, EncodeCompletedEventArgs e)
{
// Send the file to the users requested application
if (e.Successful)
{
this.SendToApplication(e.FileName);
}
if (this.userSettingService.GetUserSetting(UserSettingConstants.PlaySoundWhenDone))
{
this.PlayWhenDoneSound();
}
// Allow the system to sleep again.
Execute.OnUIThread(() =>
{
if (this.userSettingService.GetUserSetting(UserSettingConstants.PreventSleep))
{
Win32.AllowSleep();
}
});
}
///
/// The queue processor queue completed event handler.
///
///
/// The sender.
///
///
/// The e.
///
private void QueueProcessorQueueCompleted(object sender, QueueCompletedEventArgs e)
{
if (e.WasManuallyStopped)
{
return;
}
if (this.userSettingService.GetUserSetting(UserSettingConstants.PlaySoundWhenQueueDone))
{
this.PlayWhenDoneSound();
}
if (this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction) == "Do nothing")
{
return;
}
// Give the user the ability to cancel the shutdown. Default 60 second timer.
ICountdownAlertViewModel titleSpecificView = IoC.Get();
Execute.OnUIThread(
() =>
{
titleSpecificView.SetAction(this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction));
this.windowManager.ShowDialog(titleSpecificView);
});
if (!titleSpecificView.IsCancelled)
{
// Do something whent he encode ends.
switch (this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction))
{
case "Shutdown":
Process.Start("Shutdown", "-s -t 60");
break;
case "Log off":
Win32.ExitWindowsEx(0, 0);
break;
case "Suspend":
Application.SetSuspendState(PowerState.Suspend, true, true);
break;
case "Hibernate":
Application.SetSuspendState(PowerState.Hibernate, true, true);
break;
case "Lock System":
Win32.LockWorkStation();
break;
case "Quit HandBrake":
Execute.OnUIThread(() => System.Windows.Application.Current.Shutdown());
break;
}
}
}
///
/// Send a file to a 3rd party application after encoding has completed.
///
///
/// The file path
///
private void SendToApplication(string file)
{
if (this.userSettingService.GetUserSetting(UserSettingConstants.SendFile) &&
!string.IsNullOrEmpty(this.userSettingService.GetUserSetting(UserSettingConstants.SendFileTo)))
{
string args = string.Format(
"{0} \"{1}\"",
this.userSettingService.GetUserSetting(UserSettingConstants.SendFileToArgs),
file);
var vlc =
new ProcessStartInfo(
this.userSettingService.GetUserSetting(UserSettingConstants.SendFileTo), args);
Process.Start(vlc);
}
}
private void PlayWhenDoneSound()
{
string filePath = this.userSettingService.GetUserSetting(UserSettingConstants.WhenDoneAudioFile);
if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath))
{
var uri = new Uri(filePath, UriKind.RelativeOrAbsolute);
var player = new MediaPlayer();
player.Open(uri);
player.Play();
}
}
}
}