Index: experimental/visual_studio_plugin/src/NaClVsx.Package/ProjectSupport/NaClProjectConfig.cs |
diff --git a/experimental/visual_studio_plugin/src/NaClVsx.Package/ProjectSupport/NaClProjectConfig.cs b/experimental/visual_studio_plugin/src/NaClVsx.Package/ProjectSupport/NaClProjectConfig.cs |
deleted file mode 100644 |
index d3d7c63f0345609d47ff9287b25b84fef1669a7b..0000000000000000000000000000000000000000 |
--- a/experimental/visual_studio_plugin/src/NaClVsx.Package/ProjectSupport/NaClProjectConfig.cs |
+++ /dev/null |
@@ -1,253 +0,0 @@ |
-#region |
- |
-using System; |
-using System.Collections; |
-using System.Diagnostics; |
-using System.IO; |
-using System.Net.Sockets; |
-using System.Windows.Forms; |
-using Google.NaClVsx.DebugSupport; |
-using Microsoft.VisualStudio; |
-using Microsoft.VisualStudio.Project; |
-using Microsoft.VisualStudio.Shell; |
-using Microsoft.VisualStudio.Shell.Interop; |
-using MSBuild = Microsoft.Build.BuildEngine; |
- |
-#endregion |
- |
-namespace Google.NaClVsx.ProjectSupport { |
- class NaClProjectConfig : ProjectConfig { |
- // Although the NaClProjectConfig class is not implemented as a singleton, |
- // it is what launches the debugger with a given nexe, and therefore there |
- // should (at least in the short term) be a current Nexe that we are |
- // debugging. In order to provide the most recent Nexe launched and still |
- // have the flexibility (in the future) to have multiple nexes, as well as |
- // to keep track of all the nexes we have tried to debug in a session, |
- // the variable |nexeList_| is an ArrayList of strings. |
- // Whenever the |DebugLaunch| method is invoked, it adds the current nexe |
- // that is being launched (though sel_ldr) to the end of the list. |
- |
- /// <summary> |
- /// Create the NaCl Project config, which sets default properties. |
- /// </summary> |
- /// <param name = "project"> Project that is created. </param> |
- /// <param name = "configuration"> Configuration string, |
- /// such as "Debug" or "Release". </param> |
- public NaClProjectConfig(ProjectNode project, string configuration) |
- : base(project, configuration) { |
- // Currently this is hardcoded, since we only support 64-bit debugging. |
- Debug.WriteLine("In NaClProjectConfig"); |
- SetConfigurationProperty("TargetArch", "x86_64"); |
- } |
- |
- public static string GetLastNexe() { |
- // Current assumption -- nexeList_ contains only 1 nexe, but just in |
- // case we will grab the last one added to nexeList_. |
- // Print an error if nexeList_ contanis more than 1. |
- if (nexeList_.Count != 1) { |
- Debug.WriteLine( |
- "WARNING: nexeList_ Count is " + |
- nexeList_.Count); |
- foreach (string a_nexe in nexeList_) { |
- Debug.WriteLine("NEXE: " + a_nexe); |
- } |
- } |
- if (nexeList_.Count == 0) { |
- Debug.WriteLine("ERROR: nexeList_.Count is 0"); |
- return ""; |
- } |
- return (string) nexeList_[nexeList_.Count - 1]; |
- } |
- |
- /// <summary> |
- /// Determine if the server is running by connecting to the |
- /// specified |hostName| and |portNum|. |
- /// </summary> |
- /// <param name = "hostName"> Name of the host, such as "localhost". </param> |
- /// <param name = "portNum"> Port number, such as 5103. </param> |
- /// <returns> true if we could connect, false otherwise. </returns> |
- public static bool IsServerRunning(string hostName, int portNum) { |
- var didConnect = false; |
- try { |
- var socket = new TcpClient(hostName, portNum); |
- didConnect = true; |
- Debug.WriteLine("Connected to " + hostName + ":" + portNum); |
- socket.Close(); |
- } |
- catch (Exception e) { |
- Debug.WriteLine( |
- "Exception {" + e.Message + "} connecting to " + |
- hostName + ":" + portNum); |
- } |
- return didConnect; |
- } |
- |
- /// <summary> |
- /// StartServer will launch a process, which is assumed to be a server |
- /// such as httpd.cmd. |
- /// </summary> |
- /// <param name = "serverName"> Name of the executable (full path).</param> |
- /// <param name = "serverArgs"> Name of the args to the server, can be empty |
- /// <param name = "workingDir"> Directory where the .nexe, .html, .js, and |
- /// .nmf files are.</param> |
- /// string.</param> |
- /// TODO: We do not have method to kill or halt the server. I |
- /// looked into this, but it's non-trivial to kill the entire process |
- /// tree and also depends on the server itself. For example, httpd.cmd |
- /// has had issues with closing when you tell it to. |
- public static void StartServer(string serverName, |
- string serverArgs, |
- string workingDir) { |
- serverProcess_ = new Process(); |
- serverProcess_.StartInfo.FileName = serverName; |
- serverProcess_.StartInfo.WorkingDirectory = workingDir; |
- serverProcess_.StartInfo.Arguments = serverArgs; |
- |
- // try/catch will handle the exceptions that can be thrown in C# if the |
- // process fails to start for anyh reason (bad path, etc.). |
- try { |
- serverProcess_.Start(); |
- } |
- catch (Exception e) { |
- Debug.WriteLine("Caught an exception " + e); |
- MessageBox.Show( |
- "Tried to launch server process {" + serverName + |
- "} with arguments {" + |
- serverArgs + "} but encountered exception:\n " + e); |
- } |
- Debug.WriteLine("Name is " + serverProcess_.ProcessName); |
- } |
- |
- /// <summary> |
- /// DebugLaunch populates the VsDebugTargetInfo object, and then hands it |
- /// to VsShellUtilities to launch the debugger. |
- /// </summary> |
- /// <param name = "grfLaunch"> |
- /// An enumeration of launch parameters, interpreted as a |
- /// __VSDBGLAUNCHFLAGS Enumeration. |
- /// </param> |
- /// <returns> |
- /// VSConstants.S_OK if all goes well. Otherwise VSConstants.E_UNEXPECTED |
- /// </returns> |
- public override int DebugLaunch(uint grfLaunch) { |
- var info = new VsDebugTargetInfo(); |
- info.clsidCustom = new Guid(Engine.kId); |
- info.dlo = DEBUG_LAUNCH_OPERATION.DLO_CreateProcess; |
- |
- var host = ProjectMgr.GetProjectProperty("DebugHost", false); |
- if (string.IsNullOrEmpty(host)) { |
- throw new FileNotFoundException( |
- "The Debug Host property has not been specified. " + |
- "Debugging cannot continue.\n\n" + |
- "To specify a debug host, open the project properties and " + |
- "select Debug from the list on the left of the window."); |
- } else if (!File.Exists(host)) { |
- throw new FileNotFoundException( |
- "The DebugHost {" + host + "} was not found. " + |
- "Debugging cannot continue.\n\n" + |
- "To specify a debug host, open the project properties and " + |
- "select Debug from the list on the left of the window."); |
- } |
- info.bstrExe = host; |
- |
- if (null == ProjectMgr) { |
- return VSConstants.E_UNEXPECTED; |
- } |
- |
- var nexe = |
- Path.Combine( |
- Path.GetDirectoryName(ProjectMgr.BaseURI.Uri.LocalPath), |
- GetConfigurationProperty("OutputFullPath", false)); |
- // If a server is specified and is not running, launch it now. |
- var hostName = GetConfigurationProperty("LaunchHostname", false); |
- var portNumValue = GetConfigurationProperty("LaunchPort", false); |
- int portNum = 0; |
- if (null != portNumValue) { |
- try { |
- portNum = Convert.ToInt32(portNumValue); |
- } catch(System.FormatException e) { |
- Debug.WriteLine("Caught exception for portNumValue{" + portNumValue + "}" + e); |
- } catch(System.OverflowException e) { |
- Debug.WriteLine("Caught exception for portNumValue{" + portNumValue + "}" + e); |
- } |
- } |
- var isServerRunning = IsServerRunning(hostName, portNum); |
- var serverProgram = GetConfigurationProperty("WebServer", false); |
- var serverArgs = GetConfigurationProperty("WebServerArgs", false); |
- if (serverProgram != null && serverProgram.Length > 0 && |
- !isServerRunning) { |
- // We know that the server at the host is specified and |
- // is not currently running. We will start it now. |
- // Currently, we are not having the user specify args |
- // for the server, but if we need to later that would be the |
- // second argument to StartServer. |
- var workingDir = Path.GetDirectoryName(nexe); |
- StartServer(serverProgram, serverArgs, workingDir); |
- } |
- var safeNexeString = string.Format("\"{0}\"", nexe); |
- nexeList_.Add(nexe); |
- |
- if (host.Contains("sel_ldr")) { |
- // sel_ldr needs a -g to enable debugger |
- var irtNexe = GetConfigurationProperty("IrtNexe", false); |
- if (null == irtNexe || irtNexe.Length == 0) { |
- MessageBox.Show( |
- "Error: IrtNexe property is not set, but is required by sel_ldr", |
- "Error"); |
- return VSConstants.S_FALSE; |
- } |
- info.bstrArg = string.Format( |
- "-g -B {0} {1} {2}", |
- irtNexe, |
- GetConfigurationProperty("DebugArgs", false), |
- safeNexeString); |
- } else if (host.Contains("chrome.exe")) { |
- // Use for in-process debugger |
- var html_page = hostName + ":" + portNum + "/" + |
- GetConfigurationProperty("HtmlPage", false); |
- // Get args based on project property |
- var chrome_debug_args = GetConfigurationProperty("DebugArgs", false); |
- info.bstrArg = string.Format( |
- "{0} {1} {2}", |
- chrome_debug_args, |
- html_page, |
- GetConfigurationProperty("DebugArgs", false)); |
- } else { |
- // Used for out-of-process debugger |
- info.bstrArg = string.Format( |
- "{0} {1}", |
- safeNexeString, |
- GetConfigurationProperty("DebugArgs", false)); |
- } |
- |
- info.bstrCurDir = Path.GetDirectoryName(nexe); |
- info.fSendStdoutToOutputWindow = 1; |
- info.grfLaunch = grfLaunch; |
- info.clsidPortSupplier = typeof (NaClPortSupplier).GUID; |
- info.bstrPortName = "127.0.0.1:4014"; |
- |
- // If we need to set env vars, this is a way to do it |
- // Environment.SetEnvironmentVariable("NACL_DEBUG_ENABLE","1"); |
- |
- VsShellUtilities.LaunchDebugger(ProjectMgr.Site, info); |
- return VSConstants.S_OK; |
- } |
- |
- #region Private Implementation |
- |
- private static readonly ArrayList nexeList_ = new ArrayList(); |
- private static Process serverProcess_; |
- |
- #endregion |
- |
- internal string GetRawConfigurationProperty(string propertyName, |
- bool cacheNeedReset) { |
- var property = GetMsBuildProperty(propertyName, cacheNeedReset); |
- if (property == null) { |
- return null; |
- } |
- |
- return property.Value; |
- } |
- } |
-} |