// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
using System;
using System.Diagnostics;
using System.Text.Json;
using autoShell.Handlers.Generated;
using autoShell.Logging;
using autoShell.Services;
namespace autoShell.Handlers;
///
/// Handles application lifecycle commands: CloseProgram, LaunchProgram, and ListAppNames.
///
internal class AppActionHandler : ActionHandlerBase
{
private readonly IAppRegistry _appRegistry;
private readonly IProcessService _processService;
private readonly IWindowService _window;
private readonly ILogger _logger;
public AppActionHandler(IAppRegistry appRegistry, IProcessService processService, IWindowService window, ILogger logger)
{
_appRegistry = appRegistry;
_processService = processService;
_window = window;
_logger = logger;
AddAction("CloseProgram", HandleCloseProgram);
AddAction("LaunchProgram", HandleLaunchProgram);
AddAction("ListAppNames", HandleListAppNames);
}
private ActionResult HandleCloseProgram(CloseProgramParams p)
{
string name = p.Name;
CloseApplication(name);
return ActionResult.Ok($"Closed {name}");
}
private ActionResult HandleLaunchProgram(LaunchProgramParams p)
{
string name = p.Name;
OpenApplication(name);
return ActionResult.Ok($"Launched {name}");
}
private ActionResult HandleListAppNames(JsonElement parameters)
{
var appNames = _appRegistry.GetAllAppNames();
return ActionResult.Ok("Listed app names", JsonSerializer.SerializeToElement(appNames));
}
private void CloseApplication(string friendlyName)
{
string processName = _appRegistry.ResolveProcessName(friendlyName);
Process[] processes = _processService.GetProcessesByName(processName);
if (processes.Length != 0)
{
_logger.Debug("Closing " + friendlyName);
foreach (Process p in processes)
{
if (p.MainWindowHandle != IntPtr.Zero)
{
p.CloseMainWindow();
}
}
}
}
private void OpenApplication(string friendlyName)
{
string processName = _appRegistry.ResolveProcessName(friendlyName);
Process[] processes = _processService.GetProcessesByName(processName);
if (processes.Length == 0)
{
_logger.Debug("Starting " + friendlyName);
string path = _appRegistry.GetExecutablePath(friendlyName);
if (path != null)
{
var psi = new ProcessStartInfo
{
FileName = path,
UseShellExecute = true
};
string workDirEnvVar = _appRegistry.GetWorkingDirectoryEnvVar(friendlyName);
if (workDirEnvVar != null)
{
psi.WorkingDirectory = Environment.ExpandEnvironmentVariables("%" + workDirEnvVar + "%");
}
string arguments = _appRegistry.GetArguments(friendlyName);
if (arguments != null)
{
psi.Arguments = arguments;
}
try
{
_processService.Start(psi);
}
catch (System.ComponentModel.Win32Exception)
{
psi.FileName = friendlyName;
_processService.Start(psi);
}
}
else
{
string appModelUserId = _appRegistry.GetAppUserModelId(friendlyName);
if (appModelUserId != null)
{
try
{
_processService.Start(new ProcessStartInfo("explorer.exe", @" shell:appsFolder\" + appModelUserId));
}
catch (Exception ex) { _logger.Debug($"Failed to launch UWP app: {ex.Message}"); }
}
}
}
else
{
_logger.Debug("Raising " + friendlyName);
string processName2 = _appRegistry.ResolveProcessName(friendlyName);
string path2 = _appRegistry.GetExecutablePath(friendlyName);
_window.RaiseWindow(processName2, path2);
}
}
}