#region ================== Copyright (c) 2007 Pascal vd Heiden /* * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com * This program is released under GNU General Public License * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #endregion #region ================== Namespaces using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Text; using System.IO; using CodeImp.DoomBuilder.Data; using System.Diagnostics; using CodeImp.DoomBuilder.Controls; using System.Windows.Forms; #endregion namespace CodeImp.DoomBuilder.IO { internal class Launcher : IDisposable { #region ================== Constants #endregion #region ================== Variables private string tempwad; private bool isdisposed; #endregion #region ================== Properties public string TempWAD { get { return tempwad; } } #endregion #region ================== Constructor / Destructor // Constructor public Launcher(MapManager manager) { // Initialize this.tempwad = General.MakeTempFilename(manager.TempPath, "wad"); // Bind actions General.Actions.BindMethods(this); } // Disposer public void Dispose() { // Not yet disposed? if(!isdisposed) { // Unbind actions General.Actions.UnbindMethods(this); // Done isdisposed = true; } } #endregion #region ================== Parameters // This takes the unconverted parameters (with placeholders) and converts it // to parameters with full paths, names and numbers where placeholders were put. // The tempfile must be the full path and filename to the PWAD file to test. public string ConvertParameters(string parameters) { string outp = parameters; DataLocation iwadloc; string p_wp = "", p_wf = ""; string p_ap = "", p_apq = ""; // Find the first IWAD file if(General.Map.Data.FindFirstIWAD(out iwadloc)) { // %WP and %WF result in IWAD file p_wp = iwadloc.location; p_wf = Path.GetFileName(p_wp); } // Make a list of all data locations, including map location DataLocation maplocation = new DataLocation(DataLocation.RESOURCE_WAD, General.Map.FilePathName, false, false); DataLocationList locations = new DataLocationList(); locations.AddRange(General.Map.Options.Resources); locations.Add(maplocation); // Go for all data locations foreach(DataLocation dl in locations) { // Location not the IWAD file? if((dl.type == DataLocation.RESOURCE_WAD) && (dl.location != iwadloc.location)) { // Add to string of files p_ap += dl.location + " "; p_apq += "\"" + dl.location + "\" "; } } // Trim last space from resource file locations p_ap = p_ap.TrimEnd(' '); p_apq = p_apq.TrimEnd(' '); // Make sure all our placeholders are in uppercase outp = outp.Replace("%f", "%F"); outp = outp.Replace("%wp", "%WP"); outp = outp.Replace("%wf", "%WF"); outp = outp.Replace("%wP", "%WP"); outp = outp.Replace("%wF", "%WF"); outp = outp.Replace("%Wp", "%WP"); outp = outp.Replace("%Wf", "%WF"); outp = outp.Replace("%l", "%L"); outp = outp.Replace("%ap", "%AP"); outp = outp.Replace("%aP", "%AP"); outp = outp.Replace("%Ap", "%AP"); // Replace placeholders with actual values outp = outp.Replace("%F", General.Map.Launcher.TempWAD); outp = outp.Replace("%WP", p_wp); outp = outp.Replace("%WF", p_wf); outp = outp.Replace("%L", General.Map.Options.CurrentName); outp = outp.Replace("\"%AP\"", p_apq); outp = outp.Replace("%AP", p_ap); // Return result return outp; } #endregion #region ================== Test // This saves the map to a temporary file and launches a test [BeginAction("testmap")] public void Test() { Cursor oldcursor = Cursor.Current; ProcessStartInfo processinfo; Process process; TimeSpan deltatime; string args; // Check if configuration is OK if((General.Map.ConfigSettings.TestProgram == "") || !File.Exists(General.Map.ConfigSettings.TestProgram)) { // Show message Cursor.Current = Cursors.Default; DialogResult result = General.ShowWarningMessage("Your test program is not set for the current game configuration. Would you like to set up your test program now?", MessageBoxButtons.YesNo); if(result == DialogResult.Yes) { // Show game configuration on the right page General.MainWindow.ShowConfigurationPage(2); } return; } // Save map to temporary file Cursor.Current = Cursors.WaitCursor; tempwad = General.MakeTempFilename(General.Map.TempPath, "wad"); if(General.Map.SaveMap(tempwad, MapManager.SAVE_TEST)) { // Make arguments args = ConvertParameters(General.Map.ConfigSettings.TestParameters); // Setup process info processinfo = new ProcessStartInfo(); processinfo.Arguments = args; processinfo.FileName = General.Map.ConfigSettings.TestProgram; processinfo.CreateNoWindow = false; processinfo.ErrorDialog = false; processinfo.UseShellExecute = true; processinfo.WindowStyle = ProcessWindowStyle.Normal; processinfo.WorkingDirectory = Path.GetDirectoryName(processinfo.FileName); // Output info General.WriteLogLine("Running test program: " + processinfo.FileName); General.WriteLogLine("Program parameters: " + processinfo.Arguments); try { // Start the program process = Process.Start(processinfo); // Wait for program to complete process.WaitForExit(); deltatime = TimeSpan.FromTicks(process.ExitTime.Ticks - process.StartTime.Ticks); General.WriteLogLine("Test program has finished."); General.WriteLogLine("Run time: " + deltatime.TotalSeconds.ToString("###########0.00") + " seconds"); } catch(Exception e) { // Unable to start the program General.ShowErrorMessage("Unable to start the test program, " + e.GetType().Name + ": " + e.Message, MessageBoxButtons.OK); ; } } // Remove temporary file try { File.Delete(tempwad); } catch(Exception) { } // Restore old cursor Cursor.Current = oldcursor; } #endregion } }