// --------------------------------------------------------------------------------------------------------------------
//
// 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.Instance;
using HandBrakeWPF.Properties;
using HandBrakeWPF.Services.Interfaces;
using HandBrakeWPF.Services.Logging;
using HandBrakeWPF.Services.Logging.Model;
using HandBrakeWPF.Services.Queue.Interfaces;
using HandBrakeWPF.Services.Scan.Interfaces;
using HandBrakeWPF.Utilities;
using HandBrakeWPF.ViewModels.Interfaces;
using EncodeCompletedEventArgs = HandBrakeWPF.Services.Encode.EventArgs.EncodeCompletedEventArgs;
using ILog = HandBrakeWPF.Services.Logging.Interfaces.ILog;
///
/// The when done service.
///
public class PrePostActionService : IPrePostActionService
{
private readonly ILog log = LogService.GetLogger();
private readonly IQueueService queueProcessor;
private readonly IUserSettingService userSettingService;
private readonly IWindowManager windowManager;
private readonly IScan scanService;
///
/// Initializes a new instance of the class.
///
///
/// The queue processor.
///
///
/// The user Setting Service.
///
///
/// The window Manager.
///
public PrePostActionService(IQueueService queueProcessor, IUserSettingService userSettingService, IWindowManager windowManager, IScan scanService)
{
this.queueProcessor = queueProcessor;
this.userSettingService = userSettingService;
this.windowManager = windowManager;
this.scanService = scanService;
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.
bool isCancelled = false;
if (!this.userSettingService.GetUserSetting(UserSettingConstants.WhenDonePerformActionImmediately))
{
ICountdownAlertViewModel titleSpecificView = IoC.Get();
Execute.OnUIThread(
() =>
{
titleSpecificView.SetAction(this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction));
this.windowManager.ShowDialog(titleSpecificView);
isCancelled = titleSpecificView.IsCancelled;
});
}
if (!isCancelled)
{
this.ServiceLogMessage(string.Format("Performing 'When Done' Action: {0}", this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction)));
// Do something when the encode ends.
switch (this.userSettingService.GetUserSetting(UserSettingConstants.WhenCompleteAction))
{
case "Shutdown":
case "Herunterfahren":
ProcessStartInfo shutdown = new ProcessStartInfo("Shutdown", "-s -t 60");
shutdown.UseShellExecute = false;
Process.Start(shutdown);
Execute.OnUIThread(() => System.Windows.Application.Current.Shutdown());
break;
case "Log off":
case "Ausloggen":
this.scanService.Dispose();
Win32.ExitWindowsEx(0, 0);
break;
case "Suspend":
Application.SetSuspendState(PowerState.Suspend, true, true);
break;
case "Hibernate":
case "Ruhezustand":
Application.SetSuspendState(PowerState.Hibernate, true, true);
break;
case "Lock System":
case "System sperren":
Win32.LockWorkStation();
break;
case "Quit HandBrake":
case "HandBrake beenden":
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 destination =
new ProcessStartInfo(
this.userSettingService.GetUserSetting(UserSettingConstants.SendFileTo), args);
this.ServiceLogMessage(string.Format("Sending output file to: {0}, with arguments: {1} ", destination, args));
Process.Start(destination);
}
}
private void PlayWhenDoneSound()
{
string filePath = this.userSettingService.GetUserSetting(UserSettingConstants.WhenDoneAudioFile);
if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath))
{
this.ServiceLogMessage("Playing Sound: " + filePath);
var uri = new Uri(filePath, UriKind.RelativeOrAbsolute);
var player = new MediaPlayer();
player.Open(uri);
player.Play();
}
else
{
this.ServiceLogMessage("Unable to play sound. Reason: File not found!");
}
}
protected void ServiceLogMessage(string message)
{
this.log.LogMessage(string.Format("# {1}{0}", Environment.NewLine, message), LogMessageType.ScanOrEncode, LogLevel.Info);
}
}
}