#region License // Copyright (c) 2010, Jasper Yeh. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of ClearCanvas Inc. nor the names of its contributors // may be used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, // OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE // GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY // OF SUCH DAMAGE. #endregion using System; using System.Diagnostics; using System.IO; using ClearCanvas.Common; namespace Nullstack.ClearCanvasEx.DevTools.Common { public class CCProcess { private const string _serviceProcessName = "ClearCanvas.Server.ShredHostService"; private const string _desktopProcessName = "ClearCanvas.Desktop.Executable"; private readonly Process _process; private CCProcess(Process process) { Platform.CheckForNullReference(process, "process"); Platform.CheckFalse(process.HasExited, "Process cannot have exited already."); _process = process; } public string Name { get { return _process.ProcessName; } } /// /// Gets the filename of the process' entry module. /// public string Filename { get { return _process.MainModule.FileName; } } /// /// Gets the process ID. /// public int ProcessId { get { return _process.Id; } } /// /// Gets the working directory of the process. /// public string WorkingDirectory { get { if (_process.HasExited) return string.Empty; try { return Path.GetDirectoryName(_process.MainModule.FileName); } catch (Exception) { return string.Empty; } } } public override string ToString() { return _process.ProcessName; } public static implicit operator Process(CCProcess process) { return process._process; } #region Static Helpers public static CCProcess GetDesktopProcess() { return FindProcess(_desktopProcessName); } public static CCProcess GetServiceProcess() { return FindProcess(_serviceProcessName); } private static CCProcess FindProcess(string processName) { var pathCurDir = new CCPath(Process.GetCurrentProcess().MainModule.FileName.ToLowerInvariant().Replace(Path.DirectorySeparatorChar, '/')); var score = 0; Process targetProcess = null; foreach (var process in Process.GetProcessesByName(processName)) { try { var processDir = Path.GetDirectoryName(process.MainModule.FileName); if (string.IsNullOrEmpty(processDir)) continue; var pathProcessDir = new CCPath(processDir.ToLowerInvariant().Replace(Path.DirectorySeparatorChar, '/')); var scoreProcessDir = pathCurDir.GetCommonPath(pathProcessDir).Segments.Count; if (scoreProcessDir > score) { score = scoreProcessDir; targetProcess = process; } } catch (Exception) { // shrug } } return targetProcess != null ? new CCProcess(targetProcess) : null; } #endregion } }