#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
}
}