\r
package org.tianocore.framework.tasks;\r
\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.DataOutputStream;\r
+import java.io.File;\r
+import java.util.ArrayList;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import org.apache.tools.ant.BuildException;\r
import org.apache.tools.ant.Project;\r
import org.apache.tools.ant.Task;\r
-import org.apache.tools.ant.BuildException;\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
+import org.tianocore.common.logger.EdkLog;\r
+\r
+public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes {\r
+ //\r
+ // Tool name\r
+ // \r
+ private final static String toolName = "GenSection";\r
+ //\r
+ // inputfile name\r
+ //\r
+ private FileArg inputFile = new FileArg();\r
+\r
+ //\r
+ // outputfile name\r
+ //\r
+ private FileArg outputFile = new FileArg();\r
+\r
+ //\r
+ // section type\r
+ //\r
+ private ToolArg sectionType = new ToolArg();\r
+\r
+ //\r
+ // version number\r
+ //\r
+ private ToolArg versionNum = new ToolArg();\r
\r
-public class GenSectionTask extends Task implements EfiDefine {\r
- ///\r
- /// inputfile name\r
- ///\r
- private String inputFile = "";\r
- ///\r
- /// outputfile name\r
- ///\r
- private String outputFile = "";\r
- ///\r
- /// section type\r
- ///\r
- private String sectionType = "";\r
- ///\r
- /// version number\r
- ///\r
- private String versionNum = "";\r
- ///\r
- /// interface string\r
- ///\r
- private String interfaceString = "";\r
+ //\r
+ // interface string\r
+ //\r
+ private ToolArg interfaceString = new ToolArg();\r
+\r
+ //\r
+ // Section file list\r
+ //\r
+ private List<Section> sectFileList = new ArrayList<Section>();\r
+\r
+ //\r
+ // flag indicated the <tool> element\r
+ //\r
+ private boolean haveTool = false;\r
\r
/**\r
execute\r
//\r
String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");\r
if (path == null) {\r
- command = "gensection";\r
+ command = toolName;\r
} else {\r
- command = path + "/" + "gensection";\r
+ command = path + File.separator + toolName;\r
}\r
//\r
// argument of tools\r
//\r
- String argument = inputFile + outputFile + sectionType + versionNum\r
- + interfaceString;\r
+ String argument = "" + inputFile + outputFile + sectionType + versionNum + interfaceString;\r
//\r
// return value of gensection execution\r
//\r
\r
runner.setAntRun(project);\r
runner.setCommandline(cmdline.getCommandline());\r
- System.out.println(Commandline.toString(cmdline.getCommandline()));\r
+\r
+ EdkLog.log(this, inputFile.toFileList() + versionNum.getValue() \r
+ + interfaceString.getValue() + " => " + outputFile.toFileList());\r
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));\r
\r
revl = runner.execute();\r
if (EFI_SUCCESS == revl) {\r
- //\r
- // command execution success\r
- //\r
- System.out.println("gensection succeeded!");\r
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");\r
} else {\r
//\r
// command execution fail\r
//\r
- System.out.println("gensection failed. (error="\r
- + Integer.toHexString(revl) + ")");\r
- throw new BuildException("gensection failed. (error="\r
- + Integer.toHexString(revl) + ")");\r
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));\r
+ throw new BuildException(toolName + " failed!");\r
}\r
} catch (Exception e) {\r
throw new BuildException(e.getMessage());\r
@return name of input file\r
**/\r
public String getInputFile() {\r
- return this.inputFile;\r
+ return this.inputFile.getValue();\r
}\r
\r
/**\r
@param inputFile name of input file\r
**/\r
public void setInputFile(String inputFile) {\r
- this.inputFile = " -i " + inputFile;\r
+ this.inputFile.setArg(" -i ", inputFile);\r
}\r
\r
/**\r
@return name of output file\r
**/\r
public String getOutputFile() {\r
- return this.outputFile;\r
+ return this.outputFile.getValue();\r
}\r
\r
/**\r
@param outputFile name of output file\r
**/\r
public void setOutputfile(String outputFile) {\r
- this.outputFile = " -o " + outputFile;\r
+ this.outputFile.setArg(" -o ", outputFile);\r
}\r
\r
/**\r
@return sectoin type\r
**/\r
public String getSectionType() {\r
- return this.sectionType;\r
+ return this.sectionType.getValue();\r
}\r
\r
/**\r
@param sectionType section type\r
**/\r
public void setSectionType(String sectionType) {\r
- this.sectionType = " -s " + sectionType;\r
+ this.sectionType.setArg(" -s ", sectionType);\r
}\r
\r
/**\r
@return version number\r
**/\r
public String getVersionNum() {\r
- return this.versionNum;\r
+ return this.versionNum.getValue();\r
}\r
\r
/**\r
@param versionNum version number\r
**/\r
public void setVersionNum(String versionNum) {\r
- this.versionNum = " -v " + versionNum;\r
+ this.versionNum.setArg(" -v ", versionNum);\r
}\r
\r
/**\r
@return interface string\r
**/\r
public String getInterfaceString() {\r
- return this.interfaceString;\r
+ return this.interfaceString.getValue();\r
}\r
\r
/**\r
@param interfaceString interface string\r
**/\r
public void setInterfaceString(String interfaceString) {\r
- this.interfaceString = " -a " + "\"" + interfaceString + "\"";\r
+ this.interfaceString.setArg(" -a ", "\"" + interfaceString + "\"");\r
+ }\r
+ \r
+ /**\r
+ addSectFile\r
+ \r
+ This function is to add sectFile to list.\r
+ \r
+ @param sectFile instance of sectFile.\r
+ **/\r
+ public void addSectFile(SectFile sectFile){\r
+ this.sectFileList.add(sectFile);\r
+ }\r
+\r
+ /**\r
+ setTool\r
+ \r
+ This function is to set the class member "Tool";\r
+ \r
+ @param tool \r
+ **/\r
+ public void addTool(Tool tool) {\r
+ this.sectFileList.add(tool);\r
+ this.haveTool = true;\r
+ }\r
+ \r
+ /**\r
+ addGenSection\r
+ \r
+ This function is to add GenSectin element to list\r
+ @param task Instance of genSection\r
+ **/\r
+ public void addGenSection(GenSectionTask task){\r
+ this.sectFileList.add(task);\r
+ }\r
+ \r
+ public void toBuffer(DataOutputStream buffer){\r
+ //\r
+ // Search SectionList find earch section and call it's\r
+ // ToBuffer function.\r
+ //\r
+ if (this.sectionType.getValue().equalsIgnoreCase(\r
+ "EFI_SECTION_COMPRESSION")\r
+ && !this.haveTool) {\r
+ Section sect;\r
+\r
+ //\r
+ // Get section file in compress node.\r
+ //\r
+ try {\r
+ ByteArrayOutputStream bo = new ByteArrayOutputStream();\r
+ DataOutputStream Do = new DataOutputStream(bo);\r
+\r
+ //\r
+ // Get each section which under the compress {};\r
+ // And add it is contains to File;\r
+ //\r
+ Iterator SectionIter = this.sectFileList.iterator();\r
+ while (SectionIter.hasNext()) {\r
+ sect = (Section) SectionIter.next();\r
+\r
+ //\r
+ // Call each section class's toBuffer function.\r
+ //\r
+ try {\r
+ sect.toBuffer(Do);\r
+ } catch (BuildException e) {\r
+ System.out.print(e.getMessage());\r
+ throw new BuildException(\r
+ "Compress.toBuffer failed at section");\r
+ }\r
+\r
+ }\r
+ Do.close();\r
+\r
+ //\r
+ // Call compress\r
+ //\r
+ byte[] fileBuffer = bo.toByteArray();\r
+\r
+ synchronized (CompressSection.semaphore) {\r
+ Compress myCompress = new Compress(fileBuffer,\r
+ fileBuffer.length);\r
+\r
+ //\r
+ // Add Compress header\r
+ //\r
+ CompressHeader Ch = new CompressHeader();\r
+ Ch.SectionHeader.Size[0] = (byte) ((myCompress.outputBuffer.length + Ch\r
+ .GetSize()) & 0xff);\r
+ Ch.SectionHeader.Size[1] = (byte) (((myCompress.outputBuffer.length + Ch\r
+ .GetSize()) & 0xff00) >> 8);\r
+ Ch.SectionHeader.Size[2] = (byte) (((myCompress.outputBuffer.length + Ch\r
+ .GetSize()) & 0xff0000) >> 16);\r
+ Ch.SectionHeader.type = (byte) EFI_SECTION_COMPRESSION;\r
+\r
+ //\r
+ // Note: The compressName was not efsfective now. Using the\r
+ // EFI_STANDARD_COMPRSSION for compressType .\r
+ // That is follow old Genffsfile tools. Some code will be\r
+ // added for\r
+ // the different compressName;\r
+ //\r
+ Ch.UncompressLen = fileBuffer.length;\r
+ Ch.CompressType = EFI_STANDARD_COMPRESSION;\r
+\r
+ //\r
+ // Change header struct to byte buffer\r
+ //\r
+ byte[] headerBuffer = new byte[Ch.GetSize()];\r
+ Ch.StructToBuffer(headerBuffer);\r
+\r
+ //\r
+ // First add CompressHeader to Buffer, then add Compress\r
+ // data.\r
+ //\r
+ buffer.write(headerBuffer);\r
+ buffer.write(myCompress.outputBuffer);\r
+\r
+ //\r
+ // Buffer 4 Byte aligment\r
+ //\r
+ int size = Ch.GetSize() + myCompress.outputBuffer.length;\r
+\r
+ while ((size & 0x03) != 0) {\r
+ size++;\r
+ buffer.writeByte(0);\r
+ }\r
+ }\r
+ } catch (Exception e) {\r
+ throw new BuildException("compress.toBuffer failed!\n");\r
+ }\r
+ } else {\r
+ Section sect;\r
+ Iterator sectionIter = this.sectFileList.iterator();\r
+ while (sectionIter.hasNext()) {\r
+ sect = (Section) sectionIter.next();\r
+ try {\r
+ //\r
+ // The last section don't need 4 byte ffsAligment.\r
+ //\r
+ sect.toBuffer(buffer);\r
+ } catch (Exception e) {\r
+ throw new BuildException(e.getMessage());\r
+ }\r
+ }\r
+ }\r
}\r
}\r