2007-09-28 08:56:18 +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 CodeImp.DoomBuilder.IO ;
2007-10-01 20:53:10 +00:00
using CodeImp.DoomBuilder.Data ;
2007-09-28 08:56:18 +00:00
using System.IO ;
using System.Diagnostics ;
2007-10-13 14:05:45 +00:00
using System.Windows.Forms ;
2007-09-28 08:56:18 +00:00
#endregion
2007-10-21 18:06:10 +00:00
namespace CodeImp.DoomBuilder.Config
2007-09-28 08:56:18 +00:00
{
2008-01-02 21:49:43 +00:00
internal class NodebuilderInfo : IComparable < NodebuilderInfo >
2007-09-28 08:56:18 +00:00
{
#region = = = = = = = = = = = = = = = = = = Constants
#endregion
#region = = = = = = = = = = = = = = = = = = Variables
private string name ;
2007-10-10 09:05:53 +00:00
private string title ;
2007-10-13 14:05:45 +00:00
private CompilerInfo compiler ;
private string parameters ;
private bool specialoutputfile ;
2007-09-28 08:56:18 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Properties
public string Name { get { return name ; } }
2007-10-10 09:05:53 +00:00
public string Title { get { return title ; } }
2007-10-13 14:05:45 +00:00
public CompilerInfo Compiler { get { return compiler ; } }
public string Parameters { get { return parameters ; } }
public bool HasSpecialOutputFile { get { return specialoutputfile ; } }
2007-09-28 08:56:18 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Constructor / Disposer
// Constructor
2007-10-10 09:05:53 +00:00
public NodebuilderInfo ( string filename , string name , Configuration cfg )
2007-09-28 08:56:18 +00:00
{
2007-10-13 14:05:45 +00:00
string compilername ;
2007-10-10 09:05:53 +00:00
General . WriteLogLine ( "Registered nodebuilder configuration '" + name + "' from '" + filename + "'" ) ;
2007-10-05 10:00:15 +00:00
2007-10-10 09:05:53 +00:00
// Initialize
this . name = name ;
2007-10-13 14:05:45 +00:00
this . compiler = null ;
this . title = cfg . ReadSetting ( "nodebuilders." + name + ".title" , "<untitled configuration>" ) ;
compilername = cfg . ReadSetting ( "nodebuilders." + name + ".compiler" , "" ) ;
this . parameters = cfg . ReadSetting ( "nodebuilders." + name + ".parameters" , "" ) ;
// Check for special output filename
this . specialoutputfile = this . parameters . Contains ( "%T" ) ;
// Find compiler
foreach ( CompilerInfo c in General . Compilers )
{
// Compiler name matches?
if ( c . Name = = compilername )
{
// Apply compiler
this . compiler = c ;
break ;
}
}
// No compiler found?
if ( this . compiler = = null ) throw new Exception ( "No such compiler defined: '" + compilername + "'" ) ;
2007-09-28 08:56:18 +00:00
}
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
// This compares it to other ConfigurationInfo objects
public int CompareTo ( NodebuilderInfo other )
{
// Compare
return name . CompareTo ( other . name ) ;
}
// String representation
public override string ToString ( )
{
2007-10-10 09:05:53 +00:00
return title ;
2007-09-28 08:56:18 +00:00
}
2007-10-13 14:05:45 +00:00
// This runs the nodebuilder
public bool Run ( string targetpath , string inputfile , string outputfile )
{
ProcessStartInfo processinfo ;
Process process ;
TimeSpan deltatime ;
2007-10-14 21:31:45 +00:00
string args ;
2007-10-13 14:05:45 +00:00
try
{
// Copy required files
General . WriteLogLine ( "Copying required files for compiler '" + compiler . Name + "'..." ) ;
compiler . CopyRequiredFiles ( targetpath ) ;
}
catch ( Exception e )
{
// Unable to copy files
2007-10-14 21:31:45 +00:00
General . ShowErrorMessage ( "Unable to copy the required files for the compiler (" + compiler . Name + "). " + e . GetType ( ) . Name + ": " + e . Message , MessageBoxButtons . OK ) ;
2007-10-13 14:05:45 +00:00
return false ;
}
// Make arguments
args = parameters ;
args = args . Replace ( "%F" , inputfile ) ;
args = args . Replace ( "%H" , outputfile ) ;
// Setup process info
processinfo = new ProcessStartInfo ( ) ;
processinfo . Arguments = args ;
processinfo . FileName = Path . Combine ( targetpath , compiler . ProgramFile ) ;
processinfo . CreateNoWindow = false ;
processinfo . ErrorDialog = false ;
processinfo . UseShellExecute = true ;
processinfo . WindowStyle = ProcessWindowStyle . Hidden ;
processinfo . WorkingDirectory = targetpath ;
// Output info
General . WriteLogLine ( "Running nodebuilder compiler '" + compiler . Name + "' with configuration '" + name + "'..." ) ;
General . WriteLogLine ( "Program: " + processinfo . FileName ) ;
General . WriteLogLine ( "Arguments: " + processinfo . Arguments ) ;
try
{
// Start the nodebuilder
process = Process . Start ( processinfo ) ;
}
catch ( Exception e )
{
// Unable to start the nodebuilder
2007-10-14 18:11:03 +00:00
General . ShowErrorMessage ( "Unable to start the nodebuilder compiler (" + compiler . Name + ") . " + e . GetType ( ) . Name + ": " + e . Message , MessageBoxButtons . OK ) ;
2007-10-13 14:05:45 +00:00
return false ;
}
// Wait for nodebuilder to complete
process . WaitForExit ( ) ;
deltatime = TimeSpan . FromTicks ( process . ExitTime . Ticks - process . StartTime . Ticks ) ;
General . WriteLogLine ( "Nodebuilder compiler has finished." ) ;
General . WriteLogLine ( "Compile time: " + deltatime . TotalSeconds . ToString ( "########0.00" ) + " seconds" ) ;
// Success!
return true ;
}
2007-09-28 08:56:18 +00:00
#endregion
}
}