2008-05-23 06:00:37 +00:00
#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 ;
2008-05-29 11:34:01 +00:00
using CodeImp.DoomBuilder.Actions ;
2008-05-23 06:00:37 +00:00
using System.Windows.Forms ;
#endregion
2008-09-07 17:52:16 +00:00
namespace CodeImp.DoomBuilder
2008-05-23 06:00:37 +00:00
{
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
}
}