using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using Artemis.Core.Services; using Ninject; namespace Artemis.Core.Modules { /// /// Evaluates to true or false by checking if the specified process is running /// public class ProcessActivationRequirement : IModuleActivationRequirement { private readonly IProcessMonitorService _processMonitorService; /// /// Creates a new instance of the class /// /// The name of the process that must run /// The location of where the process must be running from (optional) public ProcessActivationRequirement(string? processName, string? location = null) { if (string.IsNullOrWhiteSpace(processName) && string.IsNullOrWhiteSpace(location)) throw new ArgumentNullException($"Atleast one {nameof(processName)} and {nameof(location)} must not be null"); // Let's not make a habit out of this :P if (CoreService.Kernel == null) throw new ArtemisCoreException("Cannot create a ProcessActivationRequirement before initializing the Core"); _processMonitorService = CoreService.Kernel.Get(); ProcessName = processName; Location = location; } /// /// The name of the process that must run /// public string? ProcessName { get; set; } /// /// The location of where the process must be running from /// public string? Location { get; set; } /// public bool Evaluate() { if (ProcessName == null && Location == null) return false; IEnumerable processes = _processMonitorService.GetRunningProcesses(); if (ProcessName != null) processes = processes.Where(p => string.Equals(p.ProcessName, ProcessName, StringComparison.InvariantCultureIgnoreCase)); if (Location != null) processes = processes.Where(p => string.Equals(Path.GetDirectoryName(p.GetProcessFilename()), Location, StringComparison.InvariantCultureIgnoreCase)); return processes.Any(); } /// public string GetUserFriendlyDescription() { string description = $"Requirement met when \"{ProcessName}.exe\" is running"; if (Location != null) description += $" from \"{Location}\""; return description; } } }