/*
* GNU AFFERO GENERAL PUBLIC LICENSE
* Version 3, 19 November 2007
* Copyright (C) 2007 Free Software Foundation, Inc.
* Everyone is permitted to copy and distribute verbatim copies
* of this license document, but changing it is not allowed.
*/
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using UVtools.Core.FileFormats;
namespace UVtools.Core.Objects;
public class MappedProcess : BindableBase
{
#region Constants
public const string DefaultArgument = "\"{0}\"";
#endregion
#region Members
private bool _isEnabled = true;
private string _applicationPath = null!;
private string? _name;
private string _arguments = DefaultArgument;
private string? _compatibleExtensions;
private bool _waitForExit;
#endregion
#region Properties
///
/// Gets or sets if this device is enabled
///
public bool IsEnabled
{
get => _isEnabled;
set => RaiseAndSetIfChanged(ref _isEnabled, value);
}
///
/// Gets or sets the full path for the application
///
public string ApplicationPath
{
get => _applicationPath;
set => RaiseAndSetIfChanged(ref _applicationPath, value);
}
///
/// Gets or sets the path name alias
///
public string? Name
{
get => _name;
set => RaiseAndSetIfChanged(ref _name, value);
}
///
/// Gets or sets the arguments for the application
///
public string Arguments
{
get => _arguments;
set => RaiseAndSetIfChanged(ref _arguments, value);
}
///
/// Gets or sets the compatible extensions with this device.
/// Empty or null to be compatible with everything
///
public string? CompatibleExtensions
{
get => _compatibleExtensions;
set => RaiseAndSetIfChanged(ref _compatibleExtensions, value);
}
public bool WaitForExit
{
get => _waitForExit;
set => RaiseAndSetIfChanged(ref _waitForExit, value);
}
#endregion
#region Constructors
public MappedProcess() { }
public MappedProcess(bool isEnabled, string applicationPath, string? name = null, string arguments = DefaultArgument)
{
_isEnabled = isEnabled;
_applicationPath = applicationPath;
if (string.IsNullOrWhiteSpace(name))
{
name = Path.GetFileNameWithoutExtension(applicationPath);
}
_name = name;
if (string.IsNullOrWhiteSpace(arguments))
{
arguments = DefaultArgument;
}
_arguments = arguments;
}
public MappedProcess(string applicationPath, string? name = null, string arguments = DefaultArgument) : this(true, applicationPath, name, arguments)
{ }
#endregion
#region Methods
public bool IsValid()
{
return File.Exists(_applicationPath);
}
public async Task StartProcess(FileFormat slicerFile, CancellationToken cancellationToken = default)
{
await StartProcess(slicerFile.FileFullPath!, cancellationToken);
}
public async Task StartProcess(string slicerFile, CancellationToken cancellationToken = default)
{
var arguments = string.IsNullOrWhiteSpace(_arguments) ? $"\"{slicerFile}\"" : string.Format(_arguments, slicerFile);
using var process = Process.Start(_applicationPath, arguments);
if (process is null) return;
if (_waitForExit)
{
await process.WaitForExitAsync(cancellationToken);
}
}
public override string ToString()
{
return $"{_applicationPath} {Arguments}";
}
protected bool Equals(MappedProcess other)
{
return _applicationPath == other._applicationPath && _name == other._name && _arguments == other._arguments && _compatibleExtensions == other._compatibleExtensions;
}
public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((MappedProcess)obj);
}
public override int GetHashCode()
{
return HashCode.Combine(_applicationPath, _name, _arguments, _compatibleExtensions);
}
public MappedProcess Clone()
{
return (MemberwiseClone() as MappedProcess)!;
}
#endregion
}