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 m_registeredViews = new List(); 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); } } }