+++ /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