import java.util.LinkedList;\r
import java.util.List;\r
\r
-import org.apache.tools.ant.Task;\r
-import org.apache.tools.ant.Project;\r
import org.apache.tools.ant.BuildException;\r
-\r
+import org.apache.tools.ant.Project;\r
+import org.apache.tools.ant.Task;\r
import org.tianocore.common.logger.EdkLog;\r
+import org.apache.tools.ant.taskdefs.Execute;\r
+import org.apache.tools.ant.taskdefs.LogStreamHandler;\r
+import org.apache.tools.ant.types.Commandline;\r
+\r
+import com.sun.org.apache.bcel.internal.generic.NEW;\r
\r
/**\r
- * SecFixupTask class.\r
- *\r
- * SecFixupTask is used to call SecFixup.exe to fix up sec image.\r
- */\r
+ SecFixupTask class.\r
+ \r
+ SecFixupTask is used to call SecFixup.exe to fix up sec image.\r
+ **/\r
public class EfiRomTask extends Task implements EfiDefine {\r
- ///\r
- /// tool name\r
- ///\r
- private final String toolName = "EfiRom";\r
-\r
- ///\r
- /// Flash default file\r
- ///\r
- private String verbose = "";\r
-\r
- ///\r
- /// Flash device\r
- ///\r
- private String venderId = "";\r
-\r
- ///\r
- /// Flash device Image\r
- ///\r
- private String deviceId = "";\r
-\r
- ///\r
- /// MCI file\r
- ///\r
- private String outputFile = "";\r
-\r
- ///\r
- /// MCO file\r
- ///\r
- private List<Input> binaryFileList = new ArrayList<Input>();\r
-\r
- ///\r
- /// Efi PE32 image file\r
- ///\r
- private List<Input> pe32FileList = new ArrayList<Input>();\r
-\r
- ///\r
- /// Compress efi PE32 image file\r
- ///\r
- private List<Input> pe32ComprFileList = new ArrayList<Input>();\r
-\r
- ///\r
- /// Hex class code in the PCI data strutor header\r
- ///\r
- private String classCode = "";\r
-\r
- ///\r
- /// Hex revision in the PCI data header.\r
- ///\r
- private String revision = "";\r
-\r
- ///\r
- /// Dump the headers of an existing option rom image.\r
- ///\r
- private String dump = "";\r
-\r
-\r
- ///\r
- /// output directory\r
- ///\r
+ //\r
+ // tool name\r
+ //\r
+ private final static String toolName = "EfiRom";\r
+\r
+ //\r
+ // Flash default file\r
+ //\r
+ private ToolArg verbose = new ToolArg();\r
+\r
+ //\r
+ // Flash device\r
+ //\r
+ private ToolArg venderId = new ToolArg();\r
+\r
+ //\r
+ // Flash device Image\r
+ //\r
+ private ToolArg deviceId = new ToolArg();\r
+\r
+ //\r
+ // output file\r
+ //\r
+ private FileArg outputFile = new FileArg();\r
+\r
+ //\r
+ // binary file\r
+ //\r
+ private Input binaryFileList = new Input();\r
+\r
+ //\r
+ // Efi PE32 image file\r
+ //\r
+ private Input pe32FileList = new Input();\r
+\r
+ //\r
+ // Compress efi PE32 image file\r
+ //\r
+ private Input pe32ComprFileList = new Input();\r
+\r
+ //\r
+ // Hex class code in the PCI data strutor header\r
+ //\r
+ private ToolArg classCode = new ToolArg();\r
+\r
+ //\r
+ // Hex revision in the PCI data header.\r
+ //\r
+ private ToolArg revision = new ToolArg();\r
+\r
+ //\r
+ // Dump the headers of an existing option rom image.\r
+ //\r
+ private ToolArg dump = new ToolArg();\r
+\r
+ //\r
+ // output directory\r
+ //\r
private String outputDir = ".";\r
\r
-\r
- ///\r
- /// command and argument list\r
- ///\r
+ //\r
+ // command and argument list\r
+ //\r
LinkedList<String> argList = new LinkedList<String>();\r
+\r
/**\r
- * execute\r
- *\r
- * EfiRomTask execute function is to assemble tool command line & execute\r
- * tool command line\r
- *\r
- * @throws BuidException\r
- */\r
+ execute\r
+ \r
+ EfiRomTask execute function is to assemble tool command line & execute\r
+ tool command line\r
+ \r
+ @throws BuidException\r
+ **/\r
public void execute() throws BuildException {\r
\r
Project project = this.getOwningTarget().getProject();\r
if (path == null) {\r
command = toolName;\r
} else {\r
- command = path + File.separatorChar + toolName;\r
+ command = path + File.separator + toolName;\r
}\r
- argList.addFirst(command);\r
\r
- //\r
- // add microcode binary files\r
- //\r
- if (this.binaryFileList.size() > 0){\r
- argList.add("-b");\r
- Iterator binList = this.binaryFileList.iterator();\r
- while (binList.hasNext()){\r
- argList.addAll(((Input)binList.next()).getNameList());\r
- }\r
- }\r
+ String argument = "" + verbose + venderId + deviceId + dump + revision + classCode \r
+ + binaryFileList.toStringWithSinglepPrefix(" -b ")\r
+ + pe32FileList.toStringWithSinglepPrefix(" -e ")\r
+ + pe32ComprFileList.toStringWithSinglepPrefix(" -ec ")\r
+ + outputFile;\r
\r
- //\r
- // add pe32 file\r
- //\r
- if (this.pe32FileList.size() > 0){\r
- argList.add("-e");\r
- Iterator pe32List = this.pe32FileList.iterator();\r
- while (pe32List.hasNext()){\r
- argList.addAll(((Input)pe32List.next()).getNameList());\r
- }\r
- }\r
+ try {\r
+ Commandline cmdline = new Commandline();\r
+ cmdline.setExecutable(command);\r
+ cmdline.createArgument().setLine(argument);\r
\r
- //\r
- // add compressed pe32 file\r
- //\r
- if (this.pe32ComprFileList.size() > 0){\r
- argList.add("-ec");\r
- Iterator pe32ComprList = this.pe32ComprFileList.iterator();\r
- while (pe32ComprList.hasNext()){\r
- argList.addAll(((Input)pe32ComprList.next()).getNameList());\r
- }\r
- }\r
+ LogStreamHandler streamHandler = new LogStreamHandler(this,\r
+ Project.MSG_INFO, Project.MSG_WARN);\r
+ Execute runner = new Execute(streamHandler, null);\r
\r
- EdkLog.log(this, EdkLog.EDK_VERBOSE, argList.toString().replaceAll(",",""));\r
- EdkLog.log(this, EdkLog.EDK_INFO, " ");\r
+ runner.setAntRun(project);\r
+ runner.setCommandline(cmdline.getCommandline());\r
+ runner.setWorkingDirectory(new File(outputDir));\r
\r
- //\r
- // lauch the program\r
- //\r
- ProcessBuilder pb = new ProcessBuilder(argList);\r
- pb.directory(new File(outputDir));\r
- int exitCode = 0;\r
- try {\r
- Process cmdProc = pb.start();\r
- InputStreamReader cmdOut = new InputStreamReader(cmdProc.getInputStream());\r
- char[] buf = new char[1024];\r
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));\r
+ EdkLog.log(this, EdkLog.EDK_INFO, binaryFileList.toFileList() \r
+ + pe32FileList.toFileList() + pe32ComprFileList.toFileList()\r
+ + " => " + outputFile.toFileList());\r
\r
- exitCode = cmdProc.waitFor();\r
+ int exitCode = runner.execute();\r
if (exitCode != 0) {\r
- int len = cmdOut.read(buf, 0, 1024);\r
- EdkLog.log(EdkLog.EDK_INFO, new String(buf, 0, len));\r
+ //\r
+ // command execution fail\r
+ //\r
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(exitCode));\r
+ throw new BuildException(toolName + " failed!");\r
} else {\r
- EdkLog.log(EdkLog.EDK_VERBOSE, "EfiRom succeeded!");\r
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");\r
}\r
} catch (Exception e) {\r
throw new BuildException(e.getMessage());\r
- } finally {\r
- if (exitCode != 0) {\r
- throw new BuildException("EfiRom failed!");\r
- }\r
}\r
}\r
\r
/**\r
- * getVerbose\r
- *\r
- * This function is to get class member "verbose"\r
- *\r
- * @return verbose for verbose output.\r
- */\r
+ getVerbose\r
+ \r
+ This function is to get class member "verbose"\r
+ \r
+ @return verbose for verbose output.\r
+ **/\r
public String getVerbose() {\r
- return verbose;\r
+ return verbose.getValue();\r
}\r
\r
/**\r
- * setVerbose\r
- *\r
- * This function is to set class member "verbose"\r
- *\r
- * @param verbose for verbose output.\r
- */\r
+ setVerbose\r
+ \r
+ This function is to set class member "verbose"\r
+ \r
+ @param verbose for verbose output.\r
+ **/\r
public void setVerbose(boolean verbose) {\r
if (verbose){\r
- this.verbose = "-p";\r
- argList.add(this.verbose);\r
+ this.verbose.setArg(" -", "p");\r
}\r
}\r
\r
/**\r
- * getVenderId\r
- *\r
- * This function is to get class member "venderId"\r
- *\r
- * @return venderId String of venderId.\r
- */\r
+ getVenderId\r
+ \r
+ This function is to get class member "venderId"\r
+ \r
+ @return venderId String of venderId.\r
+ **/\r
public String getVenderId() {\r
- return venderId;\r
+ return venderId.getValue();\r
}\r
\r
/**\r
- * setVenderId\r
- *\r
- * This function is to set class member "venderId"\r
- *\r
- * @param venderId String of venderId.\r
- */\r
- public void setVenderId(String VenderId) {\r
- this.venderId = VenderId;\r
- argList.add("-v");\r
- argList.add(this.venderId);\r
+ setVenderId\r
+ \r
+ This function is to set class member "venderId"\r
+ \r
+ @param venderId String of venderId.\r
+ **/\r
+ public void setVenderId(String venderId) {\r
+ this.venderId.setArg(" -v ", venderId);\r
}\r
\r
/**\r
- * getDeviceId\r
- *\r
- * This function is to get class member "deviceId"\r
- *\r
- * @return deviceId String of device ID.\r
- */\r
+ getDeviceId\r
+ \r
+ This function is to get class member "deviceId"\r
+ \r
+ @return deviceId String of device ID.\r
+ **/\r
public String getDeviceId() {\r
- return this.deviceId;\r
+ return this.deviceId.getValue();\r
}\r
\r
/**\r
- * setDeviceId\r
- *\r
- * This function is to set class member "deviceId"\r
- *\r
- * @param deviceId String of device ID.\r
- */\r
+ setDeviceId\r
+ \r
+ This function is to set class member "deviceId"\r
+ \r
+ @param deviceId String of device ID.\r
+ **/\r
public void setDeviceId(String deviceId) {\r
- this.deviceId = deviceId;\r
- argList.add("-d");\r
- argList.add(this.deviceId);\r
+ this.deviceId.setArg(" -d ", deviceId);\r
}\r
\r
\r
/**\r
- * getOutputFile\r
- *\r
- * This function is to get class member "outputFile"\r
- *\r
- * @return outputFile name of output directory.\r
- */\r
+ getOutputFile\r
+ \r
+ This function is to get class member "outputFile"\r
+ \r
+ @return outputFile name of output directory.\r
+ **/\r
public String getOutputFile() {\r
- return outputFile;\r
+ return outputFile.getValue();\r
}\r
\r
/**\r
- * setOutputFile\r
- *\r
- * This function is to set class member "dscFile"\r
- *\r
- * @param outputFile name of DSC file\r
- */\r
+ setOutputFile\r
+ \r
+ This function is to set class member "dscFile"\r
+ \r
+ @param outputFile name of DSC file\r
+ **/\r
public void setOutputFile(String outputFile) {\r
- this.outputFile = outputFile;\r
-\r
+ this.outputFile.setArg(" -o ", outputFile);\r
}\r
\r
/**\r
- * getClassCode\r
- *\r
- * This function is to get class member "classCode"\r
- *\r
- * @return fdImage name of class code file.\r
- */\r
+ getClassCode\r
+ \r
+ This function is to get class member "classCode"\r
+ \r
+ @return fdImage name of class code file.\r
+ **/\r
public String getClassCode() {\r
- return classCode;\r
+ return classCode.getValue();\r
}\r
\r
/**\r
- * setclassCode\r
- *\r
- * This function is to set class member "classCode"\r
- *\r
- * @param fdImage name of class code file.\r
- */\r
+ setclassCode\r
+ \r
+ This function is to set class member "classCode"\r
+ \r
+ @param fdImage name of class code file.\r
+ **/\r
public void setclassCode(String classCode) {\r
- this.classCode = classCode;\r
- argList.add("-cc");\r
- argList.add(this.classCode);\r
+ this.classCode.setArg(" -cc ", classCode);\r
}\r
\r
/**\r
- * getRevision\r
- *\r
- * This function is to get class member "revision".\r
- *\r
- * @return revision hex revision in the PDI data header.\r
- */\r
+ getRevision\r
+ \r
+ This function is to get class member "revision".\r
+ \r
+ @return revision hex revision in the PDI data header.\r
+ **/\r
public String getRevision() {\r
- return revision;\r
+ return revision.getValue();\r
}\r
\r
/**\r
- * setRevision\r
- *\r
- * This function is to set class member "revision"\r
- *\r
- * @param revision hex revision in the PDI data header.\r
- */\r
+ setRevision\r
+ \r
+ This function is to set class member "revision"\r
+ \r
+ @param revision hex revision in the PDI data header.\r
+ **/\r
public void setRevision(String revision) {\r
- this.revision = revision;\r
- argList.add("-rev");\r
- argList.add(this.revision);\r
+ this.revision.setArg(" -rev ", revision);\r
}\r
\r
/**\r
- * getFlashDeviceImage\r
- *\r
- * This function is to get class member "dump"\r
- *\r
- * @return flashDeviceImage name of flash device image\r
- */\r
+ getFlashDeviceImage\r
+ \r
+ This function is to get class member "dump"\r
+ \r
+ @return flashDeviceImage name of flash device image\r
+ **/\r
public String getDump() {\r
- return dump;\r
+ return dump.getValue();\r
}\r
\r
/**\r
- * setFlashDeviceImage\r
- *\r
- * This function is to set class member "dump"\r
- *\r
- * @param flashDeviceImage name of flash device image\r
- */\r
+ setFlashDeviceImage\r
+ \r
+ This function is to set class member "dump"\r
+ \r
+ @param flashDeviceImage name of flash device image\r
+ **/\r
public void setDump(boolean dump) {\r
- if (dump){\r
- this.dump = "-dump";\r
- argList.add(this.dump);\r
+ if (dump) {\r
+ this.dump.setArg(" -", "dump");\r
}\r
}\r
\r
/**\r
- * getOutputDir\r
- *\r
- * This function is to get class member "outputDir"\r
- *\r
- * @return outputDir string of output directory\r
- */\r
+ getOutputDir\r
+ \r
+ This function is to get class member "outputDir"\r
+ \r
+ @return outputDir string of output directory\r
+ **/\r
public String getOutputDir() {\r
return outputDir;\r
}\r
\r
/**\r
- * setOutputDir\r
- *\r
- * This function is to set class member "outputDir"\r
- *\r
- * @param outputDir string of output directory\r
- */\r
+ setOutputDir\r
+ \r
+ This function is to set class member "outputDir"\r
+ \r
+ @param outputDir string of output directory\r
+ **/\r
public void setOutputDir(String outputDir) {\r
this.outputDir = outputDir;\r
}\r
+\r
/**\r
- * addBinaryFile\r
- *\r
- * This function is to add binary file to binaryFile list.\r
- *\r
- * @param binaryFile name of binary file.\r
- */\r
- public void addBinaryFile(Input binaryFile){\r
- this.binaryFileList.add(binaryFile);\r
+ addBinaryFile\r
+ \r
+ This function is to add binary file to binaryFile list.\r
+ \r
+ @param binaryFile name of binary file.\r
+ **/\r
+ public void addConfiguredBinaryFile(Input binaryFile){\r
+ this.binaryFileList.insert(binaryFile);\r
}\r
\r
/**\r
- * addPe32File\r
- *\r
- * This function is to add pe32 file to pe32File list.\r
- *\r
- * @param pe32File name of pe32 file.\r
- */\r
- public void addPe32File(Input pe32File){\r
- this.pe32FileList.add(pe32File);\r
+ addPe32File\r
+ \r
+ This function is to add pe32 file to pe32File list.\r
+ \r
+ @param pe32File name of pe32 file.\r
+ **/\r
+ public void addConfiguredPe32File(Input pe32File){\r
+ this.pe32FileList.insert(pe32File);\r
}\r
\r
/**\r
- * addPe32ComprFile\r
- *\r
- * This function os to add compressed pe32 file to pe32ComprFile list.\r
- *\r
- * @param pe32ComprFile name of compressed pe32 file.\r
- */\r
- public void addPe32ComprFile(Input pe32ComprFile){\r
- this.pe32ComprFileList.add(pe32ComprFile);\r
+ addPe32ComprFile\r
+ \r
+ This function os to add compressed pe32 file to pe32ComprFile list.\r
+ \r
+ @param pe32ComprFile name of compressed pe32 file.\r
+ **/\r
+ public void addConfiguredPe32ComprFile(Input pe32ComprFile){\r
+ this.pe32ComprFileList.insert(pe32ComprFile);\r
}\r
}\r