diff --git a/app/Command.java b/app/Command.java new file mode 100644 index 000000000..30da3835d --- /dev/null +++ b/app/Command.java @@ -0,0 +1,153 @@ +/* + Part of the Arduino project - http://arduino.berlios.de + + This class creates a compilation thread + this is needed for detecting time-outs + in system calls. It may happen in + windows whenever there is a syntax error + that the compilation may hang the IDE + + @author DojoDave + @www http://www.0j0.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + 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. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +// TODO migrate codebase to arduino.app +package processing.app; + +import java.io.*; + +class Command extends Thread +{ + /** Command to execute on command line */ + String command; + + /** Process in execution */ + Process process; + + /** Output message from System.out */ + public String outMsg =""; + + /** Error message from System.error */ + public String errorMsg =""; + + /** Result value to be sent back */ + public int outResult = -1; + public int errorResult = -1; + + /** Total errors and warnings to be sent back */ + public int totalErrors = 0; + + /** Waiting value */ + public int waitResult = -1; + + /** Debug Errors and Warnings */ + public boolean debugWarning = false; + public boolean debugError = false; + public boolean logAllOutput = false; + + /** + * Creates the compiler object with the + * gnumake line to call + * @param command name of the command line to call + */ + public Command (String co) + { + // Assign to member variable + command = co; + + } + + /** + * Creates the compiler object with the + * gnumake line to call + * @param command name of the command line to call + * outlog will debug warnings when calling commands + */ + public Command (String co, boolean outlog) + { + // Assign to member variable + command = co; + logAllOutput = outlog; + } + + /** + * Creates the compiler object with the + * gnumake line to call + * @param command name of the command line to call + * warnings will debug warnings when calling commands + * errors will debug errors when calling commands + */ + public Command (String co, boolean warnings, boolean errors) + { + // Assign to member variable + command = co; + debugWarning = warnings; + debugError = errors; + } + + /** Performs system call specific code */ + public void run() + { + try { + process = Runtime.getRuntime().exec(command); + ArduinoMessageSiphon input; + ArduinoMessageSiphon error; + if (logAllOutput) { + input = new ArduinoMessageSiphon(process.getInputStream(), this, logAllOutput); + error = new ArduinoMessageSiphon(process.getErrorStream(), this, logAllOutput); + } else { + input = new ArduinoMessageSiphon(process.getInputStream(), this, debugWarning, debugError); + error = new ArduinoMessageSiphon(process.getErrorStream(), this, debugWarning, debugError); + } + input.start(); + error.start(); + + // wait for the process to finish. if interrupted + // before waitFor returns, continue waiting + // + boolean compiling = true; + while (compiling) { + try { + waitResult = process.waitFor(); + outResult = input.result; + errorResult = error.result; + compiling = false; + } catch (InterruptedException ignored) { } + } + + try { + waitResult = process.exitValue(); + } catch (IllegalThreadStateException ignored) { } + + // trace the error and outout + outMsg = input.theMsg; + errorMsg = error.theMsg; + totalErrors = error.totalErrors; + + // waits 20 secs until being killed by the + // parent process or just dies, no zombies wanted!! + try { + Thread.currentThread().sleep(20000); + } catch (InterruptedException ie) { + } + + } catch (IOException ioe) { + outResult = 99; + } + + } +} \ No newline at end of file