--- /dev/null
+/** @file\r
+This file is to define nested element which is meant for specifying a tool\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+package org.tianocore.framework.tasks;\r
+\r
+import java.io.DataInputStream;\r
+import java.io.DataOutputStream;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Random;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+import org.tianocore.common.logger.EdkLog;\r
+\r
+/**\r
+ Class Tool is to define an external tool to be used for genffsfile\r
+ **/\r
+public class Tool implements EfiDefine, Section {\r
+\r
+ private String toolName = "";\r
+ private ToolArg toolArgList = new ToolArg();\r
+ private Input inputFiles = new Input();\r
+ private Input tempInputFile = new Input();\r
+ private String outputPath;\r
+ private String outputFileName ;\r
+ private static Random ran = new Random(9999); \r
+ private List<Section> gensectList = new ArrayList<Section>();\r
+ /**\r
+ Call extern tool\r
+\r
+ @param buffer The buffer to put the result with alignment\r
+ **/\r
+ public void toBuffer (DataOutputStream buffer){\r
+ ///\r
+ /// call extern tool\r
+ ///\r
+ try {\r
+ executeTool ();\r
+ } catch (Exception e) {\r
+ throw new BuildException("Call to executeTool failed!\n" + e.getMessage());\r
+ }\r
+\r
+ ///\r
+ /// check if file exist\r
+ ///\r
+ File outputFile = new File (this.outputFileName);\r
+ if (!outputFile.exists()) {\r
+ throw new BuildException("The file " + outputFile.getPath() + " does not exist!\n");\r
+ }\r
+\r
+ ///\r
+ /// Read output file and write it's cotains to buffer\r
+ ///\r
+ FileInputStream fs = null;\r
+ DataInputStream in = null;\r
+ try {\r
+ fs = new FileInputStream (outputFile);\r
+ in = new DataInputStream (fs);\r
+\r
+\r
+ int fileLen = (int)outputFile.length();\r
+ byte[] data = new byte[fileLen];\r
+ in.read(data);\r
+ buffer.write(data, 0, fileLen);\r
+\r
+ ///\r
+ /// 4 byte alignment\r
+ ///\r
+ while ((fileLen & 0x03) != 0) {\r
+ fileLen++;\r
+ buffer.writeByte(0);\r
+ }\r
+ } catch (Exception e) {\r
+ EdkLog.log(e.getMessage());\r
+ throw new BuildException("Tool call, toBuffer failed!\n");\r
+ } finally {\r
+ try {\r
+ if (in != null) {\r
+ in.close();\r
+ }\r
+ if (fs != null) {\r
+ fs.close();\r
+ }\r
+ outputFile.delete(); \r
+ } catch (Exception e) {\r
+ EdkLog.log("WARNING: Cannot close " + outputFile.getPath());\r
+ }\r
+ }\r
+ }\r
+\r
+ ///\r
+ /// execute external tool for genffsfile\r
+ ///\r
+ private void executeTool () {\r
+ String command = "";\r
+ String argument = "";\r
+ command = toolName;\r
+ \r
+ //\r
+ // Get each section which under the compress {};\r
+ // And add it is contains to File;\r
+ //\r
+ Section sect;\r
+ try{\r
+ Iterator SectionIter = this.gensectList.iterator();\r
+ while (SectionIter.hasNext()){\r
+ sect = (Section)SectionIter.next();\r
+ //\r
+ // Parse <genSection> element\r
+ //\r
+ File outputFile = File.createTempFile("temp", "sec1", new File(outputPath));\r
+ FileOutputStream bo = new FileOutputStream(outputFile);\r
+ DataOutputStream Do = new DataOutputStream (bo);\r
+ //\r
+ // Call each section class's toBuffer function.\r
+ //\r
+ try {\r
+ sect.toBuffer(Do);\r
+ }\r
+ catch (BuildException e) {\r
+ EdkLog.log(e.getMessage());\r
+ throw new BuildException ("GenSection failed at Tool!");\r
+ } finally {\r
+ if (Do != null){\r
+ Do.close(); \r
+ }\r
+ \r
+ } \r
+ this.tempInputFile.insFile(outputFile.getPath());\r
+ } \r
+ } catch (IOException e){\r
+ throw new BuildException ("Gensection failed at tool!");\r
+ } \r
+\r
+ try {\r
+ this.outputFileName = "Temp" + ran.nextInt();\r
+ argument = toolArgList + inputFiles.toStringWithSinglepPrefix(" -i ") \r
+ + tempInputFile.toString(" ")+ " -o " + outputFileName;\r
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, command + " " + argument);\r
+ ///\r
+ /// execute command line\r
+ ///\r
+ Process process = Runtime.getRuntime().exec(command + " " + argument);\r
+ process.waitFor();\r
+ Iterator tempFile = tempInputFile.getNameList().iterator();\r
+ while (tempFile.hasNext()){\r
+ File file = new File((String)tempFile.next());\r
+ if (file.exists()) {\r
+ file.delete();\r
+ }\r
+ }\r
+ } catch (Exception e) {\r EdkLog.log(e.getMessage());\r
+ throw new BuildException("Execution of externalTool task failed!\n");\r
+ }\r
+ }\r
+\r
+ /**\r
+ Add method of ANT task/datatype for nested ToolArg type of element\r
+\r
+ @param toolArg The ToolArg object containing arguments for the tool\r
+ **/\r
+ public void addConfiguredToolArg (ToolArg toolArg) {\r
+ toolArgList.insert(toolArg);\r
+ }\r
+\r
+ /**\r
+ Get method of ANT task/datatype for attribute "OutputPath"\r
+\r
+ @returns The name of output path\r
+ **/\r
+ public String getOutputPath() {\r
+ return outputPath;\r
+ }\r
+\r
+ /**\r
+ Set method of ANT task/datatype for attribute "OutputPath"\r
+\r
+ @param outputPath The name of output path\r
+ **/\r
+ public void setOutputPath(String outPutPath) {\r
+ this.outputPath = outPutPath;\r
+ }\r
+\r
+ /**\r
+ Get method of ANT task/datatype for attribute "ToolName"\r
+\r
+ @returns The name of the tool.\r
+ **/\r
+ public String getToolName() {\r
+ return toolName;\r
+ }\r
+\r
+ /**\r
+ Set method of ANT task/datatype for attribute "ToolName"\r
+\r
+ @param toolName The name of the tool\r
+ **/\r
+ public void setToolName(String toolName) {\r
+ this.toolName = toolName;\r
+ }\r
+\r
+ /**\r
+ Add method of ANT task/datatype for nested Input type of element\r
+\r
+ @param file The Input objec which represents a file\r
+ **/\r
+ public void addConfiguredInput(Input file) {\r
+ inputFiles.insert(file);\r
+ }\r
+ \r
+// /**\r
+// addTool\r
+// \r
+// This function is to add instance of Tool to list.\r
+// \r
+// @param tool instance of Tool.\r
+// **/\r
+// public void addTool(Tool tool){\r
+// this.toolList.add(tool);\r
+// }\r
+ \r
+ public void addGenSection(GenSectionTask genSect){\r
+ this.gensectList.add(genSect);\r
+ } \r
+}\r
+\r
+\r