JD2022-TU1/main/tools/apps/Monolith/Models/HostedProcessModel.cs

83 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UAF.WPF.Models;
using UAF.Application.Models;
using System.Windows;
using System.Diagnostics;
namespace Monolith.Models
{
public class HostedProcessModel : ToolViewModel
{
private string m_processFullPath;
private Process m_hostedProcess;
private List<object> m_registeredViews = new List<object>();
public HostedProcessModel(string processFullPath, string windowName)
: base(windowName)
{
m_processFullPath = processFullPath;
ContentId = ToolContentId;
}
public override string ToolContentId { get { return "HostedProcessTool/" + Title; } }
public override bool InitToolModel()
{
ProcessStartInfo psi = new ProcessStartInfo(m_processFullPath);
psi.WindowStyle = ProcessWindowStyle.Minimized;
m_hostedProcess = Process.Start(psi);
m_hostedProcess.WaitForInputIdle();
return base.InitToolModel();
}
public override void DestroyToolModel()
{
// FIXME : Fix resource leak before.
//if (m_registeredViews.Count > 0)
// throw new InvalidOperationException("Destruction model was requested, but the hosted process is still under use. ");
m_hostedProcess.CloseMainWindow();
m_hostedProcess.WaitForExit(5000);
if (m_hostedProcess.HasExited == false)
{
m_hostedProcess.Kill();
}
m_hostedProcess.Close();
m_hostedProcess.Dispose();
m_hostedProcess = null;
base.DestroyToolModel();
}
public string ProcessFullPath
{
get { return m_processFullPath; }
set
{
if (m_processFullPath != value)
{
m_processFullPath = value;
RaisePropertyChanged("ProcessFullPath");
}
}
}
public Process RequestProcessHandle(object requester)
{
m_registeredViews.Add(requester);
return m_hostedProcess;
}
public void DisposeProcessHandle(object requester)
{
m_registeredViews.Remove(requester);
}
}
}