Index: visual_studio/NativeClientVSAddIn/NativeClientVSAddIn/Utility.cs |
diff --git a/visual_studio/NativeClientVSAddIn/NativeClientVSAddIn/Utility.cs b/visual_studio/NativeClientVSAddIn/NativeClientVSAddIn/Utility.cs |
index 69eec0fb8072bf2c60dcc1220dd6e3dc836062ea..94dff83c2641588b12fba54347c261b7476bfd48 100644 |
--- a/visual_studio/NativeClientVSAddIn/NativeClientVSAddIn/Utility.cs |
+++ b/visual_studio/NativeClientVSAddIn/NativeClientVSAddIn/Utility.cs |
@@ -1,220 +1,220 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-namespace NativeClientVSAddIn |
-{ |
- using System; |
- using System.Collections.Generic; |
- |
- using EnvDTE; |
- using EnvDTE80; |
- using Microsoft.VisualStudio.VCProjectEngine; |
- |
- /// <summary> |
- /// Contains helper functions for this add-in. |
- /// </summary> |
- public static class Utility |
- { |
- /// <summary> |
- /// Tells us if the given project is a Visual C/C++ project. |
- /// </summary> |
- /// <param name="proj">Project to check.</param> |
- /// <returns>True if project is a Visual C/C++ project.</returns> |
- public static bool IsVisualCProject(Project proj) |
- { |
- foreach (Property prop in proj.Properties) |
- { |
- if (prop.Name == "Kind") |
- { |
- string projectType = prop.Value as string; |
- return projectType == "VCProject"; |
- } |
- } |
- |
- return false; |
- } |
- |
- /// <summary> |
- /// Given a generic project, checks that it is a Visual C project, and |
- /// extracts the active VCConfiguration object. |
- /// </summary> |
- /// <param name="proj">Generic project object.</param> |
- /// <returns>The active configuration, or null if failure.</returns> |
- public static VCConfiguration GetActiveVCConfiguration(Project proj) |
- { |
- if (!IsVisualCProject(proj)) |
- { |
- return null; |
- } |
- |
- VCProject vcproj = (VCProject)proj.Object; |
- IVCCollection configs = vcproj.Configurations; |
- Configuration active = proj.ConfigurationManager.ActiveConfiguration; |
- |
- foreach (VCConfiguration config in configs) |
- { |
- if (config.ConfigurationName == active.ConfigurationName && |
- config.Platform.Name == active.PlatformName) |
- { |
- return config; |
- } |
- } |
- |
- return null; |
- } |
- |
- /// <summary> |
- /// Will print a message to the web server output pane. |
- /// </summary> |
- /// <param name="dte">The main visual studio interface.</param> |
- /// <param name="message">Message to print to the output pane.</param> |
- public static void WebServerWriteLine(DTE2 dte, string message) |
- { |
- try |
- { |
- OutputWindowPane pane = dte.ToolWindows.OutputWindow.OutputWindowPanes.Item( |
- Strings.WebServerOutputWindowTitle); |
- pane.OutputString(message + "\n"); |
- } |
- catch (ArgumentException) |
- { |
- // This exception is expected if the window pane hasn't been created yet. |
- } |
- } |
- |
- /// <summary> |
- /// Returns all VCConfigurations from the open solution that have the specified platform name. |
- /// Note only VC++ projects are checked. |
- /// </summary> |
- /// <param name="dte">Visual studio main interface.</param> |
- /// <param name="platformName">Name of the platform to get.</param> |
- /// <returns>List of all matching VCConfigurations.</returns> |
- public static List<VCConfiguration> GetPlatformVCConfigurations(DTE2 dte, string platformName) |
- { |
- var platformConfigs = new List<VCConfiguration>(); |
- foreach (Project proj in dte.Solution.Projects) |
- { |
- if (Utility.IsVisualCProject(proj)) |
- { |
- VCProject vcproj = (VCProject)proj.Object; |
- IVCCollection configs = vcproj.Configurations; |
- |
- foreach (VCConfiguration config in configs) |
- { |
- if (platformName.Equals(config.Platform.Name)) |
- { |
- platformConfigs.Add(config); |
- } |
- } |
- } |
- } |
- |
- return platformConfigs; |
- } |
- |
- /// <summary> |
- /// Extends the string class to allow checking if a string contains another string |
- /// allowing a comparison type (such as case-insensitivity). |
- /// </summary> |
- /// <param name="source">Base string to search.</param> |
- /// <param name="toCheck">String to check if contained within base string.</param> |
- /// <param name="comparison">Comparison type.</param> |
- /// <returns>True if toCheck is contained in source.</returns> |
- public static bool Contains(this string source, string toCheck, StringComparison comparison) |
- { |
- return source.IndexOf(toCheck, comparison) != -1; |
- } |
- |
- /// <summary> |
- /// This checks if the first argument is a descendant of the second, where |
- /// both arguments are process IDs of two processes. |
- /// </summary> |
- /// <param name="processSearcher">Process searcher object.</param> |
- /// <param name="descendant">Process ID of the descendant.</param> |
- /// <param name="ancestor">Process ID of ancestor.</param> |
- /// <returns>True if descendant is a descendant of ancestor.</returns> |
- public static bool IsDescendantOfProcess( |
- ProcessSearcher processSearcher, |
- uint descendant, |
- uint ancestor) |
- { |
- return IsDescendantOfProcessHelper( |
- processSearcher, |
- descendant, |
- ancestor, |
- DateTime.UtcNow); |
- } |
- |
- /// <summary> |
- /// Helper function to properly dispose of a process object and ensure it is dead. The given |
- /// reference is set to null afterwards. |
- /// </summary> |
- /// <param name="process">Process to kill. Reference is set to null afterwards.</param> |
- public static void EnsureProcessKill(ref System.Diagnostics.Process process) |
- { |
- if (process == null) |
- { |
- return; |
- } |
- |
- try |
- { |
- process.Kill(); |
- } |
- catch (System.InvalidOperationException) |
- { |
- // This happens if the process has already exited. |
- } |
- |
- process.Dispose(); |
- process = null; |
- } |
- |
- /// <summary> |
- /// Helper function for IsDescendantOfProcessHelper(). |
- /// This function prevents an edge case where a process has a parent process ID |
- /// that refers to a descendant of itself. This can occur when the parent of a process |
- /// is destroyed and the parent's pid is recycled and reused on a descendant. The |
- /// parent process ID value is never updated when the parent is destroyed. The solution |
- /// is to make sure that parents are created before children, otherwise it is a cycle. |
- /// </summary> |
- /// <param name="processSearcher">Process searcher object.</param> |
- /// <param name="descendant">Process ID of the descendant.</param> |
- /// <param name="anscestor">Process ID of the ancestor.</param> |
- /// <param name="previousCreationTime">Creation time of the previous call's descendant.</param> |
- /// <returns>True if descendant is a descendant of ancestor.</returns> |
- private static bool IsDescendantOfProcessHelper( |
- ProcessSearcher processSearcher, |
- uint descendant, |
- uint anscestor, |
- DateTime previousCreationTime) |
- { |
- List<ProcessInfo> results = processSearcher.GetResultsByID(descendant); |
- foreach (ProcessInfo proc in results) |
- { |
- // Ensure this parent relationship is valid. |
- if (proc.CreationDate <= previousCreationTime) |
- { |
- if (descendant == anscestor) |
- { |
- return true; |
- } |
- else if (descendant == proc.ParentID) |
- { |
- // If process is its own parent then we have a cycle, return false. |
- return false; |
- } |
- |
- return IsDescendantOfProcessHelper( |
- processSearcher, |
- proc.ParentID, |
- anscestor, |
- proc.CreationDate); |
- } |
- } |
- |
- return false; |
- } |
- } |
-} |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+namespace NativeClientVSAddIn |
+{ |
+ using System; |
+ using System.Collections.Generic; |
+ |
+ using EnvDTE; |
+ using EnvDTE80; |
+ using Microsoft.VisualStudio.VCProjectEngine; |
+ |
+ /// <summary> |
+ /// Contains helper functions for this add-in. |
+ /// </summary> |
+ public static class Utility |
+ { |
+ /// <summary> |
+ /// Tells us if the given project is a Visual C/C++ project. |
+ /// </summary> |
+ /// <param name="proj">Project to check.</param> |
+ /// <returns>True if project is a Visual C/C++ project.</returns> |
+ public static bool IsVisualCProject(Project proj) |
+ { |
+ foreach (Property prop in proj.Properties) |
+ { |
+ if (prop.Name == "Kind") |
+ { |
+ string projectType = prop.Value as string; |
+ return projectType == "VCProject"; |
+ } |
+ } |
+ |
+ return false; |
+ } |
+ |
+ /// <summary> |
+ /// Given a generic project, checks that it is a Visual C project, and |
+ /// extracts the active VCConfiguration object. |
+ /// </summary> |
+ /// <param name="proj">Generic project object.</param> |
+ /// <returns>The active configuration, or null if failure.</returns> |
+ public static VCConfiguration GetActiveVCConfiguration(Project proj) |
+ { |
+ if (!IsVisualCProject(proj)) |
+ { |
+ return null; |
+ } |
+ |
+ VCProject vcproj = (VCProject)proj.Object; |
+ IVCCollection configs = vcproj.Configurations; |
+ Configuration active = proj.ConfigurationManager.ActiveConfiguration; |
+ |
+ foreach (VCConfiguration config in configs) |
+ { |
+ if (config.ConfigurationName == active.ConfigurationName && |
+ config.Platform.Name == active.PlatformName) |
+ { |
+ return config; |
+ } |
+ } |
+ |
+ return null; |
+ } |
+ |
+ /// <summary> |
+ /// Will print a message to the web server output pane. |
+ /// </summary> |
+ /// <param name="dte">The main visual studio interface.</param> |
+ /// <param name="message">Message to print to the output pane.</param> |
+ public static void WebServerWriteLine(DTE2 dte, string message) |
+ { |
+ try |
+ { |
+ OutputWindowPane pane = dte.ToolWindows.OutputWindow.OutputWindowPanes.Item( |
+ Strings.WebServerOutputWindowTitle); |
+ pane.OutputString(message + "\n"); |
+ } |
+ catch (ArgumentException) |
+ { |
+ // This exception is expected if the window pane hasn't been created yet. |
+ } |
+ } |
+ |
+ /// <summary> |
+ /// Returns all VCConfigurations from the open solution that have the specified platform name. |
+ /// Note only VC++ projects are checked. |
+ /// </summary> |
+ /// <param name="dte">Visual studio main interface.</param> |
+ /// <param name="platformName">Name of the platform to get.</param> |
+ /// <returns>List of all matching VCConfigurations.</returns> |
+ public static List<VCConfiguration> GetPlatformVCConfigurations(DTE2 dte, string platformName) |
+ { |
+ var platformConfigs = new List<VCConfiguration>(); |
+ foreach (Project proj in dte.Solution.Projects) |
+ { |
+ if (Utility.IsVisualCProject(proj)) |
+ { |
+ VCProject vcproj = (VCProject)proj.Object; |
+ IVCCollection configs = vcproj.Configurations; |
+ |
+ foreach (VCConfiguration config in configs) |
+ { |
+ if (platformName.Equals(config.Platform.Name)) |
+ { |
+ platformConfigs.Add(config); |
+ } |
+ } |
+ } |
+ } |
+ |
+ return platformConfigs; |
+ } |
+ |
+ /// <summary> |
+ /// Extends the string class to allow checking if a string contains another string |
+ /// allowing a comparison type (such as case-insensitivity). |
+ /// </summary> |
+ /// <param name="source">Base string to search.</param> |
+ /// <param name="toCheck">String to check if contained within base string.</param> |
+ /// <param name="comparison">Comparison type.</param> |
+ /// <returns>True if toCheck is contained in source.</returns> |
+ public static bool Contains(this string source, string toCheck, StringComparison comparison) |
+ { |
+ return source.IndexOf(toCheck, comparison) != -1; |
+ } |
+ |
+ /// <summary> |
+ /// This checks if the first argument is a descendant of the second, where |
+ /// both arguments are process IDs of two processes. |
+ /// </summary> |
+ /// <param name="processSearcher">Process searcher object.</param> |
+ /// <param name="descendant">Process ID of the descendant.</param> |
+ /// <param name="ancestor">Process ID of ancestor.</param> |
+ /// <returns>True if descendant is a descendant of ancestor.</returns> |
+ public static bool IsDescendantOfProcess( |
+ ProcessSearcher processSearcher, |
+ uint descendant, |
+ uint ancestor) |
+ { |
+ return IsDescendantOfProcessHelper( |
+ processSearcher, |
+ descendant, |
+ ancestor, |
+ DateTime.UtcNow); |
+ } |
+ |
+ /// <summary> |
+ /// Helper function to properly dispose of a process object and ensure it is dead. The given |
+ /// reference is set to null afterwards. |
+ /// </summary> |
+ /// <param name="process">Process to kill. Reference is set to null afterwards.</param> |
+ public static void EnsureProcessKill(ref System.Diagnostics.Process process) |
+ { |
+ if (process == null) |
+ { |
+ return; |
+ } |
+ |
+ try |
+ { |
+ process.Kill(); |
+ } |
+ catch (System.InvalidOperationException) |
+ { |
+ // This happens if the process has already exited. |
+ } |
+ |
+ process.Dispose(); |
+ process = null; |
+ } |
+ |
+ /// <summary> |
+ /// Helper function for IsDescendantOfProcessHelper(). |
+ /// This function prevents an edge case where a process has a parent process ID |
+ /// that refers to a descendant of itself. This can occur when the parent of a process |
+ /// is destroyed and the parent's pid is recycled and reused on a descendant. The |
+ /// parent process ID value is never updated when the parent is destroyed. The solution |
+ /// is to make sure that parents are created before children, otherwise it is a cycle. |
+ /// </summary> |
+ /// <param name="processSearcher">Process searcher object.</param> |
+ /// <param name="descendant">Process ID of the descendant.</param> |
+ /// <param name="anscestor">Process ID of the ancestor.</param> |
+ /// <param name="previousCreationTime">Creation time of the previous call's descendant.</param> |
+ /// <returns>True if descendant is a descendant of ancestor.</returns> |
+ private static bool IsDescendantOfProcessHelper( |
+ ProcessSearcher processSearcher, |
+ uint descendant, |
+ uint anscestor, |
+ DateTime previousCreationTime) |
+ { |
+ List<ProcessInfo> results = processSearcher.GetResultsByID(descendant); |
+ foreach (ProcessInfo proc in results) |
+ { |
+ // Ensure this parent relationship is valid. |
+ if (proc.CreationDate <= previousCreationTime) |
+ { |
+ if (descendant == anscestor) |
+ { |
+ return true; |
+ } |
+ else if (descendant == proc.ParentID) |
+ { |
+ // If process is its own parent then we have a cycle, return false. |
+ return false; |
+ } |
+ |
+ return IsDescendantOfProcessHelper( |
+ processSearcher, |
+ proc.ParentID, |
+ anscestor, |
+ proc.CreationDate); |
+ } |
+ } |
+ |
+ return false; |
+ } |
+ } |
+} |