summaryrefslogtreecommitdiff
path: root/Tools/Java/Source/FrameworkTasks/org
diff options
context:
space:
mode:
authorlhauch <lhauch@6f19259b-4bc3-4df7-8a09-765794883524>2006-10-05 23:12:07 +0000
committerlhauch <lhauch@6f19259b-4bc3-4df7-8a09-765794883524>2006-10-05 23:12:07 +0000
commitfeccee87a78e68d575dbdf44b34ca0cb5a21ea8d (patch)
treec70bdaea30cf92a8555e1013fc15565138203134 /Tools/Java/Source/FrameworkTasks/org
parent214b0d1914b48d651b25e58f321ddb77a46903b8 (diff)
downloadedk2-platforms-feccee87a78e68d575dbdf44b34ca0cb5a21ea8d.tar.xz
Restructuring for better separation of Tool packages.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1674 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'Tools/Java/Source/FrameworkTasks/org')
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Compress.java78
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressHeader.java77
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressSection.java200
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CreateMtFileTask.java192
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Database.java30
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiCompressTask.java194
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiDefine.java56
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiRomTask.java376
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsHeader.java185
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsTypes.java115
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FileArg.java65
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FlashMapTask.java848
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FwImageTask.java198
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenAcpiTableTask.java194
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCRC32SectionTask.java142
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCapsuleHdrTask.java341
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenDepexTask.java167
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFfsFileTask.java961
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFvImageTask.java274
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenSectionTask.java385
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenTeImageTask.java253
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GuidChkTask.java368
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/IncludePath.java26
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Input.java24
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/InputFile.java24
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/MakeDeps.java304
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ModifyInfTask.java221
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/NestElement.java348
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/PeiReBaseTask.java268
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecApResetVectorFixupTask.java196
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecFixupTask.java224
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SectFile.java103
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Section.java23
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SetStampTask.java162
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SkipExt.java24
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SplitfileTask.java195
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StrGatherTask.java471
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StripTask.java197
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Tool.java242
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ToolArg.java151
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/VfrCompilerTask.java215
-rw-r--r--Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ZeroDebugDataTask.java195
42 files changed, 9312 insertions, 0 deletions
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Compress.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Compress.java
new file mode 100644
index 0000000000..4410ecdda1
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Compress.java
@@ -0,0 +1,78 @@
+/** @file
+ Compress class.
+
+ This class is to call CompressDll.dll to compress section.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+/**
+
+ This class is to call CompressDll.dll to compress section.
+
+**/
+public class Compress {
+ byte[] inputBuffer;
+ byte[] outputBuffer;
+ int size;
+
+ static {
+ String dllPath;
+
+ dllPath = GenFfsFileTask.path;
+ dllPath = dllPath +
+ File.separator +
+ "CompressDll.dll";
+
+ System.load(dllPath);
+ }
+
+ /**
+ CallCompress
+
+ This function is to call the compressDll.dll to compress the contents in
+ buffer.
+
+ @param inputBuffer The input buffer.
+ @param size The size of buffer in byte.
+ @param dllPath The compressDll.dll path.
+ @return The buffer contained the comrpessed input.
+ **/
+ public native byte[] CallCompress (byte[] inputBuffer, int size, String dllPath);
+
+ /**
+ Construct function
+
+ This function is to initialize the class member and call the compress
+ function.
+
+ @param inBuffer The input buffer.
+ @param size The size of buffer in byte.
+ **/
+ public Compress (byte[] inBuffer, int size){
+ this.inputBuffer = inBuffer;
+ this.size = size;
+ String path = GenFfsFileTask.path;
+
+ //
+ // Call Compress function.
+ //
+ this.outputBuffer = CallCompress (
+ this.inputBuffer,
+ this.size,
+ path
+ );
+ }
+} \ No newline at end of file
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressHeader.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressHeader.java
new file mode 100644
index 0000000000..e1823329ff
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressHeader.java
@@ -0,0 +1,77 @@
+/** @file
+ CompressHeader class.
+
+ This class is to generate the compressed section header.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+
+package org.tianocore.framework.tasks;
+
+import org.apache.tools.ant.BuildException;
+/**
+
+ Internal class: This class is to generate the compressed section header.
+
+**/
+public class CompressHeader {
+
+ /**
+ CommonSectionHeader
+
+ This class define the compressed header structor.
+
+ **/
+ public class CommonSectionHeader {
+ byte[] Size = new byte[3];
+ byte type;
+ }
+
+ ///
+ /// Section header.
+ ///
+ public CommonSectionHeader SectionHeader = new CommonSectionHeader();
+
+ ///
+ /// Length of uncompress section in byte.
+ ///
+ public int UncompressLen;
+ ///
+ /// Compress type.
+ ///
+ public byte CompressType;
+
+ ///
+ /// The size of compress header in byte.
+ ///
+ public int GetSize (){
+ return 9;
+ }
+
+ ///
+ /// Write class member to buffer.
+ ///
+ public void StructToBuffer (byte[] Buffer){
+ if (Buffer.length != GetSize()) {
+ throw new BuildException ("CompressHeader Buffer size is not correct!");
+ }
+ for (int i = 0; i < 3; i++){
+ Buffer[i] = SectionHeader.Size[i];
+ }
+ Buffer[3] = SectionHeader.type;
+ Buffer[4] = (byte)(UncompressLen & 0xff);
+ Buffer[5] = (byte)((UncompressLen & 0xff00)>>8);
+ Buffer[6] = (byte)((UncompressLen & 0xff0000)>>16);
+ Buffer[7] = (byte)((UncompressLen & 0xff000000)>>24);
+ Buffer[8] = CompressType;
+ }
+
+} \ No newline at end of file
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressSection.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressSection.java
new file mode 100644
index 0000000000..5f35685fbe
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CompressSection.java
@@ -0,0 +1,200 @@
+/** @file
+ CompressSection class.
+
+ CompressSection indicate that all section which in it should be compressed.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+
+
+package org.tianocore.framework.tasks;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+
+
+/**
+ CompressSection
+
+ CompressSection indicate that all section which in it should be compressed.
+
+**/
+public class CompressSection implements Section, FfsTypes {
+ //
+ // The attribute of compressName.
+ //
+ private String compressName = "";
+ //
+ // The list contained the SectFile element.
+ //
+ private List<Section> sectList = new ArrayList<Section>();
+
+ public static Object semaphore = new Object();
+ /**
+ toBuffer
+
+ This function is to collect all sectFile and compress it , then output
+ the result to buffer.
+
+ @param Buffer The point of output buffer
+
+ **/
+ public void toBuffer (DataOutputStream buffer){
+
+ Section sect;
+
+ //
+ // Get section file in compress node.
+ //
+ try{
+
+ ByteArrayOutputStream bo = new ByteArrayOutputStream ();
+ DataOutputStream Do = new DataOutputStream (bo);
+
+ //
+ // Get each section which under the compress {};
+ // And add it is contains to File;
+ //
+ Iterator SectionIter = sectList.iterator();
+ while (SectionIter.hasNext()){
+ sect = (Section)SectionIter.next();
+
+ //
+ // Call each section class's toBuffer function.
+ //
+ try {
+ sect.toBuffer(Do);
+ }
+ catch (BuildException e) {
+ System.out.print(e.getMessage());
+ throw new BuildException ("Compress.toBuffer failed at section");
+ }
+
+ }
+ Do.close();
+
+ synchronized (semaphore) {
+ //
+ // Call compress
+ //
+ byte[] fileBuffer = bo.toByteArray();
+ Compress myCompress = new Compress(fileBuffer, fileBuffer.length);
+
+ //
+ // Add Compress header
+ //
+ CompressHeader Ch = new CompressHeader();
+ Ch.SectionHeader.Size[0] = (byte)((myCompress.outputBuffer.length +
+ Ch.GetSize()) &
+ 0xff
+ );
+ Ch.SectionHeader.Size[1] = (byte)(((myCompress.outputBuffer.length +
+ Ch.GetSize())&
+ 0xff00) >> 8
+ );
+ Ch.SectionHeader.Size[2] = (byte)(((myCompress.outputBuffer.length +
+ Ch.GetSize()) &
+ 0xff0000) >> 16
+ );
+ Ch.SectionHeader.type = (byte) EFI_SECTION_COMPRESSION;
+
+ //
+ // Note: The compressName was not efsfective now. Using the
+ // EFI_STANDARD_COMPRSSION for compressType .
+ // That is follow old Genffsfile tools. Some code will be added for
+ // the different compressName;
+ //
+ Ch.UncompressLen = fileBuffer.length;
+ Ch.CompressType = EFI_STANDARD_COMPRESSION;
+
+ //
+ // Change header struct to byte buffer
+ //
+ byte [] headerBuffer = new byte[Ch.GetSize()];
+ Ch.StructToBuffer(headerBuffer);
+
+ //
+ // First add CompressHeader to Buffer, then add Compress data.
+ //
+ buffer.write (headerBuffer);
+ buffer.write(myCompress.outputBuffer);
+
+ //
+ // Buffer 4 Byte aligment
+ //
+ int size = Ch.GetSize() + myCompress.outputBuffer.length;
+
+ while ((size & 0x03) != 0){
+ size ++;
+ buffer.writeByte(0);
+ }
+ //
+ // Delete temp file
+ //
+ //di.close();
+ //compressOut.delete();
+ }
+
+ }
+ catch (Exception e){
+ throw new BuildException("compress.toBuffer failed!\n");
+ }
+ }
+
+ /**
+ getCompressName
+
+ This function is to get compressName.
+
+ @return The compressName.
+ **/
+ public String getCompressName() {
+ return compressName;
+ }
+
+ /**
+ setCompressName
+
+ This function is to set compressName.
+
+ @param compressName The string of compressName
+ **/
+ public void setCompressName(String compressName) {
+ this.compressName = compressName;
+ }
+
+ /**
+ addSectFile
+
+ This function is to add sectFile element to SectList.
+
+ @param sectFile SectFile element which succeed from section class.
+ **/
+ public void addSectFile (SectFile sectFile) {
+ sectList.add(sectFile);
+
+ }
+
+ /**
+ addTool
+
+ This function is to add tool element to SectList.
+ @param tool Tool element which succeed from section class.
+ **/
+ public void addTool (Tool tool) {
+ sectList.add(tool);
+ }
+} \ No newline at end of file
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CreateMtFileTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CreateMtFileTask.java
new file mode 100644
index 0000000000..bdc492c0dc
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/CreateMtFileTask.java
@@ -0,0 +1,192 @@
+/** @file
+ CreateMtFileTask class.
+
+ CreateMtFileTask is used to call CreateMtFile.exe to create MT file.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ CreateMtFileTask class.
+
+ CreateMtFileTask is used to call CreateMtFile.exe to create MT file.
+**/
+public class CreateMtFileTask extends Task implements EfiDefine {
+ //
+ // Tool name
+ //
+ private String toolName = "CreateMtFile";
+ //
+ // file size
+ //
+ private ToolArg fileSize = new ToolArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+ /**
+ execute
+
+ StripTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + outputFile + fileSize;
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, this.outputFile.toFileList());
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getFileSize
+
+ This function is to get class member "fileSize".
+
+ @return fileSize string of file size.
+ **/
+ public String getFileSize() {
+ return this.fileSize.getValue();
+ }
+
+ /**
+ setFileSize
+
+ This function is to set class member "fileSize".
+
+ @param fileSize
+ string of file size value.
+ **/
+ public void setFileSize(String fileSize) {
+ this.fileSize.setArg(" ", fileSize);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Database.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Database.java
new file mode 100644
index 0000000000..ade950807c
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Database.java
@@ -0,0 +1,30 @@
+/** @file
+ Database class.
+
+ Database represents an exceplicity name list of database file.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+/**
+ Database represents an exceplicity name list of database file.
+**/
+public class Database extends NestElement {
+ /**
+ Override NestElement.toString() to return a string with leading "-db"
+
+ @return String
+ **/
+ public String toString() {
+ return super.toString(" -db ");
+ }
+} \ No newline at end of file
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiCompressTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiCompressTask.java
new file mode 100644
index 0000000000..1ffd61f015
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiCompressTask.java
@@ -0,0 +1,194 @@
+/** @file
+ EfiCompressTask class.
+
+ EfiCompressTask is used to call EfiCompress.exe to strip input file.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ EfiCompressTask class.
+
+ EfiCompressTask is used to call EfiCompress.exe to strip input file.
+**/
+public class EfiCompressTask extends Task implements EfiDefine {
+ //
+ //
+ //
+ private final static String toolName = "EfiCompress";
+ //
+ // input file
+ //
+ private FileArg inputFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+ /**
+ execute
+
+ EfiCompressTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + inputFile + outputFile;
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, this.inputFile.toFileList() + " => "
+ + this.outputFile.toFileList());
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile".
+
+ @return string of input file name.
+ **/
+ public String getInputFile() {
+ return inputFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "inputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setInputFile(String inputFile) {
+ this.inputFile.setArg(" ", inputFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiDefine.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiDefine.java
new file mode 100644
index 0000000000..6f12f00f43
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiDefine.java
@@ -0,0 +1,56 @@
+/** @file
+ EfiDefine class.
+
+ EfiDefine class records the UEFI return status value.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+
+package org.tianocore.framework.tasks;
+
+/**
+ EfiDefine class.
+
+ EfiDefine class records the UEFI return status value.
+**/
+public interface EfiDefine {
+ //
+ // EFI define Interface for define constant related to UEFI.
+ //
+ static final int EFI_SUCCESS = 0;
+ static final int EFI_LOAD_ERROR = 0x80000001;
+ static final int EFI_INVALID_PARAMETER = 0x80000002;
+ static final int EFI_UNSUPPORTED = 0x80000003;
+ static final int EFI_BAD_BUFFER_SIZE = 0x80000004;
+ static final int EFI_BUFFER_TOO_SMALL = 0x80000005;
+ static final int EFI_NOT_READY = 0x80000006;
+ static final int EFI_DEVICE_ERROR = 0x80000007;
+ static final int EFI_WRITE_PROTECTED = 0x80000008;
+ static final int EFI_OUT_OF_RESOURCES = 0x80000009;
+ static final int EFI_VOLUME_CORRUPTED = 0x8000000a;
+ static final int EFI_VOLUME_FULL = 0x8000000b;
+ static final int EFI_NO_MEDIA = 0x8000000c;
+ static final int EFI_MEDIA_CHANGED = 0x8000000d;
+ static final int EFI_NOT_FOUND = 0x8000000e;
+ static final int EFI_ACCESS_DENIED = 0x8000000f;
+ static final int EFI_NO_RESPONSE = 0x80000010;
+ static final int EFI_NO_MAPPING = 0x80000011;
+ static final int EFI_TIMEOUT = 0x80000012;
+ static final int EFI_NOT_STARTED = 0x80000013;
+ static final int EFI_ALREADY_STARTED = 0x80000014;
+ static final int EFI_ABORTED = 0x80000015;
+ static final int EFI_ICMP_ERROR = 0x80000016;
+ static final int EFI_TFTP_ERROR = 0x80000017;
+ static final int EFI_PROTOCOL_ERROR = 0x80000018;
+ static final int EFI_INCOMPATIBLE_VERSION = 0x80000019;
+ static final int EFI_SECURITY_VIOLATION = 0x80000020;
+ static final int EFI_CRC_ERROR = 0x80000021;
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiRomTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiRomTask.java
new file mode 100644
index 0000000000..acfb2ba572
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/EfiRomTask.java
@@ -0,0 +1,376 @@
+/** @file
+ EfiRomTask class.
+
+ EfiRomTask is used to call FlashMap.exe to lay out the flash.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+import java.util.LinkedList;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.tianocore.common.logger.EdkLog;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+/**
+ SecFixupTask class.
+
+ SecFixupTask is used to call SecFixup.exe to fix up sec image.
+ **/
+public class EfiRomTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private final static String toolName = "EfiRom";
+
+ //
+ // Flash default file
+ //
+ private ToolArg verbose = new ToolArg();
+
+ //
+ // Flash device
+ //
+ private ToolArg venderId = new ToolArg();
+
+ //
+ // Flash device Image
+ //
+ private ToolArg deviceId = new ToolArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // binary file
+ //
+ private Input binaryFileList = new Input();
+
+ //
+ // Efi PE32 image file
+ //
+ private Input pe32FileList = new Input();
+
+ //
+ // Compress efi PE32 image file
+ //
+ private Input pe32ComprFileList = new Input();
+
+ //
+ // Hex class code in the PCI data strutor header
+ //
+ private ToolArg classCode = new ToolArg();
+
+ //
+ // Hex revision in the PCI data header.
+ //
+ private ToolArg revision = new ToolArg();
+
+ //
+ // Dump the headers of an existing option rom image.
+ //
+ private ToolArg dump = new ToolArg();
+
+ //
+ // output directory
+ //
+ private String outputDir = ".";
+
+ //
+ // command and argument list
+ //
+ LinkedList<String> argList = new LinkedList<String>();
+
+ /**
+ execute
+
+ EfiRomTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+
+ String argument = "" + verbose + venderId + deviceId + dump + revision + classCode
+ + binaryFileList.toStringWithSinglepPrefix(" -b ")
+ + pe32FileList.toStringWithSinglepPrefix(" -e ")
+ + pe32ComprFileList.toStringWithSinglepPrefix(" -ec ")
+ + outputFile;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, binaryFileList.toFileList()
+ + pe32FileList.toFileList() + pe32ComprFileList.toFileList()
+ + " => " + outputFile.toFileList());
+
+ int exitCode = runner.execute();
+ if (exitCode != 0) {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(exitCode));
+ throw new BuildException(toolName + " failed!");
+ } else {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getVerbose
+
+ This function is to get class member "verbose"
+
+ @return verbose for verbose output.
+ **/
+ public String getVerbose() {
+ return verbose.getValue();
+ }
+
+ /**
+ setVerbose
+
+ This function is to set class member "verbose"
+
+ @param verbose for verbose output.
+ **/
+ public void setVerbose(boolean verbose) {
+ if (verbose){
+ this.verbose.setArg(" -", "p");
+ }
+ }
+
+ /**
+ getVenderId
+
+ This function is to get class member "venderId"
+
+ @return venderId String of venderId.
+ **/
+ public String getVenderId() {
+ return venderId.getValue();
+ }
+
+ /**
+ setVenderId
+
+ This function is to set class member "venderId"
+
+ @param venderId String of venderId.
+ **/
+ public void setVenderId(String venderId) {
+ this.venderId.setArg(" -v ", venderId);
+ }
+
+ /**
+ getDeviceId
+
+ This function is to get class member "deviceId"
+
+ @return deviceId String of device ID.
+ **/
+ public String getDeviceId() {
+ return this.deviceId.getValue();
+ }
+
+ /**
+ setDeviceId
+
+ This function is to set class member "deviceId"
+
+ @param deviceId String of device ID.
+ **/
+ public void setDeviceId(String deviceId) {
+ this.deviceId.setArg(" -d ", deviceId);
+ }
+
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile name of output directory.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "dscFile"
+
+ @param outputFile name of DSC file
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" -o ", outputFile);
+ }
+
+ /**
+ getClassCode
+
+ This function is to get class member "classCode"
+
+ @return fdImage name of class code file.
+ **/
+ public String getClassCode() {
+ return classCode.getValue();
+ }
+
+ /**
+ setclassCode
+
+ This function is to set class member "classCode"
+
+ @param fdImage name of class code file.
+ **/
+ public void setclassCode(String classCode) {
+ this.classCode.setArg(" -cc ", classCode);
+ }
+
+ /**
+ getRevision
+
+ This function is to get class member "revision".
+
+ @return revision hex revision in the PDI data header.
+ **/
+ public String getRevision() {
+ return revision.getValue();
+ }
+
+ /**
+ setRevision
+
+ This function is to set class member "revision"
+
+ @param revision hex revision in the PDI data header.
+ **/
+ public void setRevision(String revision) {
+ this.revision.setArg(" -rev ", revision);
+ }
+
+ /**
+ getFlashDeviceImage
+
+ This function is to get class member "dump"
+
+ @return flashDeviceImage name of flash device image
+ **/
+ public String getDump() {
+ return dump.getValue();
+ }
+
+ /**
+ setFlashDeviceImage
+
+ This function is to set class member "dump"
+
+ @param flashDeviceImage name of flash device image
+ **/
+ public void setDump(boolean dump) {
+ if (dump) {
+ this.dump.setArg(" -", "dump");
+ }
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir string of output directory
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ /**
+ addBinaryFile
+
+ This function is to add binary file to binaryFile list.
+
+ @param binaryFile name of binary file.
+ **/
+ public void addConfiguredBinaryFile(Input binaryFile){
+ this.binaryFileList.insert(binaryFile);
+ }
+
+ /**
+ addPe32File
+
+ This function is to add pe32 file to pe32File list.
+
+ @param pe32File name of pe32 file.
+ **/
+ public void addConfiguredPe32File(Input pe32File){
+ this.pe32FileList.insert(pe32File);
+ }
+
+ /**
+ addPe32ComprFile
+
+ This function os to add compressed pe32 file to pe32ComprFile list.
+
+ @param pe32ComprFile name of compressed pe32 file.
+ **/
+ public void addConfiguredPe32ComprFile(Input pe32ComprFile){
+ this.pe32ComprFileList.insert(pe32ComprFile);
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsHeader.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsHeader.java
new file mode 100644
index 0000000000..24cb3df266
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsHeader.java
@@ -0,0 +1,185 @@
+/** @file
+ FfsHeader
+
+ FfsHeader class describe the struct of Ffs file header.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import org.apache.tools.ant.BuildException;
+
+/**
+ FfsHeader
+
+ FfsHeader class describe the struct of Ffs file header.
+**/
+public class FfsHeader {
+
+ /**
+ FfsGuid
+
+ FfsGuid is interal class of FfsHeader, it describe the struct of Guid.
+ **/
+ public class FfsGuid {
+
+ int data1 = 0;
+ short data2 = 0;
+ short data3 = 0;
+ byte[] data4 = new byte[8];
+ byte[] dataBuffer = new byte[16];
+
+ /**
+ bufferToStruct
+
+ This function is to convert GUID to ffsGuid class member.
+
+ @param dataBuffer Buffer contained the GUID value in byte.
+ For example: if the input string as : "A6F691AC
+ 31C8 4444 854C E2C1A6950F92"
+ Then Data1: AC91F6A6
+ Data2: C831
+ Data3: 4444
+ Data4: 4C85E2C1A6950F92
+ **/
+ public void bufferToStruct (byte[] dataBuffer){
+ if (dataBuffer.length != 16) {
+ throw new BuildException ("Buffer is not sized [" + dataBuffer.length + "] for data type, GUID!");
+ }
+
+ data1 = (int)(dataBuffer[3]& 0xff);
+ data1 = data1 << 8;
+ data1 = (int)data1 | (dataBuffer[2]& 0xff);
+ data1 = ((data1 << 8) & 0xffff00) | (dataBuffer[1]& 0xff);
+ data1 = ((data1 << 8) & 0xffffff00) | (dataBuffer[0]& 0xff);
+
+
+ data2 = (short) (dataBuffer[5] & 0xff);
+ data2 = (short)((data2 << 8) | (dataBuffer[4]& 0xff));
+
+ data3 = (short)(dataBuffer[7] & 0xff);
+ data3 = (short)((data3 << 8) | (dataBuffer[6] & 0xff));
+
+ for (int i = 0; i < 8; i++) {
+ data4[i] = dataBuffer[i+8];
+ }
+
+ }
+
+ /**
+ structToBuffer
+
+ This function is to store ffsHeader class member to buffer.
+
+ @return Byte buffer which contained the ffsHeader class member
+ **/
+ public byte[] structToBuffer (){
+
+ byte[] buffer = new byte [16];
+
+ buffer[3] = (byte)(data1 & 0x000000ff);
+ buffer[2] = (byte)((data1 & 0x0000ff00)>> 8);
+ buffer[1] = (byte)((data1 & 0x00ff0000)>> 16);
+ buffer[0] = (byte)((data1 & 0xff000000)>> 24);
+
+ buffer[5] = (byte)(data2 & 0x00ff);
+ buffer[4] = (byte)((data2 & 0xff00)>> 8);
+
+ buffer[7] = (byte)(data3 & 0x00ff);
+ buffer[6] = (byte)((data3 & 0xff00)>> 8);
+
+ for (int i = 8; i < 16; i++) {
+ buffer[i] = data4[i-8];
+ }
+ return buffer;
+ }
+
+
+ }
+
+ /**
+ integrityCheckSum
+
+ This class is used to record the struct of checksum.
+ **/
+ public class IntegrityCheckSum {
+ byte header;
+ byte file;
+ }
+
+ ///
+ /// Guid
+ ///
+ FfsGuid name = new FfsGuid();
+
+ ///
+ /// CheckSum
+ ///
+ IntegrityCheckSum integrityCheck = new IntegrityCheckSum();
+
+ ///
+ /// File type
+ ///
+ byte fileType;
+ ///
+ /// Ffs attributes.
+ ///
+ byte ffsAttributes;
+ ///
+ /// Ffs file size
+ ///
+ byte[] ffsFileSize = new byte[3];
+ ///
+ /// Ffs state.
+ ///
+ byte ffsState;
+
+ /**
+ structToBuffer
+
+ This function is to store FfsHeader class member to buffer.
+
+ @return Byte buffer which contained the FfsHeader class member.
+ **/
+ public byte[] structToBuffer () {
+ int i;
+ byte[] buffer1;
+ byte[] buffer = new byte[24];
+ buffer1 = name.structToBuffer();
+
+ for (i = 0; i < 16; i++) {
+ buffer[i] = buffer1[i];
+ }
+
+ buffer[16] = integrityCheck.header;
+ buffer[17] = integrityCheck.file;
+ buffer[18] = fileType;
+ buffer[19] = ffsAttributes;
+
+ for (i=20; i < 23; i++) {
+ buffer[i] = ffsFileSize[i-20];
+ }
+
+ buffer[23] = ffsState;
+ return buffer;
+ }
+
+ /**
+ getSize
+
+ This function is to get the size of FfsHeader in byte.
+
+ @return The size of FfsHeader.
+ **/
+ public int getSize(){
+ return 24;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsTypes.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsTypes.java
new file mode 100644
index 0000000000..6afc3a90ad
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FfsTypes.java
@@ -0,0 +1,115 @@
+/** @file
+ FfsTypes class.
+
+ FfsType class record the costant value of Ffs File attribute, type, and
+ architecture.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+/**
+ FfsType
+
+ FfsType class record the costant value of Ffs File attribute, type, and
+ architecture.
+
+**/
+public interface FfsTypes {
+ //
+ // Ffs file attributes
+ //
+ static final int FFS_ATTRIB_TAIL_PRESENT = 0x01;
+
+ static final int FFS_ATTRIB_RECOVERY = 0x02;
+
+ static final int FFS_ATTRIB_HEADER_EXTENSION = 0x04;
+
+ static final int FFS_ATTRIB_DATA_ALIGNMENT = 0x38;
+
+ static final int FFS_ATTRIB_CHECKSUM = 0x40;
+
+ //
+ // Ffs states difinitions
+ //
+ static final int EFI_FILE_HEADER_CONSTRUCTION = 0x01;
+
+ static final int EFI_FILE_HEADER_VALID = 0x02;
+
+ static final int EFI_FILE_DATA_VALID = 0x04;
+
+ static final int EFI_FILE_MARKED_FOR_UPDATE = 0x08;
+
+ static final int EFI_FILE_DELETED = 0x10;
+
+ static final int EFI_FILE_HEADER_INVALID = 0x20;
+
+ //
+ // FFS_FIXED_CHECKSUM is the default checksum value used when the
+ // FFS_ATTRIB_CHECKSUM attribute bit is clear note this is NOT an
+ // architecturally defined value, but is in this file for implementation
+ // convenience
+ //
+ static final int FFS_FIXED_CHECKSUM = 0x5a;
+
+ //
+ // Architectural file types
+ //
+ static final int EFI_FV_FILETYPE_ALL = 0x00;
+
+ static final int EFI_FV_FILETYPE_RAW = 0x01;
+
+ static final int EFI_FV_FILETYPE_FREEFORM = 0x02;
+
+ static final int EFI_FV_FILETYPE_SECURITY_CORE = 0x03;
+
+ static final int EFI_FV_FILETYPE_PEI_CORE = 0x04;
+
+ static final int EFI_FV_FILETYPE_DXE_CORE = 0x05;
+
+ static final int EFI_FV_FILETYPE_PEIM = 0x06;
+
+ static final int EFI_FV_FILETYPE_DRIVER = 0x07;
+
+ static final int EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER = 0x08;
+
+ static final int EFI_FV_FILETYPE_APPLICATION = 0x09;
+
+ static final int EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE = 0x0B;
+
+ static final int EFI_FV_FILETYPE_FFS_PAD = 0xF0;
+
+ //
+ // Ffs file type
+ //
+ static final String EFI_FV_FFS_FILETYPE_STR = ".FFS";
+ static final String EFI_FV_DXE_FILETYPE_STR = ".DXE";
+ static final String EFI_FV_PEI_FILETYPE_STR = ".PEI";
+ static final String EFI_FV_APP_FILETYPE_STR = ".APP";
+ static final String EFI_FV_FVI_FILETYPE_STR = ".FVI";
+ static final String EFI_FV_SEC_FILETYPE_STR = ".SEC";
+
+ //
+ // Section Type copy from EfiImageFormat.h
+ //
+ static final int EFI_SECTION_COMPRESSION = 0x01;
+ static final int EFI_SECTION_GUID_DEFINED = 0x02;
+
+ //
+ // CompressionType values, we currently don't support
+ // "EFI_CUSTOMIZED_COMPRESSION".
+ //
+ static final int EFI_NOT_COMPRESSED = 0x00;
+ static final int EFI_STANDARD_COMPRESSION = 0x01;
+ static final int EFI_CUSTOMIZED_COMPRESSION = 0x02;
+
+
+} \ No newline at end of file
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FileArg.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FileArg.java
new file mode 100644
index 0000000000..86adb07581
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FileArg.java
@@ -0,0 +1,65 @@
+/** @file
+This file is used to nest elements which is meant for file path
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+/**
+ FileArg class is defined to represent tool's argument which specifies file path.
+ **/
+public class FileArg extends ToolArg {
+ /**
+ Default constructor
+ **/
+ public FileArg() {
+ }
+
+ /**
+ Constructor which accepts argument prefix and its value as parameters
+
+ @param prefix The prefix of argument
+ @param value The value of argument
+ **/
+ public FileArg(String prefix, String value) {
+ super(prefix);
+ this.setValue(value);
+ }
+
+ /**
+ Set the prefix and value of an argument
+
+ @param prefix The prefix of argument
+ @param value The value of argument
+ **/
+ public void setArg(String prefix, String value) {
+ super.setPrefix(prefix);
+ this.setValue(value);
+ }
+
+ /**
+ Set the value of an argument
+
+ @param value The value of the argument
+ **/
+ public void setValue(String value) {
+ super.setFile(value);
+ }
+
+ /**
+ Add a value of an argument
+
+ @param value The value of the argument
+ **/
+ public void insValue(String value) {
+ super.insFile(value);
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FlashMapTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FlashMapTask.java
new file mode 100644
index 0000000000..9a3c61e6c8
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FlashMapTask.java
@@ -0,0 +1,848 @@
+/** @file
+ FlashMapTask class.
+
+ FlashMapTask is used to call FlashMap.exe to lay out the flash.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.BufferedReader;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ * FlashMapTask class.
+ *
+ * FlashMapTask is used to call FlashMap.exe to generate flash map defition files and fd files.
+ */
+public class FlashMapTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private static final String toolName = "FlashMap";
+
+ //
+ //
+ //
+ private static Pattern fileBlock = Pattern.compile("\\s*File\\s*\\{([^\\{\\}]+)\\}");
+ private static Pattern fileNameDef = Pattern.compile("\\bName\\s*=\\s*\"([^\"]+)\"");
+
+ //
+ // Flash definition file
+ //
+ private FileArg flashDefFile = new FileArg();
+
+ //
+ // Flash device
+ //
+ private ToolArg flashDevice = new ToolArg();
+
+ //
+ // Flash device Image
+ //
+ private ToolArg flashDeviceImage = new ToolArg();
+
+ //
+ // MCI file
+ //
+ private FileArg mciFile = new FileArg();
+
+ //
+ // MCO file
+ //
+ private FileArg mcoFile = new FileArg();
+
+ //
+ // Discover FD image
+ //
+ private ToolArg fdImage = new ToolArg();
+
+ //
+ // Dsc file
+ //
+ private FileArg dscFile = new FileArg();
+
+ //
+ // Asm INC file
+ //
+ private FileArg asmIncFile = new FileArg();
+
+ //
+ // Image out file
+ //
+ private FileArg imageOutFile = new FileArg();
+
+ //
+ // Header file
+ //
+ private FileArg headerFile = new FileArg();
+
+ //
+ // Input string file
+ //
+ private String inStrFile = "";
+
+ //
+ // Output string file
+ //
+ private String outStrFile = "";
+
+ //
+ //
+ //
+ private FileArg strFile = new FileArg();
+ //
+ // Base address
+ //
+ private ToolArg baseAddr = new ToolArg();
+
+ //
+ // Aligment
+ //
+ private ToolArg aligment = new ToolArg();
+
+ //
+ // Padding value
+ //
+ private ToolArg padValue = new ToolArg();
+
+ //
+ // output directory
+ //
+ private String outputDir = ".";
+
+ //
+ // MCI file array
+ //
+ FileArg mciFileArray = new FileArg();
+
+ /**
+ execute
+
+ FlashMapTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+ if (isUptodate()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, headerFile.toFileList()
+ + imageOutFile.toFileList()
+ + mcoFile.toFileList()
+ + dscFile.toFileList()
+ + asmIncFile.toFileList()
+ + outStrFile
+ + " is up-to-date!");
+ return;
+ }
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+
+ //
+ // add substituted input file and output file
+ //
+ if (this.inStrFile != null && this.outStrFile != null
+ && this.inStrFile.length() > 0 && this.outStrFile.length() > 0) {
+ strFile.setPrefix(" -strsub ");
+ strFile.insValue(this.inStrFile);
+ strFile.insValue(this.outStrFile);
+ }
+
+ String argument = "" + flashDefFile + flashDevice + flashDeviceImage
+ + mciFile + mcoFile + fdImage + dscFile + asmIncFile
+ + imageOutFile + headerFile + strFile + baseAddr
+ + aligment + padValue + mciFileArray;
+
+
+ //
+ // lauch the program
+ //
+ // ProcessBuilder pb = new ProcessBuilder(argList);
+ // pb.directory(new File(outputDir));
+ int exitCode = 0;
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+
+ if (outputDir != null) {
+ runner.setWorkingDirectory(new File(outputDir));
+ }
+ //
+ // log command line string.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, flashDefFile.toFileList()
+ + mciFile.toFileList()
+ + mciFileArray.toFileList()
+ + fdImage.toFileList()
+ + inStrFile
+ + " => "
+ + headerFile.toFileList()
+ + imageOutFile.toFileList()
+ + mcoFile.toFileList()
+ + dscFile.toFileList()
+ + asmIncFile.toFileList()
+ + outStrFile);
+
+ exitCode = runner.execute();
+ if (exitCode != 0) {
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(exitCode));
+ } else {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "FlashMap succeeded!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ } finally {
+ if (exitCode != 0) {
+ throw new BuildException("FlashMap failed!");
+ }
+ }
+ }
+
+ /**
+ getFlashDefFile
+
+ This function is to get class member "flashDefFile"
+
+ @return flashDeFile Name of flash definition file.
+ **/
+ public String getFlashDefFile() {
+ return this.flashDefFile.getValue();
+ }
+
+ /**
+ setFlashDefFile
+
+ This function is to set class member "flashDefFile"
+
+ @param flashDefFile
+ Name of flash definition file.
+ **/
+ public void setFlashDefFile(String flashDefFile) {
+ this.flashDefFile.setArg(" -fdf ", flashDefFile);
+ }
+
+ /**
+ getAligment
+
+ This function is to get class member "aligment"
+
+ @return aligment String of aligment value.
+ **/
+ public String getAligment() {
+ return this.aligment.getValue();
+ }
+
+ /**
+ setAligment
+
+ This function is to set class member "aligment"
+
+ @param aligment
+ String of aligment value.
+ **/
+ public void setAligment(String aligment) {
+ this.aligment.setArg(" -align ", aligment);
+ }
+
+ /**
+ getAsmIncFile
+
+ This function is to get class member "asmIncFile"
+
+ @return asmIncFile String of ASM include file.
+ **/
+ public String getAsmIncFile() {
+ return this.asmIncFile.getValue();
+ }
+
+ /**
+ setAsmIncFile
+
+ This function is to set class member "asmIncFile"
+
+ @param asmIncFile
+ String of ASM include file.
+ **/
+ public void setAsmIncFile(String asmIncFile) {
+ this.asmIncFile.setArg(" -asmincfile ", asmIncFile);
+ }
+
+ /**
+ getBaseAddr
+
+ This function is to get class member "baseAddr"
+
+ @return baseAddr String of base address value.
+ **/
+ public String getBaseAddr() {
+ return this.baseAddr.getValue();
+ }
+
+ /**
+ setBaseAddr
+
+ This function is to set class member "baseAddr"
+
+ @param baseAddr
+ String of base address value.
+ **/
+ public void setBaseAddr(String baseAddr) {
+ this.baseAddr.setArg(" -baseaddr ", baseAddr);
+ }
+
+ /**
+ getDscFile
+
+ This function is to get class member "dscFile"
+
+ @return dscFile name of DSC file
+ **/
+ public String getDscFile() {
+ return this.dscFile.getValue();
+ }
+
+ /**
+ setDscFile
+
+ This function is to set class member "dscFile"
+
+ @param dscFile
+ name of DSC file
+ **/
+ public void setDscFile(String dscFile) {
+ this.dscFile.setArg(" -dsc ", dscFile);
+ }
+
+ /**
+ getFdImage
+
+ This function is to get class member "fdImage"
+
+ @return fdImage name of input FDI image file.
+ **/
+ public String getFdImage() {
+ return this.fdImage.getValue();
+ }
+
+ /**
+ setFdImage
+
+ This function is to set class member "fdImage"
+
+ @param fdImage
+ name of input FDI image file.
+ **/
+ public void setFdImage(String fdImage) {
+ this.fdImage.setArg(" -discover ", fdImage);
+ }
+
+ /**
+ getFlashDevice
+
+ This function is to get class member "flashDevice".
+
+ @return flashDevice name of flash device.
+ **/
+ public String getFlashDevice() {
+ return this.flashDevice.getValue();
+ }
+
+ /**
+ setFlashDevice
+
+ This function is to set class member "flashDevice"
+
+ @param flashDevice
+ name of flash device.
+ **/
+ public void setFlashDevice(String flashDevice) {
+ this.flashDevice.setArg(" -flashdevice ", flashDevice);
+ }
+
+ /**
+ getFlashDeviceImage
+
+ This function is to get class member "flashDeviceImage"
+
+ @return flashDeviceImage name of flash device image
+ **/
+ public String getFlashDeviceImage() {
+ return this.flashDeviceImage.getValue();
+ }
+
+ /**
+ setFlashDeviceImage
+
+ This function is to set class member "flashDeviceImage"
+
+ @param flashDeviceImage
+ name of flash device image
+ **/
+ public void setFlashDeviceImage(String flashDeviceImage) {
+ this.flashDeviceImage.setArg(" -flashdeviceimage ", flashDeviceImage);
+
+ }
+
+ /**
+ getHeaderFile
+
+ This function is to get class member "headerFile"
+
+ @return headerFile name of include file
+ **/
+ public String getHeaderFile() {
+ return this.headerFile.getValue();
+ }
+
+ /**
+ setHeaderFile
+
+ This function is to set class member "headerFile"
+
+ @param headerFile
+ name of include file
+ **/
+ public void setHeaderFile(String headerFile) {
+ this.headerFile.setArg(" -hfile ", headerFile);
+ }
+
+ /**
+ getImageOutFile
+
+ This function is to get class member "imageOutFile"
+
+ @return imageOutFile name of output image file
+ **/
+ public String getImageOutFile() {
+ return this.imageOutFile.getValue();
+ }
+
+ /**
+ setImageOutFile
+
+ This function is to set class member "ImageOutFile"
+
+ @param imageOutFile
+ name of output image file
+ **/
+ public void setImageOutFile(String imageOutFile) {
+ this.imageOutFile.setArg(" -imageout ", imageOutFile);
+ }
+
+ /**
+ getInStrFile
+
+ This function is to get class member "inStrFile"
+
+ @return inStrFile name of input file which used to replace symbol names.
+ **/
+ public String getInStrFile() {
+ return this.inStrFile;
+ }
+
+ /**
+ setInStrFile
+
+ This function is to set class member "inStrFile"
+
+ @param inStrFile
+ name of input file which used to replace symbol names.
+ **/
+ public void setInStrFile(String inStrFile) {
+ this.inStrFile = inStrFile;
+ }
+
+ /**
+ getMciFile
+
+ This function is to get class member "mciFile"
+
+ @return mciFile name of input microcode file
+ **/
+ public String getMciFile() {
+ return this.mciFile.getValue();
+ }
+
+ /**
+ setMciFile
+
+ This function is to set class member "mciFile"
+
+ @param mciFile
+ name of input microcode file
+ **/
+ public void setMciFile(String mciFile) {
+ this.mciFile.setArg(" -mci ", mciFile);
+ }
+
+ /**
+ getMcoFile
+
+ This function is to get class member "mcoFile"
+
+ @return mcoFile name of output binary microcode image
+ **/
+ public String getMcoFile() {
+ return this.mcoFile.getValue();
+ }
+
+ /**
+ setMcoFile
+
+ This function is to set class member "mcoFile"
+
+ @param mcoFile
+ name of output binary microcode image
+ **/
+ public void setMcoFile(String mcoFile) {
+ this.mcoFile.setArg(" -mco ", mcoFile);
+ }
+
+ /**
+ getOutStrFile
+
+ This function is to get class member "outStrFile"
+
+ @return outStrFile name of output string substitution file
+ **/
+ public String getOutStrFile() {
+ return this.outStrFile;
+ }
+
+ /**
+ setOutStrFile
+
+ This function is to set class member "outStrFile"
+
+ @param outStrFile
+ name of output string substitution file
+ **/
+ public void setOutStrFile(String outStrFile) {
+ this.outStrFile = outStrFile;
+ }
+
+ /**
+ getPadValue
+
+ This function is to get class member "padValue"
+
+ @return padValue string of byte value to use as padding
+ **/
+ public String getPadValue() {
+ return this.padValue.getValue();
+ }
+
+ /**
+ setPadValue
+
+ This function is to set class member "padValue"
+
+ @param padValue
+ string of byte value to use as padding
+ **/
+ public void setPadValue(String padValue) {
+ this.padValue.setArg(" -padvalue ", padValue);
+ }
+
+ /**
+ addMciFile
+
+ This function is to add Microcode binary file
+
+ @param mciFile
+ instance of input class
+ **/
+ public void addConfiguredMciFile(FileArg mciFile) {
+ this.mciFileArray.setPrefix(" -mcmerge ");
+ this.mciFileArray.insert(mciFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ //
+ // Dependency check
+ //
+ private boolean isUptodate() {
+ long srcTimeStamp = 0;
+ String srcName = "";
+ String dstName = "";
+ long timeStamp = 0;
+
+ if (!flashDefFile.isEmpty()) {
+ srcName = flashDefFile.getValue();
+ timeStamp = new File(srcName).lastModified();
+ if (timeStamp > srcTimeStamp) {
+ srcTimeStamp = timeStamp;
+ }
+ }
+
+ if (!mciFile.isEmpty()) {
+ srcName = mciFile.getValue();
+ timeStamp = new File(srcName).lastModified();
+ if (timeStamp > srcTimeStamp) {
+ srcTimeStamp = timeStamp;
+ }
+ }
+
+ if (!fdImage.isEmpty()) {
+ srcName = fdImage.getValue();
+ timeStamp = new File(srcName).lastModified();
+ if (timeStamp > srcTimeStamp) {
+ srcTimeStamp = timeStamp;
+ }
+ }
+
+ if (inStrFile.length() != 0) {
+ srcName = inStrFile;
+ timeStamp = new File(srcName).lastModified();
+ if (timeStamp > srcTimeStamp) {
+ srcTimeStamp = timeStamp;
+ }
+ }
+
+ if (!mciFileArray.isEmpty()) {
+ for (int i = 0; i < mciFileArray.nameList.size(); ++i) {
+ srcName += mciFileArray.nameList.get(i) + " ";
+ timeStamp = new File(mciFileArray.nameList.get(i)).lastModified();
+ if (timeStamp > srcTimeStamp) {
+ srcTimeStamp = timeStamp;
+ }
+ }
+ }
+
+ if (!headerFile.isEmpty()) {
+ dstName = headerFile.getValue();
+ File dstFile = new File(dstName);
+ if (!dstFile.isAbsolute()) {
+ dstName = outputDir + File.separator + dstName;
+ dstFile = new File(dstName);
+ }
+
+ if (srcTimeStamp > dstFile.lastModified()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ if (!imageOutFile.isEmpty()) {
+ dstName = imageOutFile.getValue();
+ File dstFile = new File(dstName);
+ if (!dstFile.isAbsolute()) {
+ dstName = outputDir + File.separator + dstName;
+ dstFile = new File(dstName);
+ }
+
+ if (srcTimeStamp > dstFile.lastModified()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");
+ return false;
+ }
+
+ //
+ // we need to check the time stamp of each FV file specified in fdf file
+ //
+ if (!isFdUptodate(dstName, getFvFiles(flashDefFile.getValue()))) {
+ return false;
+ }
+ }
+
+ if (!mcoFile.isEmpty()) {
+ dstName = mcoFile.getValue();
+ File dstFile = new File(dstName);
+ if (!dstFile.isAbsolute()) {
+ dstName = outputDir + File.separator + dstName;
+ dstFile = new File(dstName);
+ }
+
+ if (srcTimeStamp > dstFile.lastModified()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ if (!dscFile.isEmpty()) {
+ dstName = dscFile.getValue();
+ File dstFile = new File(dstName);
+ if (!dstFile.isAbsolute()) {
+ dstName = outputDir + File.separator + dstName;
+ dstFile = new File(dstName);
+ }
+
+ if (srcTimeStamp > dstFile.lastModified()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ if (!asmIncFile.isEmpty()) {
+ dstName = asmIncFile.getValue();
+ File dstFile = new File(dstName);
+ if (!dstFile.isAbsolute()) {
+ dstName = outputDir + File.separator + dstName;
+ dstFile = new File(dstName);
+ }
+
+ if (srcTimeStamp > dstFile.lastModified()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ if (outStrFile.length() != 0) {
+ dstName = outStrFile;
+ File dstFile = new File(dstName);
+ if (!dstFile.isAbsolute()) {
+ dstName = outputDir + File.separator + dstName;
+ dstFile = new File(dstName);
+ }
+
+ if (srcTimeStamp > dstFile.lastModified()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, srcName + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //
+ // Parse the flash definition file and find out the FV file names
+ //
+ private List<String> getFvFiles(String fdfFileName) {
+ File fdfFile = new File(fdfFileName);
+ int fileLength = (int)fdfFile.length();
+ char[] fdfContent = new char[fileLength];
+ List<String> fileList = new ArrayList<String>();
+
+ try {
+ FileReader reader = new FileReader(fdfFile);
+ BufferedReader in = new BufferedReader(reader);
+
+ in.read(fdfContent, 0, fileLength);
+ String str = new String(fdfContent);
+
+ //
+ // match the
+ // File {
+ // ...
+ // }
+ // block
+ //
+ Matcher matcher = fileBlock.matcher(str);
+ while (matcher.find()) {
+ String fileBlockContent = str.substring(matcher.start(1), matcher.end(1));
+ //
+ // match the definition like
+ // Name = "..."
+ //
+ Matcher nameMatcher = fileNameDef.matcher(fileBlockContent);
+ if (nameMatcher.find()) {
+ fileList.add(fileBlockContent.substring(nameMatcher.start(1), nameMatcher.end(1)));
+ }
+ }
+
+ in.close();
+ reader.close();
+ } catch (Exception ex) {
+ throw new BuildException(ex.getMessage());
+ }
+
+ return fileList;
+ }
+
+ private boolean isFdUptodate(String fdFile, List<String> fvFileList) {
+ String fvDir = ".";
+ File fd = new File(fdFile);
+
+ if (outputDir.equals(".")) {
+ if (!fd.isAbsolute()) {
+ //
+ // If we cannot get the absolute path of fd file, we caanot
+ // get its time stamp. Re-generate it always in such situation.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "Cannot retrieve the time stamp of " + fdFile);
+ return false;
+ }
+ fvDir = fd.getParent();
+ } else {
+ fvDir = outputDir;
+ if (!fd.isAbsolute()) {
+ fd = new File(fvDir + File.separator + fdFile);
+ }
+ }
+
+ long fdTimeStamp = fd.lastModified();
+ for (int i = 0; i < fvFileList.size(); ++i) {
+ File fv = new File(fvDir + File.separator + fvFileList.get(i));
+ if (fv.lastModified() > fdTimeStamp) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, fv.getPath() + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FwImageTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FwImageTask.java
new file mode 100644
index 0000000000..78d9cbeb18
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/FwImageTask.java
@@ -0,0 +1,198 @@
+/** @file
+ FwImageTask class.
+
+ FwImageTask is used to call FwImage.ext to generate the FwImage.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ FwImageTask class.
+
+ FwImageTask is used to call FwImage.ext to generate the FwImage.
+**/
+public class FwImageTask extends Task implements EfiDefine {
+ //
+ // fwimage tool name
+ //
+ private static String toolName = "FwImage";
+ //
+ // time&data
+ //
+ private ToolArg time = new ToolArg();
+ //
+ // input PE image
+ //
+ private FileArg peImage = new FileArg();
+ //
+ // output EFI image
+ //
+ private FileArg outImage = new FileArg();
+ //
+ // component type
+ //
+ private ToolArg componentType = new ToolArg();
+
+ /**
+ execute
+
+ FwimageTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ String argument = "" + time + componentType + peImage + outImage;
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, peImage.toFileList() + " => " + outImage.toFileList());
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "FwImage succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException("FwImage failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ setTime
+
+ This function is to set operation of class member "time".
+
+ @param time string of time
+ **/
+ public void setTime(String time) {
+ this.time.setArg(" -t ", time);
+ }
+
+ /**
+ getTime
+
+ This function is to get class member "time"
+ @return time string of time
+ **/
+ public String getTime() {
+ return this.time.getValue();
+ }
+
+ /**
+ getPeImage
+
+ This function is to get class member "peImage".
+ @return name of PE image
+ **/
+ public String getPeImage() {
+ return this.peImage.getValue();
+ }
+
+ /**
+ setPeImage
+
+ This function is to set class member "peImage"
+ @param peImage name of PE image
+ **/
+ public void setPeImage(String peImage) {
+ this.peImage.setArg(" ", peImage);
+ }
+
+ /**
+ getOutImage
+
+ This function is to get class member "outImage".
+ @return name of output EFI image
+ **/
+ public String getOutImage() {
+ return this.outImage.getValue();
+ }
+
+ /**
+ setOutImage
+
+ This function is to set class member "outImage".
+ @param outImage name of output EFI image
+ **/
+ public void setOutImage(String outImage) {
+ this.outImage.setArg(" ", outImage);
+ }
+
+ /**
+ getComponentType
+
+ This function is to get class member "componentType".
+
+ @return string of componentType
+ **/
+ public String getComponentType() {
+ return this.componentType.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "componentType".
+ @param componentType string of component type
+ **/
+ public void setComponentType(String componentType) {
+ this.componentType.setArg(" ", componentType);
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenAcpiTableTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenAcpiTableTask.java
new file mode 100644
index 0000000000..40d38f349f
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenAcpiTableTask.java
@@ -0,0 +1,194 @@
+/** @file
+ GenAcpiTable class.
+
+ GenAcpiTable is used to call GenAcpiTable.exe to generate ACPI Table image .
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ GenAcpiTable class.
+
+ GenAcpiTable is used to call GenAcpiTable.exe to generate ACPI Table image .
+**/
+public class GenAcpiTableTask extends Task implements EfiDefine {
+ //
+ // Tool name
+ //
+ private static String toolName = "GenAcpiTable";
+
+ //
+ // input file
+ //
+ private FileArg inputFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+ /**
+ execute
+
+ StripTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + inputFile + outputFile;
+
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, this.inputFile.toFileList() + " => "
+ + this.outputFile.toFileList());
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile".
+
+ @return string of input file name.
+ **/
+ public String getInputFile() {
+ return inputFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "inputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setInputFile(String inputFile) {
+ this.inputFile.setArg(" ", inputFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCRC32SectionTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCRC32SectionTask.java
new file mode 100644
index 0000000000..d9273acf7b
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCRC32SectionTask.java
@@ -0,0 +1,142 @@
+/** @file
+ GenCRC32SectionTask class.
+
+ GenCRC32SectionTask is to call GenCRC32Section.exe to generate crc32 section.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ GenCRC32SectionTask
+
+ GenCRC32SectionTask is to call GenCRC32Section.exe to generate crc32 section.
+
+**/
+public class GenCRC32SectionTask extends Task implements EfiDefine {
+ //
+ // Tool name
+ //
+ private static String toolName = "GenCRC32Section";
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+ //
+ // inputFile list
+ //
+ private InputFile inputFileList = new InputFile();
+
+ //
+ // Project
+ //
+ static private Project project;
+
+ /**
+ execute
+
+ GenCRC32SectionTask execute is to assemble tool command line & execute
+ tool command line
+
+ @throws BuildException
+ **/
+ public void execute() throws BuildException {
+
+ project = this.getOwningTarget().getProject();
+ ///
+ /// absolute path of efi tools
+ ///
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName ;
+ }
+ //
+ // assemble argument
+ //
+ String argument = "" + inputFileList.toStringWithSinglepPrefix(" -i ") + outputFile;
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this, Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, inputFileList.toFileList() + " => " + outputFile.toFileList());
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl){
+ //
+ // command execution success
+ //
+ EdkLog.log(this, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(revl));
+ // LAH Added This Line
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ addInputFile
+
+ This function is to add a inputFile element into list
+ @param inputFile : inputFile element
+ **/
+ public void addConfiguredInputfile(InputFile inputFile) {
+ inputFileList.insert(inputFile);
+ }
+
+ /**
+ get class member "outputFile"
+ @return name of output file
+ **/
+ public String getOutputFile() {
+ return this.outputFile.getValue();
+ }
+ /**
+ set class member "outputFile"
+ @param outputFile : outputFile parameter
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" -o ", outputFile);
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCapsuleHdrTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCapsuleHdrTask.java
new file mode 100644
index 0000000000..c5b74b5d7e
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenCapsuleHdrTask.java
@@ -0,0 +1,341 @@
+/** @file
+ GenCapsuleHdrTask class.
+
+ GenCapsuleHdrTask is used to call GenCapsuleHdr.exe to generate capsule.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ GenCapsuleHdrTask class.
+
+ GenCapsuleHdrTask is used to call GenCapsuleHdr.exe to generate capsule.
+**/
+public class GenCapsuleHdrTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private String toolName = "GenCapsuleHdr";
+
+ //
+ // script file
+ //
+ private FileArg scriptFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+ //
+ // Verbose flag
+ //
+ private ToolArg verbose = new ToolArg();
+
+ //
+ // Dump flag
+ //
+ private ToolArg dump = new ToolArg();
+
+ //
+ // Split size
+ //
+ private ToolArg size = new ToolArg();
+
+ //
+ // capsule into one image flag
+ //
+ private ToolArg joinFlag = new ToolArg();
+
+ //
+ // capsule file
+ //
+ private FileArg capsuleFile = new FileArg();
+
+
+ /**
+ execute
+
+ GenCapsuleHdrTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + this.verbose + this.dump + this.outputFile
+ + this.scriptFile + this.size + this.joinFlag + this.capsuleFile;
+
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, scriptFile.toFileList() + " => " +
+ outputFile.toFileList() + capsuleFile.toFileList());
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_ERROR, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "scriptFile".
+
+ @return string of input file name.
+ **/
+ public String getScriptFile() {
+ return this.scriptFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "inputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setScriptFile(String scriptFile) {
+ this.scriptFile.setArg(" -script ", scriptFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" -o ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ /**
+ getVerbose
+
+ This function is to get class member "verbose"
+
+ @return verbose the flag of verbose.
+ **/
+ public String getVerbose() {
+ return this.verbose.getValue();
+ }
+
+ /**
+ setVerbose
+
+ This function is to set class member "verbose"
+
+ @param verbose
+ True or False.
+ **/
+ public void setVerbose(boolean verbose) {
+ if (verbose) {
+ this.verbose.setArg(" -", "v");
+ }
+ }
+
+ /**
+ getDump
+
+ This function is to get class member "dump"
+
+ @return verbose the flag of dump.
+ **/
+ public String getDump() {
+ return dump.getValue();
+ }
+
+ /**
+ setDump
+
+ This function is to set class member "dump".
+
+ @param dump
+ True or False.
+ **/
+ public void setDump(boolean dump) {
+ if (dump) {
+ this.dump.setArg(" -", "dump");
+ }
+ }
+
+ /**
+ getSize
+
+ This function is to set class member "size".
+
+ @return size string of size value
+ **/
+ public String getSize() {
+ return size.getValue();
+ }
+
+ /**
+ setSize
+
+ This function is to set class member "size".
+
+ @param size string of size value.
+ **/
+ public void setSize(String size) {
+ this.size.setArg(" -split ", size);
+ }
+
+ /**
+ getCapsuleFile
+
+ This function is to get class member "capsuleFile"
+
+ @return capsuleFile capsule file name
+ **/
+ public String getCapsuleFile() {
+ return capsuleFile.getValue();
+ }
+
+ /**
+ setCapsuleFile
+
+ This function is to set class member "capsuleFile"
+
+ @param capsuleFile capsule file name
+ **/
+ public void setCapsuleFile(String capsuleFile) {
+ this.capsuleFile.setArg(" ", capsuleFile);
+ }
+
+ /**
+ isJoinFlag
+
+ This function is to get class member "joinFlag"
+
+ @return joinFlag flag of if need to join split capsule images into
+ a single image.
+ **/
+ public String getJoinFlag() {
+ return joinFlag.getValue();
+ }
+
+ /**
+ setJoinFlag
+
+ This function is to set class member "joinFlag"
+
+ @param joinFlag flag of if need to join split capsule images into
+ a single image.
+ **/
+ public void setJoinFlag(boolean joinFlag) {
+ if (joinFlag){
+ this.joinFlag.setArg(" -", "j");
+ }
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenDepexTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenDepexTask.java
new file mode 100644
index 0000000000..0e0ad9cc2f
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenDepexTask.java
@@ -0,0 +1,167 @@
+/** @file
+ GenDepexTask class.
+
+ GenDepexTask is to call GenDepex.exe to generate depex section.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ GenDepexTask
+
+ GenDepexTask is to call GenDepex.exe to generate depex section.
+
+**/
+public class GenDepexTask extends Task implements EfiDefine {
+ private static String toolName = "GenDepex";
+ //
+ // output binary dependency files name
+ //
+ private FileArg outputFile = new FileArg();
+ //
+ // input pre-processed dependency text files name
+ //
+ private FileArg inputFile = new FileArg();
+ //
+ // padding integer value
+ //
+ private ToolArg padding = new FileArg();
+ /**
+ execute
+
+ GenDepexTask execute is to assemble tool command line & execute tool
+ command line.
+ */
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of edk tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of GenDepex tool
+ //
+ String argument = "" + inputFile + outputFile + padding;
+ //
+ // reture value of GenDepex execution
+ //
+ int returnVal = -1;
+
+ try {
+ Commandline commandLine = new Commandline();
+ commandLine.setExecutable(command);
+ commandLine.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+
+ Execute runner = new Execute(streamHandler, null);
+ runner.setAntRun(project);
+ runner.setCommandline(commandLine.getCommandline());
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(commandLine.getCommandline()));
+ EdkLog.log(this, inputFile.toFileList() + " => " + outputFile.toFileList());
+
+ returnVal = runner.execute();
+ if (EFI_SUCCESS == returnVal) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "GenDepex succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(returnVal));
+ throw new BuildException("GenDepex failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+ @param outputFileName name of output file
+ **/
+ public void setOutputFile(String outputFileName) {
+ this.outputFile.setArg(" -O ", outputFileName);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile".
+
+ @return name of ouput file
+ **/
+ public String getOutputFile() {
+ return this.outputFile.getValue();
+ }
+
+ /**
+ setInputFile
+
+ This function is to set class member "inputFile".
+ @param inputFileName name of inputFile
+ **/
+ public void setInputFile(String inputFileName) {
+ this.inputFile.setArg(" -I ", inputFileName);
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile"
+ @return name of input file
+ **/
+ public String getInputFile() {
+ return this.inputFile.getValue();
+ }
+
+ /**
+ setPadding
+
+ This function is to set class member "padding"
+ @param paddingNum padding value
+ **/
+ public void setPadding(String paddingNum) {
+ this.padding.setArg(" -P ", paddingNum);
+ }
+
+ /**
+ getPadding
+
+ This function is to get class member "padding"
+ @return value of padding
+ **/
+ public String getPadding() {
+ return this.padding.getValue();
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFfsFileTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFfsFileTask.java
new file mode 100644
index 0000000000..4cbbfab8c6
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFfsFileTask.java
@@ -0,0 +1,961 @@
+/** @file
+ GenFfsFileTask class.
+
+ GenFfsFileTaks is to generate ffs file.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ GenFfsFileTask
+
+ GenFfsFileTaks is to generate ffs file.
+
+**/
+public class GenFfsFileTask extends Task implements EfiDefine, FfsTypes {
+ /**
+ * GenFfsFile Task Class
+ * class member
+ * -baseName : module baseName
+ * -ffsFileGuid : module Guid.
+ * -ffsFileType : Ffs file type.
+ * -ffsAttributeRecovery : The file is required for recovery.
+ * -ffsAligment : The file data alignment (0 if none required). See FFS
+ * specification for supported alignments (0-7 are only possible
+ * values). *
+ * -ffsAttributeCheckSum : The file data is checksummed. If this is FALSE a
+ * value of 0x5A will be inserted in the file
+ * checksum field of the file header. *
+ * -sectFileDir : specifies the full path to the component build directory.
+ * Required.
+ * -ffsAttrib : Data recorde attribute added result.
+ * -sectionList : List recorded all section elemet in task.
+ */
+ ///
+ /// module baseName
+ ///
+ String baseName = "";
+ ///
+ ///
+ ///
+ String moduleType;
+ ///
+ /// module Guid
+ ///
+ String ffsFileGuid = "";
+ ///
+ /// Ffs file type
+ ///
+ String ffsFileType = "";
+ ///
+ /// ffsAttribHeaderExtension value is used to set the corresponding bit in
+ /// the output FFS file header
+ ///
+ boolean ffsAttribHeaderExtension = false;
+ ///
+ /// ffsAttribTailPresent value is used to set the corresponding bit in the
+ /// output FFS file header
+ ///
+ boolean ffsAttribTailPresent = false;
+ ///
+ /// ffsAttribRecovery value is used to set the corresponding bit in the
+ /// output FFS file header
+ ///
+ boolean ffsAttribRecovery = false;
+ ///
+ /// ffsAttribDataAlignment value is used to set the corresponding bit in the output
+ /// FFS file header.The specified FFS alignment must be a value between 0
+ /// and 7 inclusive
+ ///
+ int ffsAttribDataAlignment = 0;
+ ///
+ /// ffsAttribChecksum value is used to set the corresponding bit in the
+ /// output FFS file header
+ ///
+ boolean FfsAttribChecksum = false;
+ ///
+ /// Attribute is used to record the sum of all bit in the output FFS file.
+ ///
+ byte attributes = 0;
+ ///
+ /// The output directory of ffs file.
+ ///
+ String outputDir = "";
+ ///
+ /// List of section.
+ ///
+ List<Object> sectionList = new ArrayList<Object>();
+
+ ///
+ /// The path of Framewor_Tools_Paht.
+ ///
+ static String path = "";
+
+ ///
+ /// Gensection
+ ///
+ List<GenSectionTask> genSectList = new ArrayList<GenSectionTask>();
+
+ /**
+ execute
+
+ GenFfsFileTask execute is to generate ffs file according to input section
+ dscriptive information.
+ **/
+ public void execute() throws BuildException {
+
+ String ffsSuffix = "";
+ String outputPath = "";
+
+ //
+ // Get Fraemwork_Tools_Path
+ //
+ Project pj = this.getOwningTarget().getProject();
+ path = pj.getProperty("env.FRAMEWORK_TOOLS_PATH");
+
+ //
+ // Check does the BaseName, Guid, FileType set value.
+ //
+ if (this.baseName.equals("")) {
+ throw new BuildException ("Must set OutputFileBasename!\n");
+ }
+
+ if (this.ffsFileGuid.equals("")) {
+ throw new BuildException ("Must set ffsFileGuid!\n");
+ }
+
+ if (this.ffsFileType.equals("")) {
+ throw new BuildException ("Must set ffsFileType!\n");
+ }
+ //
+ // Create ffs file. File name = FfsFileGuid + BaseName + ffsSuffix.
+ // If outputDir's value was set, file will output to the outputDir.
+ //
+ ffsSuffix = TypeToSuffix (this.moduleType);
+ if (!this.outputDir.equals("")) {
+ String temp;
+ outputPath = this.outputDir;
+ temp = outputPath.replace('\\', File.separatorChar);
+ outputPath = temp.replace('/', File.separatorChar);
+ if (outputPath.charAt(outputPath.length()-1) != File.separatorChar) {
+ outputPath = outputPath + File.separator;
+ }
+
+ }
+
+ String ffsFilePath = outputPath + this.ffsFileGuid + '-' + this.baseName + ffsSuffix;
+ File ffsFile = new File (ffsFilePath);
+ try{
+ genFfs(ffsFile);
+ }catch (BuildException e){
+ if (ffsFile != null && ffsFile.exists()){
+ ffsFile.deleteOnExit();
+ }
+ throw new BuildException(e.getMessage());
+
+ }
+
+ }
+
+ /**
+ addCompress
+
+ This function is to add compress section to section list.
+ @param compress Section of compress
+ **/
+ public void addCompress(CompressSection compress) {
+ this.sectionList.add(compress);
+ }
+
+ /**
+ addTool
+
+ This function is to add tool section to section list.
+ @param tool Section of tool
+ **/
+ public void addTool(Tool tool) {
+ this.sectionList.add(tool);
+ }
+
+ /**
+ addSectionFile
+
+ This function is to add sectFile section to section list.
+ @param sectFile Section of sectFile.
+ **/
+ public void addSectFile (SectFile sectFile) {
+ this.sectionList.add(sectFile);
+ }
+
+ /**
+ getBaseName
+
+ This function is to get basename
+
+ @return String of base name
+ **/
+ public String getBaseName() {
+ return this.baseName;
+ }
+
+ /**
+ setBaseName
+
+ This function is to set base name.
+ @param baseName
+ **/
+ public void setBaseName(String baseName) {
+ this.baseName = baseName.trim();
+ }
+
+ /**
+ getFfsAligment
+
+ This function is to get the ffsAligment
+ @return The value of ffsAligment.
+ **/
+ public int getFfsAttribDataAlignment() {
+ return this.ffsAttribDataAlignment;
+ }
+
+ /**
+ setFfsAligment
+
+ This function is to set ffsAligment
+ @param ffsAligment The value of ffsAligment.
+ **/
+ public void setFfsAttribDataAlignment(String ffsAligment) {
+ this.ffsAttribDataAlignment = stringToInt(ffsAligment.replaceAll(" ", "").toLowerCase());
+ if (this.ffsAttribDataAlignment < 0 || this.ffsAttribDataAlignment > 7) {
+ throw new BuildException ("FFS_ATTRIB_DATA_ALIGMENT must be an integer value from 0 through 7, inclusive");
+ } else {
+ attributes |= (((byte)this.ffsAttribDataAlignment) << 3);
+ }
+ }
+
+ /**
+ getFfsAttribCheckSum
+
+ This function is to get ffsAttribCheckSum
+
+ @return Value of ffsAttribChecksum
+ **/
+ public boolean getFfsAttribChecksum() {
+ return this.FfsAttribChecksum;
+ }
+
+ /**
+ setFfsAttribChecksum
+
+ This function is to set ffsAttribChecksum
+ @param ffsAttributeCheckSum Value of ffsAttribCheckSum
+ **/
+ public void setFfsAttribChecksum(boolean ffsAttributeCheckSum) {
+ this.FfsAttribChecksum = ffsAttributeCheckSum;
+ if (ffsAttributeCheckSum) {
+ attributes |= FFS_ATTRIB_CHECKSUM;
+ }
+ }
+
+ /**
+ getFfsAttribRecovery
+
+ This function is to get ffsAttribRecovery
+ @return Value of ffsAttribRecovery
+ **/
+ public boolean getFfsAttribRecovery() {
+ return this.ffsAttribRecovery;
+ }
+
+ /**
+ setRecovery
+
+ This function is to set ffsAttributeRecovery
+
+ @param ffsAttributeRecovery Value of ffsAttributeRecovery
+ **/
+ public void setRecovery(boolean ffsAttributeRecovery) {
+ this.ffsAttribRecovery = ffsAttributeRecovery;
+ if (ffsAttributeRecovery) {
+ attributes |= FFS_ATTRIB_RECOVERY;
+ }
+ }
+
+ /**
+ getFileGuid
+
+ This function is to get fileGuid
+ @return Guid
+ **/
+ public String getFileGuid() {
+ return this.ffsFileGuid;
+ }
+
+ /**
+ setFileGuid
+
+ This function is to set fileGuid
+ @param ffsFileGuid String of GUID
+ **/
+ public void setFileGuid(String ffsFileGuid) {
+ this.ffsFileGuid = ffsFileGuid.trim();
+ }
+
+ /**
+ getFfsFileType
+
+ This function is to get ffsFileType.
+
+ @return value of ffsFileType
+ **/
+ public String getFfsFileType() {
+ return this.ffsFileType;
+ }
+
+ /**
+ setFfsFileType
+
+ This function is to set ffsFileType.
+
+ @param ffsFileType
+ **/
+ public void setFfsFileType(String ffsFileType) {
+ this.ffsFileType = ffsFileType.trim();
+ }
+
+ /**
+ ffsAttribHeaderExtension
+
+ This function is to get ffsAttribHeaderExtension
+
+ @return Value of ffsAttribHeaderExtension
+ **/
+ public boolean isFfsAttribHeaderExtension() {
+ return this.ffsAttribHeaderExtension;
+ }
+
+ /**
+ setHeaderExension
+
+ This function is to set headerExtension
+ @param headerExtension Value of headerExension
+ **/
+ public void setHeaderExtension(boolean headerExtension) {
+ this.ffsAttribHeaderExtension = headerExtension;
+ if (headerExtension) {
+ attributes |= FFS_ATTRIB_HEADER_EXTENSION;
+ }
+ }
+
+ /**
+ isFfsAttribTailPresent
+
+ This function is to get ffsAttribTailPresent value.
+ @return Value of ffsAttribTailPresent.
+ **/
+ public boolean isFfsAttribTailPresent() {
+ return this.ffsAttribTailPresent;
+ }
+
+ /**
+ setFfsAttribTailPresent
+
+ This function is to set ffsAttribTailPresent.
+ @param tailPresent Value of ffsAttribTailPresent.
+ **/
+ public void setFfsAttribTailPresent(boolean tailPresent) {
+ this.ffsAttribTailPresent = tailPresent;
+ if (tailPresent) {
+ attributes |= FFS_ATTRIB_TAIL_PRESENT;
+ }
+ }
+
+
+ /**
+ stringToGuid
+
+ This function is to convert string to GUID.
+ * @param GuidStr String of GUID.
+ * @param Guid GUID form.
+ */
+ private void stringToGuid (String GuidStr, FfsHeader.FfsGuid Guid){
+
+ int i = 0;
+ int j = 0;
+ int k = 0;
+ char [] charArry;
+ String [] SplitStr;
+
+ byte[] buffer = new byte[16];
+ if (GuidStr.length()!=36) {
+ throw new BuildException ("The GUID length [" + GuidStr.length() + "] is not correct!");
+ }
+
+
+ SplitStr = GuidStr.split("-");
+ if (SplitStr.length != 5) {
+ throw new BuildException ("The GUID format is not correct!");
+ }
+
+
+
+ for (i= 0; i < SplitStr.length; i++) {
+ String str = SplitStr[i];
+ charArry = str.toCharArray();
+
+ for (j =0; j < (str.toCharArray().length)/2; j++) {
+
+ buffer[k] = hexCharToByte (charArry[j*2]);
+ buffer[k] = (byte)( buffer[k]& 0x0f);
+ buffer[k] = (byte)((buffer[k]<< 4));
+ buffer[k] = (byte)( buffer[k]& 0xf0);
+ buffer[k] = (byte)( buffer[k]|hexCharToByte(charArry[j*2+1]));
+ k++;
+ }
+ }
+ Guid.bufferToStruct(buffer);
+ }
+
+ /**
+ typeToSuffix
+
+ This function is to get suffix of ffs file according to ffsFileType.
+
+ @param ffsFileType ffsFileType
+ @return The suffix of ffs file
+ **/
+ private String TypeToSuffix (String ffsFileType){
+ String[][] suffix = { { "BASE", ".FFS"},
+ { "SEC", ".SEC" }, { "PEI_CORE", ".PEI" },
+ { "PEIM", ".PEI" }, { "DXE_CORE", ".DXE" },
+ { "DXE_DRIVER", ".DXE" }, { "DXE_RUNTIME_DRIVER", ".DXE" },
+ { "DXE_SAL_DRIVER", ".DXE" }, { "DXE_SMM_DRIVER", ".DXE" },
+ { "TOOL", ".FFS" }, { "UEFI_DRIVER", ".DXE" },
+ { "UEFI_APPLICATION", ".APP" }, { "USER_DEFINED", ".FFS" } };
+
+ for (int i = 0; i < suffix.length; i++) {
+ if (suffix[i][0].equalsIgnoreCase(moduleType)) {
+ return suffix[i][1];
+ }
+ }
+
+ return ".FFS";
+ }
+
+
+ /**
+ stringToType
+
+ This function is to get ffsFileType integer value according to ffsFileType.
+ @param ffsFileType String value of ffsFileType
+ @return Integer value of ffsFileType.
+ **/
+ private byte stringToType (String ffsFileType){
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_ALL")) {
+ return(byte)EFI_FV_FILETYPE_ALL;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_RAW")) {
+ return(byte)EFI_FV_FILETYPE_RAW;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_FREEFORM")) {
+ return(byte)EFI_FV_FILETYPE_FREEFORM;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_SECURITY_CORE")) {
+ return(byte)EFI_FV_FILETYPE_SECURITY_CORE;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_PEI_CORE")) {
+ return(byte) EFI_FV_FILETYPE_PEI_CORE;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_DXE_CORE")) {
+ return(byte)EFI_FV_FILETYPE_DXE_CORE;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_PEIM")) {
+ return(byte)EFI_FV_FILETYPE_PEIM;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_DRIVER")) {
+ return(byte) EFI_FV_FILETYPE_DRIVER;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER")) {
+ return(byte)EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_APPLICATION")) {
+ return(byte)EFI_FV_FILETYPE_APPLICATION;
+ }
+
+ if (ffsFileType.equals("EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE")) {
+ return(byte)EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE;
+ }
+ if (ffsFileType.equals("EFI_FV_FILETYPE_FFS_PAD")) {
+ return(byte) EFI_FV_FILETYPE_FFS_PAD;
+ }
+
+ return -1;
+ }
+
+
+
+ /**
+ calculateCheckSum8
+
+ This function is to calculate the value needed for a valid UINT8 checksum
+ @param buffer Byte buffer containing byte data of component.
+ @param size Size of the buffer.
+ @return The 8 bit checksum value needed.
+ **/
+ private byte calculateChecksum8 (byte[] buffer, int size){
+ return(byte) (0x100 - calculateSum8 (buffer, size));
+ }
+
+
+ /**
+ calculateSum8
+
+ This function is to calculate the UINT8 sum for the requested region.
+ @param buffer Byte buffer containing byte data of component
+ @param size Size of the buffer.
+ @return The 8 bit checksum value needed.
+ **/
+ private short calculateSum8 (byte[] buffer, int size){
+ int Index;
+ byte Sum;
+ Sum = 0;
+
+ //
+ // Perform the word sum for buffer
+ //
+ for (Index = 0; Index < size; Index++) {
+ Sum = (byte) (Sum + buffer[Index]);
+ }
+
+ return(byte) Sum;
+ }
+
+ /**
+ hexCharToByte
+
+ This function is to convert hex character to byte
+
+ @param hexChar hex character
+ @return Byte which corresponding to the character.
+ **/
+ private byte hexCharToByte (char hexChar){
+ switch (hexChar) {
+ case '0':
+ return(byte)0x00;
+ case '1':
+ return(byte)0x01;
+ case '2':
+ return(byte)0x02;
+ case '3':
+ return(byte)0x03;
+ case '4':
+ return(byte)0x04;
+ case '5':
+ return(byte)0x05;
+ case '6':
+ return(byte)0x06;
+ case '7':
+ return(byte)0x07;
+ case '8':
+ return(byte)0x08;
+ case '9':
+ return(byte)0x09;
+ case 'a':
+ case 'A':
+ return(byte)0x0a;
+ case 'b':
+ case 'B':
+ return(byte)0x0b;
+ case 'c':
+ case 'C':
+ return(byte)0x0c;
+
+ case 'd':
+ case 'D':
+ return(byte)0x0d;
+
+ case 'e':
+ case 'E':
+ return(byte)0x0e;
+ case 'f':
+ case 'F':
+ return(byte)0x0f;
+
+ default:
+ return(byte)0xff;
+ }
+ }
+
+ /**
+ adjustFileSize
+
+ This function is used to adjusts file size to insure sectioned file is exactly the right length such
+ that it ends on exactly the last byte of the last section. ProcessScript()
+ may have padded beyond the end of the last section out to a 4 byte boundary.
+ This padding is stripped.
+
+ @param buffer Byte buffer contains a section stream
+ @return Corrected size of file.
+ **/
+ private int adjustFileSize (byte[] buffer){
+
+ int orignalLen = buffer.length;
+ int adjustLen = 0;
+ int sectionPoint = 0;
+ int nextSectionPoint = 0;
+ int sectionLen = 0;
+ int totalLen = 0;
+ int firstSectionHeader = 0;
+
+
+ firstSectionHeader = buffer[0]& 0xff;
+ firstSectionHeader = ((buffer[1]&0xff)<<8) | firstSectionHeader;
+ firstSectionHeader = ((buffer[2]&0xff)<<16)| firstSectionHeader;
+
+
+ while (sectionPoint < buffer.length) {
+ sectionLen = buffer[0 + sectionPoint]& 0xff;
+ sectionLen = ((buffer[1 + sectionPoint]&0xff)<<8)| sectionLen;
+ sectionLen = ((buffer[2 + sectionPoint]&0xff)<<16)| sectionLen;
+ totalLen = totalLen + sectionLen;
+
+ if (totalLen == orignalLen) {
+ return totalLen;
+ }
+
+ sectionPoint = sectionPoint + sectionLen;
+ adjustLen = sectionPoint;
+
+ nextSectionPoint = (sectionPoint + 0x03) & (~0x03);
+ totalLen = totalLen + nextSectionPoint - sectionLen;
+ sectionPoint = nextSectionPoint;
+ }
+ return adjustLen;
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get output directory.
+
+ @return Path of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set output directory.
+
+ @param outputDir The output direcotry.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ /**
+ getModuleTyp
+
+ This function is to get string of module type.
+
+ @return moduleType The string of module type.
+ **/
+ public String getModuleType() {
+ return this.moduleType;
+ }
+
+ /**
+ setModuleType
+
+ This function is to set moduleType.
+
+ @param moduleType The string of module type.
+ **/
+ public void setModuleType(String moduleType) {
+ this.moduleType = moduleType;
+ }
+
+ /**
+ Convert a string to a integer.
+
+ @param intString The string representing a integer
+
+ @retval int The value of integer represented by the
+ given string; -1 is returned if the format
+ of the string is wrong.
+ **/
+ private int stringToInt(String intString) {
+ int value;
+ int hexPrefixPos = intString.indexOf("0x");
+ int radix = 10;
+ String intStringNoPrefix;
+
+ if (hexPrefixPos >= 0) {
+ radix = 16;
+ intStringNoPrefix = intString.substring(hexPrefixPos + 2, intString.length());
+ } else {
+ intStringNoPrefix = intString;
+ }
+
+ try {
+ value = Integer.parseInt(intStringNoPrefix, radix);
+ } catch (NumberFormatException e) {
+ log("Incorrect format of int [" + intString + "]. -1 is assumed");
+ return -1;
+ }
+
+ return value;
+ }
+
+ /**
+ genFfs
+
+ This function is to generate FFS file.
+
+ @param ffsFile Name of FFS file.
+ @param isOrg Flag to indicate generate ORG ffs file or not.
+ **/
+ private void genFfs(File ffsFile) throws BuildException {
+ Section sect;
+ int fileSize;
+ int fileDataSize;
+ FfsHeader ffsHeader = new FfsHeader();
+ FfsHeader orgFfsHeader = new FfsHeader();
+
+ EdkLog.log(this, EdkLog.EDK_INFO, ffsFile.getName());
+
+ try {
+ //
+ // Create file output stream -- dataBuffer.
+ //
+ FileOutputStream dataFs = new FileOutputStream (ffsFile.getAbsolutePath());
+ DataOutputStream dataBuffer = new DataOutputStream (dataFs);
+
+ //
+ // Search SectionList find earch section and call it's
+ // ToBuffer function.
+ //
+ Iterator sectionIter = this.sectionList.iterator();
+ while (sectionIter.hasNext()) {
+ sect = (Section)sectionIter.next();
+
+ try {
+ //
+ // The last section don't need 4 byte ffsAligment.
+ //
+ sect.toBuffer((DataOutputStream)dataBuffer);
+ } catch (Exception e) {
+ if (dataBuffer != null){
+ dataBuffer.close();
+ }
+ throw new BuildException (e.getMessage());
+ }
+ }
+ dataBuffer.close();
+ } catch (Exception e) {
+ throw new BuildException (e.getMessage());
+ }
+
+ //
+ // Creat Ffs file header
+ //
+ try {
+
+ //
+ // create input stream to read file data
+ //
+ byte[] fileBuffer = new byte[(int)ffsFile.length()];
+ FileInputStream fi = new FileInputStream (ffsFile.getAbsolutePath());
+ DataInputStream di = new DataInputStream (fi);
+ di.read(fileBuffer);
+ di.close();
+
+ //
+ // Add GUID to header struct
+ //
+ if (this.ffsFileGuid != null) {
+ stringToGuid (this.ffsFileGuid, ffsHeader.name);
+ }
+
+ ffsHeader.ffsAttributes = this.attributes;
+ if ((ffsHeader.fileType = stringToType(this.ffsFileType))== -1) {
+ throw new BuildException ("FFS_FILE_TYPE unknow!\n");
+ }
+
+ //
+ // Copy ffsHeader.ffsAttribute and fileType to orgFfsHeader.ffsAttribute
+ // and fileType
+ //
+ orgFfsHeader.ffsAttributes = ffsHeader.ffsAttributes;
+ orgFfsHeader.fileType = ffsHeader.fileType;
+
+ //
+ // Adjust file size. The function is used to tripe the last
+ // section padding of 4 binary boundary.
+ //
+ //
+ if (ffsHeader.fileType != EFI_FV_FILETYPE_RAW) {
+
+ fileDataSize = adjustFileSize (fileBuffer);
+ } else {
+ fileDataSize = fileBuffer.length;
+ }
+
+ //
+ // 1. add header size to file size
+ //
+ fileSize = fileDataSize + ffsHeader.getSize();
+
+ if ((ffsHeader.ffsAttributes & FFS_ATTRIB_TAIL_PRESENT) != 0) {
+ if (ffsHeader.fileType == EFI_FV_FILETYPE_FFS_PAD) {
+
+ throw new BuildException (
+ "FFS_ATTRIB_TAIL_PRESENT=TRUE is " +
+ "invalid for PAD files"
+ );
+ }
+ if (fileSize == ffsHeader.getSize()) {
+ throw new BuildException (
+ "FFS_ATTRIB_TAIL_PRESENT=TRUE is " +
+ "invalid for 0-length files"
+ );
+ }
+ fileSize = fileSize + 2;
+ }
+
+ //
+ // 2. set file size to header struct
+ //
+ ffsHeader.ffsFileSize[0] = (byte)(fileSize & 0x00FF);
+ ffsHeader.ffsFileSize[1] = (byte)((fileSize & 0x00FF00)>>8);
+ ffsHeader.ffsFileSize[2] = (byte)(((int)fileSize & 0xFF0000)>>16);
+
+ //
+ // Fill in checksums and state, these must be zero for checksumming
+ //
+ ffsHeader.integrityCheck.header = calculateChecksum8 (
+ ffsHeader.structToBuffer(),
+ ffsHeader.getSize()
+ );
+
+ if ((this.attributes & FFS_ATTRIB_CHECKSUM) != 0) {
+ if ((this.attributes & FFS_ATTRIB_TAIL_PRESENT) != 0) {
+ ffsHeader.integrityCheck.file = calculateChecksum8 (
+ fileBuffer,
+ fileDataSize
+ );
+ } else {
+ ffsHeader.integrityCheck.file = calculateChecksum8 (
+ fileBuffer,
+ fileDataSize
+ );
+ }
+ } else {
+ ffsHeader.integrityCheck.file = FFS_FIXED_CHECKSUM;
+ orgFfsHeader.integrityCheck.file = FFS_FIXED_CHECKSUM;
+ }
+
+ //
+ // Set the state now. Spec says the checksum assumes the state is 0.
+ //
+ ffsHeader.ffsState = EFI_FILE_HEADER_CONSTRUCTION |
+ EFI_FILE_HEADER_VALID |
+ EFI_FILE_DATA_VALID;
+
+ //
+ // create output stream to first write header data in file, then write sect data in file.
+ //
+ FileOutputStream headerFfs = new FileOutputStream (ffsFile.getAbsolutePath());
+ DataOutputStream ffsBuffer = new DataOutputStream (headerFfs);
+
+ //
+ // Add header struct and file data to FFS file
+ //
+ ffsBuffer.write(ffsHeader.structToBuffer());
+ ffsBuffer.write(fileBuffer, 0, fileDataSize);
+
+
+
+ //
+ // If there is a tail, then set it
+ //
+ if ((this.attributes & FFS_ATTRIB_TAIL_PRESENT) != 0) {
+ short tailValue ;
+ byte [] tailByte = new byte[2];
+
+ //
+ // reverse tailvalue , integritycheck.file as hight byte, and
+ // integritycheck.header as low byte.
+ //
+ tailValue = (short)(ffsHeader.integrityCheck.header & 0xff);
+ tailValue = (short)((tailValue) | ((ffsHeader.integrityCheck.file << 8) & 0xff00));
+ tailValue = (short)~tailValue;
+
+ //
+ // Change short to byte[2]
+ //
+ tailByte[0] = (byte)(tailValue & 0xff);
+ tailByte[1] = (byte)((tailValue & 0xff00)>>8);
+ ffsBuffer.write(tailByte[0]);
+ ffsBuffer.write(tailByte[1]);
+
+ }
+
+ //
+ // close output stream. Note if don't close output stream
+ // the buffer can't be rewritten to file.
+ //
+ ffsBuffer.close();
+ } catch (Exception e) {
+ log("genffsfile failed!");
+ throw new BuildException (e.getMessage());
+ }
+
+ }
+
+ /**
+ addGenSection
+
+ This function is to add gensection instance to list
+
+ @param task Instance of GenSectionTask
+ **/
+ public void addGenSection (GenSectionTask task){
+ this.sectionList.add(task);
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFvImageTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFvImageTask.java
new file mode 100644
index 0000000000..0f25032f7f
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenFvImageTask.java
@@ -0,0 +1,274 @@
+/** @file
+ GenFvImageTask class.
+
+ GenFvImageTask is to call GenFvImage.exe to generate FvImage.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import java.io.File;
+import java.util.LinkedList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.List;
+import java.util.Iterator;
+import java.io.BufferedReader;
+import java.io.FileReader;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ GenFvImageTask
+
+ GenFvImageTask is to call GenFvImage.exe to generate the FvImage.
+
+**/
+public class GenFvImageTask extends Task implements EfiDefine{
+ //
+ // tool name
+ //
+ static final private String toolName = "GenFvImage";
+ //
+ // Pattern to match the section header (e.g. [options], [files])
+ //
+ static final private Pattern sectionHeader = Pattern.compile("\\[([^\\[\\]]+)\\]");
+ //
+ // The name of input inf file
+ //
+ private FileArg infFile = new FileArg();
+ //
+ // Output directory
+ //
+ private String outputDir = ".";
+
+ /**
+ execute
+
+ GenFvImageTask execute is to assemble tool command line & execute tool
+ command line.
+ **/
+ public void execute() throws BuildException {
+ Project project = this.getOwningTarget().getProject();
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+
+ if (isUptodate()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, infFile.toFileList() + " is uptodate!");
+ return;
+ }
+
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+
+ String argument = "" + infFile;
+ //
+ // lauch the program
+ //
+ int exitCode = 0;
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+ //
+ // log command line string.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, infFile.toFileList());
+
+ exitCode = runner.execute();
+ if (exitCode != 0) {
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(exitCode));
+ } else {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "GenFvImage succeeded!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ } finally {
+ if (exitCode != 0) {
+ throw new BuildException("GenFvImage: failed to generate FV file!");
+ }
+ }
+ }
+ /**
+ getInfFile
+
+ This function is to get class member of infFile
+ @return String name of infFile
+ **/
+ public String getInfFile() {
+ return infFile.getValue();
+ }
+
+ /**
+ setInfFile
+
+ This function is to set class member of infFile.
+
+ @param infFile name of infFile
+ **/
+ public void setInfFile(String infFile) {
+ this.infFile.setArg(" -I ", infFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get output directory.
+
+ @return Path of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set output directory.
+
+ @param outputDir The output direcotry.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ //
+ // dependency check
+ //
+ private boolean isUptodate() {
+ String infName = this.infFile.getValue();
+ String fvName = "";
+ List<String> ffsFiles = new LinkedList<String>();
+ File inf = new File(infName);
+
+ try {
+ FileReader reader = new FileReader(inf);
+ BufferedReader in = new BufferedReader(reader);
+ String str;
+
+ //
+ // Read the inf file line by line
+ //
+ boolean inFiles = false;
+ boolean inOptions = false;
+ while ((str = in.readLine()) != null) {
+ str = str.trim();
+ if (str.length() == 0) {
+ continue;
+ }
+
+ Matcher matcher = sectionHeader.matcher(str);
+ if (matcher.find()) {
+ //
+ // We take care of only "options" and "files" section
+ //
+ String sectionName = str.substring(matcher.start(1), matcher.end(1));
+ if (sectionName.equalsIgnoreCase("options")) {
+ inOptions = true;
+ inFiles = false;
+ } else if (sectionName.equalsIgnoreCase("files")) {
+ inFiles = true;
+ inOptions = false;
+ } else {
+ inFiles = false;
+ inOptions = false;
+ }
+ continue;
+ }
+
+ //
+ // skip invalid line
+ //
+ int equalMarkPos = str.indexOf("=");
+ if (equalMarkPos < 0) {
+ continue;
+ }
+
+ //
+ // we have only interest in EFI_FILE_NAME
+ //
+ String fileNameFlag = str.substring(0, equalMarkPos).trim();
+ String fileName = str.substring(equalMarkPos + 1).trim();
+ if (!fileNameFlag.equalsIgnoreCase("EFI_FILE_NAME")
+ || fileName.length() == 0) {
+ continue;
+ }
+
+ if (inFiles) {
+ //
+ // files specified beneath the [files] section are source files
+ //
+ ffsFiles.add(fileName);
+ } else if (inOptions) {
+ //
+ // file specified beneath the [options] section is the target file
+ //
+ fvName = outputDir + File.separator + fileName;
+ }
+ }
+ } catch (Exception ex) {
+ throw new BuildException(ex.getMessage());
+ }
+
+ //
+ // if destionation file doesn't exist, we need to generate it.
+ //
+ File fvFile = new File(fvName);
+ if (!fvFile.exists()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, fvName + " doesn't exist!");
+ return false;
+ }
+
+ //
+ // the inf file itself will be taken as source file, check its timestamp
+ // against the target file
+ //
+ long fvFileTimeStamp = fvFile.lastModified();
+ if (inf.lastModified() > fvFileTimeStamp) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, infName + " has been changed since last build!");
+ return false;
+ }
+
+ //
+ // no change in the inf file, we need to check each source files in it
+ // against the target file
+ //
+ for (Iterator it = ffsFiles.iterator(); it.hasNext(); ) {
+ String fileName = (String)it.next();
+ File file = new File(fileName);
+ if (file.lastModified() > fvFileTimeStamp) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, fileName + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenSectionTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenSectionTask.java
new file mode 100644
index 0000000000..e329c0e3eb
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenSectionTask.java
@@ -0,0 +1,385 @@
+/** @file
+ GenSectionTask class.
+
+ GenSectionTask is to call GenSection.exe to generate Section.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+package org.tianocore.framework.tasks;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+import org.tianocore.common.logger.EdkLog;
+
+public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes {
+ //
+ // Tool name
+ //
+ private final static String toolName = "GenSection";
+ //
+ // inputfile name
+ //
+ private FileArg inputFile = new FileArg();
+
+ //
+ // outputfile name
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // section type
+ //
+ private ToolArg sectionType = new ToolArg();
+
+ //
+ // version number
+ //
+ private ToolArg versionNum = new ToolArg();
+
+ //
+ // interface string
+ //
+ private ToolArg interfaceString = new ToolArg();
+
+ //
+ // Section file list
+ //
+ private List<Section> sectFileList = new ArrayList<Section>();
+
+ //
+ // flag indicated the <tool> element
+ //
+ private boolean haveTool = false;
+
+ /**
+ execute
+
+ GenSectionTaks execute is to assemble tool command line & execute tool
+ command line.
+
+ @throws BuildException
+ **/
+ public void execute() throws BuildException {
+ String command;
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ String argument = "" + inputFile + outputFile + sectionType + versionNum + interfaceString;
+ //
+ // return value of gensection execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+
+ EdkLog.log(this, inputFile.toFileList() + versionNum.getValue()
+ + interfaceString.getValue() + " => " + outputFile.toFileList());
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile".
+
+ @return name of input file
+ **/
+ public String getInputFile() {
+ return this.inputFile.getValue();
+ }
+
+ /**
+ setInputFile
+
+ This function is to set class member "inputFile".
+
+ @param inputFile name of input file
+ **/
+ public void setInputFile(String inputFile) {
+ this.inputFile.setArg(" -i ", inputFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile".
+
+ @return name of output file
+ **/
+ public String getOutputFile() {
+ return this.outputFile.getValue();
+ }
+
+ /**
+ setOutputfile
+
+ This function is to set class member "outputFile".
+ @param outputFile name of output file
+ **/
+ public void setOutputfile(String outputFile) {
+ this.outputFile.setArg(" -o ", outputFile);
+ }
+
+ /**
+ getSectionType
+
+ This function is to get class member "sectionType".
+
+ @return sectoin type
+ **/
+ public String getSectionType() {
+ return this.sectionType.getValue();
+ }
+
+ /**
+ setSectionType
+
+ This function is to set class member "sectionType".
+
+ @param sectionType section type
+ **/
+ public void setSectionType(String sectionType) {
+ this.sectionType.setArg(" -s ", sectionType);
+ }
+
+ /**
+ getVersionNum
+
+ This function is to get class member "versionNum".
+ @return version number
+ **/
+ public String getVersionNum() {
+ return this.versionNum.getValue();
+ }
+
+ /**
+ setVersionNume
+
+ This function is to set class member "versionNum".
+ @param versionNum version number
+ **/
+ public void setVersionNum(String versionNum) {
+ this.versionNum.setArg(" -v ", versionNum);
+ }
+
+ /**
+ getInterfaceString
+
+ This function is to get class member "interfaceString".
+ @return interface string
+ **/
+ public String getInterfaceString() {
+ return this.interfaceString.getValue();
+ }
+
+ /**
+ setInterfaceString
+
+ This funcion is to set class member "interfaceString".
+ @param interfaceString interface string
+ **/
+ public void setInterfaceString(String interfaceString) {
+ this.interfaceString.setArg(" -a ", "\"" + interfaceString + "\"");
+ }
+
+ /**
+ addSectFile
+
+ This function is to add sectFile to list.
+
+ @param sectFile instance of sectFile.
+ **/
+ public void addSectFile(SectFile sectFile){
+ this.sectFileList.add(sectFile);
+ }
+
+ /**
+ setTool
+
+ This function is to set the class member "Tool";
+
+ @param tool
+ **/
+ public void addTool(Tool tool) {
+ this.sectFileList.add(tool);
+ this.haveTool = true;
+ }
+
+ /**
+ addGenSection
+
+ This function is to add GenSectin element to list
+ @param task Instance of genSection
+ **/
+ public void addGenSection(GenSectionTask task){
+ this.sectFileList.add(task);
+ }
+
+ public void toBuffer(DataOutputStream buffer){
+ //
+ // Search SectionList find earch section and call it's
+ // ToBuffer function.
+ //
+ if (this.sectionType.getValue().equalsIgnoreCase(
+ "EFI_SECTION_COMPRESSION")
+ && !this.haveTool) {
+ Section sect;
+
+ //
+ // Get section file in compress node.
+ //
+ try {
+ ByteArrayOutputStream bo = new ByteArrayOutputStream();
+ DataOutputStream Do = new DataOutputStream(bo);
+
+ //
+ // Get each section which under the compress {};
+ // And add it is contains to File;
+ //
+ Iterator SectionIter = this.sectFileList.iterator();
+ while (SectionIter.hasNext()) {
+ sect = (Section) SectionIter.next();
+
+ //
+ // Call each section class's toBuffer function.
+ //
+ try {
+ sect.toBuffer(Do);
+ } catch (BuildException e) {
+ System.out.print(e.getMessage());
+ throw new BuildException(
+ "Compress.toBuffer failed at section");
+ } finally {
+ if (Do != null){
+ Do.close();
+ }
+ }
+ }
+ //
+ // Call compress
+ //
+ byte[] fileBuffer = bo.toByteArray();
+
+ synchronized (CompressSection.semaphore) {
+ Compress myCompress = new Compress(fileBuffer,
+ fileBuffer.length);
+
+ //
+ // Add Compress header
+ //
+ CompressHeader Ch = new CompressHeader();
+ Ch.SectionHeader.Size[0] = (byte) ((myCompress.outputBuffer.length + Ch
+ .GetSize()) & 0xff);
+ Ch.SectionHeader.Size[1] = (byte) (((myCompress.outputBuffer.length + Ch
+ .GetSize()) & 0xff00) >> 8);
+ Ch.SectionHeader.Size[2] = (byte) (((myCompress.outputBuffer.length + Ch
+ .GetSize()) & 0xff0000) >> 16);
+ Ch.SectionHeader.type = (byte) EFI_SECTION_COMPRESSION;
+
+ //
+ // Note: The compressName was not efsfective now. Using the
+ // EFI_STANDARD_COMPRSSION for compressType .
+ // That is follow old Genffsfile tools. Some code will be
+ // added for
+ // the different compressName;
+ //
+ Ch.UncompressLen = fileBuffer.length;
+ Ch.CompressType = EFI_STANDARD_COMPRESSION;
+
+ //
+ // Change header struct to byte buffer
+ //
+ byte[] headerBuffer = new byte[Ch.GetSize()];
+ Ch.StructToBuffer(headerBuffer);
+
+ //
+ // First add CompressHeader to Buffer, then add Compress
+ // data.
+ //
+ buffer.write(headerBuffer);
+ buffer.write(myCompress.outputBuffer);
+
+ //
+ // Buffer 4 Byte aligment
+ //
+ int size = Ch.GetSize() + myCompress.outputBuffer.length;
+
+ while ((size & 0x03) != 0) {
+ size++;
+ buffer.writeByte(0);
+ }
+ }
+ } catch (Exception e) {
+ throw new BuildException("GenSection<SectionType=EFI_SECTION_COMPRESSION> to Buffer failed!\n");
+ }
+ } else {
+ Section sect;
+ Iterator sectionIter = this.sectFileList.iterator();
+ while (sectionIter.hasNext()) {
+ sect = (Section) sectionIter.next();
+ try {
+ //
+ // The last section don't need 4 byte ffsAligment.
+ //
+ sect.toBuffer(buffer);
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+ }
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenTeImageTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenTeImageTask.java
new file mode 100644
index 0000000000..34a7987f43
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GenTeImageTask.java
@@ -0,0 +1,253 @@
+/** @file
+ GenTeImageTask class.
+
+ GenTeImageTask is used to call GenTEImage.exe to generate TE image .
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ * GenTeImageTask class.
+ *
+ * GenTeImageTask is used to call GenAcpiTable.exe to generate ACPI Table image .
+ */
+public class GenTeImageTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private String toolName = "GenTeImage";
+ //
+ // input file
+ //
+ private FileArg inputFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = "";
+
+ //
+ // Verbose flag
+ //
+ private ToolArg verbose = new ToolArg();
+
+ //
+ // Dump flag
+ //
+ private ToolArg dump = new ToolArg();
+
+ /**
+ execute
+
+ GenTeImgaeTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + this.verbose + this.dump + this.outputFile + this.inputFile;
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, this.inputFile.toFileList()
+ + " => " + this.outputFile.toFileList());
+
+ revl = runner.execute();
+
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = "+ Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile".
+
+ @return string of input file name.
+ **/
+ public String getInputFile() {
+ return inputFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "inputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setInputFile(String inputFile) {
+ this.inputFile.setArg(" ", inputFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" -o ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ /**
+ getVerbose
+
+ This function is to get class member "verbose"
+
+ @return verbose the flag of verbose.
+ **/
+ public String getVerbose() {
+ return this.verbose.getValue();
+ }
+
+ /**
+ setVerbose
+
+ This function is to set class member "verbose"
+
+ @param verbose
+ True or False.
+ **/
+ public void setVerbose(boolean verbose) {
+ if (verbose) {
+ this.verbose.setArg(" -", "v");
+ }
+ }
+
+ /**
+ getDump
+
+ This function is to get class member "dump"
+
+ @return verbose the flag of dump.
+ **/
+ public String getDump() {
+ return dump.getValue();
+ }
+
+ /**
+ setDump
+
+ This function is to set class member "dump"
+
+ @param dump
+ True or False.
+ **/
+ public void setDump(boolean dump) {
+ if (dump) {
+ this.dump.setArg(" -", "dump");
+ }
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GuidChkTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GuidChkTask.java
new file mode 100644
index 0000000000..2f892a7cd4
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/GuidChkTask.java
@@ -0,0 +1,368 @@
+/** @file
+ GuidChkTask class.
+
+ GuidChkTask is to call GuidChk.exe to generate Section.
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ GuidChkTask
+
+ GuidChkTask is to call GuidChk.exe to generate Section.
+
+**/
+public class GuidChkTask extends Task implements EfiDefine{
+ /**
+ * GuidChk task class
+ * class member
+ * -exDir : directory name of exclusion searching
+ * -exFile : file name of exclusion searching
+ * -exExt : extension name of exclusion searching
+ * -exSubDir: extesnion name of sub dir which excluded searching
+ * -outFile : out put file wrote internal GUID+basename list
+ * -chkGui : check for duplicate guids
+ * -chkSign : check for duplicate signatures
+ * -printGuiDef : if set will print guid+defined symbol name
+ * -printAllGuid: if set will print all GUIDS found
+ * -outPut : redirection file name
+ * -fos : out put redirect to this file
+ *
+ */
+ //
+ // Tool name
+ //
+ private static String toolName = "GuidChk";
+ //
+ // Directory name of exclusion searching
+ //
+ private FileArg exDir = new FileArg();
+ //
+ // File name of exclusion searching.
+ //
+ private FileArg exFile = new FileArg();
+ //
+ // Extension name of exclusion searching.
+ //
+ private FileArg exExt = new FileArg();
+ //
+ // Extesnion name of sub dir which excluded searching.
+ //
+ private FileArg exSubDir = new FileArg();
+ //
+ // Out put file wrote internal GUID+basename list
+ //
+ private FileArg outFile = new FileArg();
+ //
+ // Check for duplicate guids.
+ //
+ private ToolArg chkGui = new ToolArg();
+ //
+ // Check for duplicate signatures
+ //
+ private ToolArg chkSign = new ToolArg();
+ //
+ // If set will print guid+defined symbol name
+ //
+ private ToolArg printGuiDef = new ToolArg();
+ //
+ // If set will print all GUIDS found
+ //
+ private ToolArg printAllGuid = new ToolArg();
+ //
+ // redirection file name.
+ //
+ private String outPut = "";
+ //
+ // out put redirect to this file.
+ //
+ protected PrintWriter fos = null;
+
+ //
+ // overload class execute method
+ //
+ public void execute() throws BuildException {
+ Project project = this.getOwningTarget().getProject();
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separatorChar + toolName;
+ }
+ String argument = "" + exDir +
+ exFile +
+ exExt +
+ exSubDir +
+ outFile +
+ chkGui +
+ chkSign +
+ printGuiDef +
+ printAllGuid;
+ try {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, command + " " + argument);
+ //
+ // execute command line
+ //
+ Process proc = Runtime.getRuntime().exec(command + " " + argument);
+ //
+ // if set output, redirect out put to output file, else print output to screen
+ //
+ if ( !this.outPut.equals("")) {
+ fos = new PrintWriter(this.outPut);
+ BufferedReader bin = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = bin.readLine();
+ while (line != null ){
+ fos.println(line);
+ line = bin.readLine();
+ }
+ fos.close();
+ }
+ else {
+ BufferedReader bin = new BufferedReader(new InputStreamReader(proc.getInputStream()));
+ String line = bin.readLine();
+ while (line != null ){
+ line = bin.readLine();
+ }
+ }
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " Succeeded!");
+ } catch (Exception e) {
+ throw new BuildException(toolName + " failed!");
+ }
+ }
+ /**
+ getChkGui
+
+ This function is to get the string of flag of ChkGui
+
+ @return string of flag of ChkGui
+ **/
+ public String getChkGui() {
+ return chkGui.getValue();
+ }
+
+ /**
+ setChkGui
+
+ This function is to set chkGui
+
+ @param chkGui set class member of chkGui
+ **/
+ public void setChkGui(boolean chkGui) {
+ if (chkGui) {
+ this.chkGui.setArg(" -", "g");
+ }
+ }
+
+ /**
+ getChkSign
+
+ This function is to get chkSign
+
+ @return chkSign
+ **/
+ public String getChkSign() {
+ return chkSign.getValue();
+ }
+
+ /**
+ setChkSign
+
+ This function is to set class member of chkSign
+ * @param chkSign
+ */
+ public void setChkSign(boolean chkSign) {
+ if (chkSign){
+ this.chkSign.setArg(" -", "s");
+ }
+ }
+ /**
+ getExDir
+
+ This function is to get class member of exDir
+
+ @return exDir
+ **/
+ public String getExDir() {
+ return exDir.getValue();
+ }
+
+ /**
+ setExDir
+
+ This function is to set class member of exDir
+
+ @param exDir
+ **/
+ public void setExDir(String exDir) {
+ this.exDir.setArg(" -d ", exDir);
+ }
+
+ /**
+ getExExt
+
+ This function is to get class member of exExt
+
+ @return exExt
+ **/
+ public String getExExt() {
+ return exExt.getValue();
+ }
+
+ /**
+ setExExt
+
+ This function is to set class member of exExt
+ @param exExt
+ **/
+ public void setExExt(String exExt) {
+ this.exExt.setArg(" -e ", exExt);
+ }
+
+ /**
+ getExFile
+
+ This function is to get class member of exFile
+ @return exFile
+ **/
+ public String getExFile() {
+ return exFile.getValue();
+ }
+
+ /**
+ setExFile
+
+ This function is to set class member of exFile.
+
+ @param exFile
+ **/
+ public void setExFile(String exFile) {
+ this.exFile.setArg(" -f ", exFile);
+ }
+
+ /**
+ getExSubDir
+
+ This function is to get class member of exSubDir
+
+ @return exSubDir
+ **/
+ public String getExSubDir() {
+ return exSubDir.getValue();
+ }
+
+ /**
+ setExSubDir
+
+ This function is to set class member of exSubDir.
+ @param exSubDir
+ **/
+ public void setExSubDir(String exSubDir) {
+ this.exSubDir.setArg(" -u ", exSubDir);
+ }
+
+ /**
+ getOutFile
+
+ This function is to get outFile
+
+ @return outFile
+ **/
+ public String getOutFile() {
+ return outFile.getValue();
+ }
+ /**
+ * set class member of outFile
+ * @param outFile
+ */
+ public void setOutFile(String outFile) {
+ this.outFile.setArg(" -b ", outFile);
+ }
+ /**
+ getPrintGuidDef
+
+ This function is to get printGuidDef
+
+ @return flage of printing (guid+defined symbol name)
+ **/
+ public String getPrintGuiDef() {
+ return printGuiDef.getValue();
+ }
+
+
+ /**
+ setPrintGuidDef
+
+ This function is to set class member of printGuiDef.
+ @param printGuiDef
+ **/
+ public void setPrintGuiDef(boolean printGuiDef) {
+ if (printGuiDef){
+ this.printGuiDef.setArg(" -", "x");
+ }
+
+ }
+
+ /**
+ getOutput
+
+ This function is to get output
+
+ @return name of outPut file
+ **/
+ public String getOutPut() {
+ return outPut;
+ }
+
+ /**
+ setOutPut
+
+ This function is to set class member of outPut.
+ @param outPut
+ **/
+ public void setOutPut(String outPut) {
+ this.outPut = outPut;
+ }
+
+ /**
+ getPrintAllGuid
+
+ This function is to get printAllGuid
+ @return printAllGuid
+ **/
+ public String getPrintAllGuid() {
+ return printAllGuid.getValue();
+ }
+
+ /**
+ setPrintAllGuid
+
+ This function is to set class member of printAllGuid.
+ @param printAllGuid
+ **/
+ public void setPrintAllGuid(boolean printAllGuid) {
+ if (printAllGuid) {
+ this.printAllGuid.setArg(" -", "p");
+ }
+ }
+}
+
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/IncludePath.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/IncludePath.java
new file mode 100644
index 0000000000..4591406bbf
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/IncludePath.java
@@ -0,0 +1,26 @@
+/** @file
+This file is used to nest elements which is meant for include path name
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+package org.tianocore.framework.tasks;
+
+/**
+ IncludePath class is generally used to pass arguments with "-i" before each
+ of them.
+ **/
+public class IncludePath extends NestElement {
+ public String toString() {
+ return super.toString(" -i ");
+ }
+}
+
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Input.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Input.java
new file mode 100644
index 0000000000..088d37883b
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Input.java
@@ -0,0 +1,24 @@
+/** @file
+This file is used to nest elements which is meant for file path
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+/**
+ Input class is defined to be as nested elements of other elements, to specify
+ the path of file(s).
+ **/
+public class Input extends NestElement {
+ public String toString() {
+ return super.toString(" -f ");
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/InputFile.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/InputFile.java
new file mode 100644
index 0000000000..fe0cc83eb2
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/InputFile.java
@@ -0,0 +1,24 @@
+/** @file
+This file is used to nest elements which is meant for specifying files
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+/**
+ InputFile is always used to pass arguments separated by space
+ **/
+public class InputFile extends NestElement {
+ public String toString() {
+ return super.toString(" ");
+ }
+}
+
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/MakeDeps.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/MakeDeps.java
new file mode 100644
index 0000000000..8f5664f01d
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/MakeDeps.java
@@ -0,0 +1,304 @@
+/** @file
+This file is to wrap MakeDeps.exe tool as ANT task, which is used to generate
+dependency files for source code.
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+import org.tianocore.common.cache.FileTimeStamp;
+
+/**
+ Class MakeDeps is used to wrap MakeDeps.exe as an ANT task.
+ **/
+public class MakeDeps extends Task {
+
+ //
+ // private members, use set/get to access them
+ //
+ private static final String toolName = "MakeDeps";
+ private FileArg depsFile = new FileArg();
+ private ToolArg subDir = new ToolArg();
+ private ToolArg quietMode = new ToolArg(" -", "q");
+ private ToolArg ignoreError = new ToolArg(" -", "ignorenotfound");
+ private IncludePath includePathList = new IncludePath();
+ private Input inputFileList = new Input();
+ private ToolArg target = new FileArg(" -target ", "dummy");
+
+ public MakeDeps() {
+
+ }
+
+ /**
+ The Standard execute method for ANT task. It will check if it's necessary
+ to generate the dependency list file. If no file is found or the dependency
+ is changed, it will compose the command line and call MakeDeps.exe to
+ generate the dependency list file.
+
+ @throws BuildException
+ **/
+ public void execute() throws BuildException {
+ ///
+ /// check if the dependency list file is uptodate or not
+ ///
+ if (isUptodate()) {
+ return;
+ }
+
+ Project prj = this.getOwningTarget().getProject();
+ String toolPath = prj.getProperty("env.FRAMEWORK_TOOLS_PATH");
+
+ ///
+ /// compose full tool path
+ ///
+ if (toolPath == null || toolPath.length() == 0) {
+ toolPath = toolName;
+ } else {
+ if (toolPath.endsWith("/") || toolPath.endsWith("\\")) {
+ toolPath = toolPath + toolName;
+ } else {
+ toolPath = toolPath + File.separator + toolName;
+ }
+ }
+
+ ///
+ /// compose tool arguments
+ ///
+ String argument = "" + inputFileList + includePathList + subDir
+ + quietMode + ignoreError + target + depsFile;
+
+ ///
+ /// prepare to execute the tool
+ ///
+ Commandline cmd = new Commandline();
+ cmd.setExecutable(toolPath);
+ cmd.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this, Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(prj);
+ runner.setCommandline(cmd.getCommandline());
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmd.getCommandline()));
+
+ int result = 0;
+ try {
+ result = runner.execute();
+ } catch (IOException e) {
+ throw new BuildException(e.getMessage());
+ }
+
+ if (result != 0) {
+ EdkLog.log(this, EdkLog.EDK_INFO, toolName + " failed!");
+ throw new BuildException(toolName + ": failed to generate dependency file!");
+ } else {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ }
+ }
+
+ /**
+ Set method for "DepsFile" attribute
+
+ @param name The name of dependency list file
+ **/
+ public void setDepsFile(String name) {
+ depsFile.setArg(" -o ", name);
+ }
+
+ /**
+ Get method for "DepsFile" attribute
+
+ @returns The name of dependency list file
+ **/
+ public String getDepsFile() {
+ return depsFile.getValue();
+ }
+
+ /**
+ Set method for "IgnoreError" attribute
+
+ @param ignore flag to control error handling (true/false)
+ **/
+ public void setIgnoreError(boolean ignore) {
+ if (!ignore) {
+ ignoreError.setArg(" ", " ");
+ }
+ }
+
+ /**
+ Get method for "IgnoreError" attribute
+
+ @returns The value of current IgnoreError flag
+ **/
+ public boolean getIgnoreError() {
+ return ignoreError.getValue().length() > 0;
+ }
+
+ /**
+ Set method for "QuietMode" attribute
+
+ @param quiet flag to control the output information (true/false)
+ **/
+ public void setQuietMode(boolean quiet) {
+ if (!quiet) {
+ quietMode.setArg(" ", " ");
+ }
+ }
+
+ /**
+ Get method for "QuietMode" attribute
+
+ @returns value of current QuietMode flag
+ **/
+ public boolean getQuietMode() {
+ return quietMode.getValue().length() > 0;
+ }
+
+ /**
+ Set method for "SubDir" attribute
+
+ @param dir The name of sub-directory in which source files will be scanned
+ **/
+ public void setSubDir(String dir) {
+ subDir.setArg(" -s ", dir);
+ }
+
+ /**
+ Get method for "SubDir" attribute
+
+ @returns The name of sub-directory
+ **/
+ public String getSubDir() {
+ return subDir.getValue();
+ }
+
+ /**
+ Add method for "IncludePath" nested element
+
+ @param path The IncludePath object from nested IncludePath type of element
+ **/
+ public void addConfiguredIncludepath(IncludePath path) {
+ includePathList.insert(path);
+ }
+
+ /**
+ Add method for "Input" nested element
+
+ @param input The Input object from nested Input type of element
+ **/
+ public void addConfiguredInput(Input inputFile) {
+ inputFileList.insert(inputFile);
+ }
+
+ /**
+ Check if the dependency list file should be (re-)generated or not.
+
+ @returns true The dependency list file is uptodate. No re-generation is needed.
+ @returns false The dependency list file is outofdate. Re-generation is needed.
+ **/
+ private boolean isUptodate() {
+ String dfName = depsFile.getValue();
+ File df = new File(dfName);
+ if (!df.exists()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, dfName + " doesn't exist!");
+ return false;
+ }
+
+ //
+ // If the source file(s) is newer than dependency list file, we need to
+ // re-generate the dependency list file
+ //
+ long depsFileTimeStamp = FileTimeStamp.get(dfName);
+ List<String> fileList = inputFileList.getNameList();
+ for (int i = 0, length = fileList.size(); i < length; ++i) {
+ String sf = fileList.get(i);
+ if (FileTimeStamp.get(sf) > depsFileTimeStamp) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, sf + " has been changed since last build!");
+ return false;
+ }
+ }
+
+ //
+ // If the source files haven't been changed since last time the dependency
+ // list file was generated, we need to check each file in the file list to
+ // see if any of them is changed or not. If anyone of them is newer than
+ // the dependency list file, MakeDeps.exe is needed to run again.
+ //
+ LineNumberReader lineReader = null;
+ FileReader fileReader = null;
+ boolean ret = false;
+ try {
+ fileReader = new FileReader(df);
+ lineReader = new LineNumberReader(fileReader);
+
+ String line = null;
+ int lines = 0;
+ while ((line = lineReader.readLine()) != null) {
+ //
+ // check file end flag "\t" to see if the .dep was generated correctly
+ //
+ if (line.equals("\t")) {
+ ret = true;
+ continue;
+ }
+ line = line.trim();
+ //
+ // skip empty line
+ //
+ if (line.length() == 0) {
+ continue;
+ }
+ ++lines;
+
+ //
+ // If a file cannot be found (moved or removed) or newer, regenerate the dep file
+ //
+ File sourceFile = new File(line);
+ if ((!sourceFile.exists()) || (FileTimeStamp.get(line) > depsFileTimeStamp)) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, sourceFile.getPath() + " has been (re)moved or changed since last build!");
+ ret = false;
+ break;
+ }
+ }
+
+ //
+ // check if the .dep file is empty
+ //
+ if (lines == 0) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, dfName + " is empty!");
+ ret = false;
+ }
+
+ lineReader.close();
+ fileReader.close();
+ } catch (IOException e) {
+ throw new BuildException(e.getMessage());
+ }
+
+ return ret;
+ }
+}
+
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ModifyInfTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ModifyInfTask.java
new file mode 100644
index 0000000000..5892064509
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ModifyInfTask.java
@@ -0,0 +1,221 @@
+/** @file
+ ModifyInfTask class.
+
+ ModifyInfTask is used to call Modify.exe to generate inf file.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ ModifyInfTask class.
+
+ ModifyInfTask is used to call Modify.exe to generate inf file.
+**/
+public class ModifyInfTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private String toolName = "ModifyInf";
+
+ //
+ // input FV inf file
+ //
+ private FileArg inputFVInfFile = new FileArg();
+
+ //
+ // output FV inf file
+ //
+ private FileArg outputFVInfFile = new FileArg();
+
+ //
+ // pattern string
+ //
+ private ToolArg patternStr = new ToolArg();
+
+ //
+ // Output dir
+ //
+ private String outputDir = ".";
+
+ /**
+ execute
+
+ ModifyInfTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separatorChar + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + this.inputFVInfFile + this.outputFVInfFile + this.patternStr;
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, this.inputFVInfFile.toFileList()
+ + " => " + this.inputFVInfFile.toFileList());
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getinputFVInfFile
+
+ This function is to get class member "inputFVInfFile".
+
+ @return string of input inf file name.
+ **/
+ public String getinputFVInfFile() {
+ return this.inputFVInfFile.getValue();
+ }
+
+ /**
+ setinputFVInfFile
+
+ This function is to set class member "inputFVInfFile".
+
+ @param inputFile
+ string of input inf file name.
+ **/
+ public void setinputFVInfFile(String inputFVInfFileName) {
+ this.inputFVInfFile.setArg(" ", inputFVInfFileName);
+ }
+
+ /**
+ getoutputFVInfFile
+
+ This function is to get class member "outputFVInfFile"
+
+ @return outputFVInfFile string of output inf file name.
+ **/
+ public String getoutputFVInfFile() {
+ return this.outputFVInfFile.getValue();
+ }
+
+ /**
+ setoutputFVInfFile
+
+ This function is to set class member "outputFVInfFile"
+
+ @param outputFVInfFile
+ string of output inf file name.
+ **/
+ public void setoutputFVInfFile(String outputFVInfFileName) {
+ this.outputFVInfFile.setArg(" ", outputFVInfFileName);
+ }
+
+ /**
+ getpatternStr
+
+ This function is to get class member "patternStr"
+
+ @return patternStr string of pattern.
+ **/
+ public String getpatternStr() {
+ return this.patternStr.getValue();
+ }
+
+ /**
+ setpatternStr
+
+ This function is to set class member "patternStr"
+
+ @param patternStr
+ string of patternStr.
+ **/
+ public void setpatternStr(String patternStr) {
+ this.patternStr.setArg(" ", patternStr);
+ }
+
+ /**
+ getoutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getoutputDir() {
+ return this.outputDir;
+ }
+
+ /**
+ setoutputDir
+
+ This function is to set class member "outputDir"
+
+ @param patternStr
+ string of output directory.
+ **/
+ public void setoutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/NestElement.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/NestElement.java
new file mode 100644
index 0000000000..271dee6c88
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/NestElement.java
@@ -0,0 +1,348 @@
+/** @file
+This file is to define common interfaces for nested element of frameworktasks
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+import java.util.List;
+import java.util.ArrayList;
+import java.io.FileReader;
+import java.io.BufferedReader;
+import java.util.StringTokenizer;
+
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.BuildException;
+
+/**
+ Interface NestElement is to define common interfaces for nested element
+ **/
+public class NestElement extends DataType {
+ //
+ // The name list. All the name strings got from setXXX methods will be put
+ // in here.
+ //
+ protected List<String> nameList = new ArrayList<String>();
+
+ /**
+ Insert content in the newElement into this NestElement
+
+ @param newElement The new NestElement
+ **/
+ public void insert(NestElement newElement) {
+ this.nameList.addAll(newElement.getNameList());
+ }
+
+ /**
+ Handle "name" attribute. No delimiter and special treatment are assumed.
+
+ @param name A single string value of "name" attribute
+ **/
+ public void setName(String name) {
+ if (name.length() > 0) {
+ this.nameList.clear();
+ this.nameList.add(name);
+ }
+ }
+
+ public void insName(String name) {
+ if (name.length() > 0) {
+ this.nameList.add(name);
+ }
+ }
+
+ /**
+ Handle "list" attribute. The value of "list" is assumed as string
+ separated by space, tab, comma or semmicolon.
+
+ @param nameList The value of "list" separated by " \t,;"
+ **/
+ public void setList(String nameList) {
+ if (nameList.length() == 0) {
+ return;
+ }
+
+ this.nameList.clear();
+ StringTokenizer tokens = new StringTokenizer(nameList, " \t,;", false);
+ while (tokens.hasMoreTokens()) {
+ String name = tokens.nextToken().trim();
+ if (name.length() > 0) {
+ this.nameList.add(name);
+ }
+ }
+ }
+
+ /**
+ Handle "ListFile" attribute. The value of "ListFile" should be the path of
+ a file which contains name strings, one name per line.
+
+ @param listFileName The file path
+ **/
+ public void setListFile(String listFileName) {
+ FileReader fileReader = null;
+ BufferedReader in = null;
+ String str;
+
+ //
+ // Check if the file exists or not
+ //
+ File file = new File(listFileName);
+ if (!file.exists()) {
+ throw new BuildException("The file, " + file + " does not exist!");
+ }
+
+ try {
+ fileReader = new FileReader(file);
+ in = new BufferedReader(fileReader);
+
+ //
+ // Read line by line
+ //
+ nameList.clear();
+ while((str = in.readLine()) != null){
+ str = str.trim();
+ if (str.length() == 0){
+ continue;
+ }
+
+ //getProject().replaceProperties(str);
+ this.nameList.add(str);
+ }
+ } catch (Exception e){
+ throw new BuildException(e.getMessage());
+ } finally {
+ try {
+ //
+ // close the file
+ //
+ if (in != null) {
+ in.close();
+ }
+ if (fileReader != null) {
+ fileReader.close();
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+ }
+
+ /**
+ Handle "file" attribute. The value of "file" should be a path.
+
+ @param file The path name of a file
+ **/
+ public void setFile(String file) {
+ setPath(file);
+ }
+
+ /**
+ Add a file or file list into the file list
+
+ @param file The path of a file
+ **/
+ public void insFile(String file) {
+ insPath(file);
+ }
+
+ /**
+ Handle "path" attribute. The value of "path" may contain compound path
+ separator (/ or \) which should be cleaned up. Because the "path" string
+ will always be passed to external native program which may not handle
+ non-native path separator, the clean-up action is a must. And the value
+ of "path" may contains several path separated by space, tab, comma or
+ semmicolon. We need to split it and put each part in nameList.
+
+ @param path String value of a file system path
+ **/
+ public void setPath(String path) {
+ this.nameList.clear();
+ insPath(path);
+ }
+
+ /**
+ Add a path or path list into the path list
+
+ @param path The path string
+ **/
+ public void insPath(String path) {
+ if (path.length() == 0) {
+ return;
+ }
+
+ //
+ // split the value of "path" into separated single path
+ //
+ StringTokenizer tokens = new StringTokenizer(path, " \t,;", false);
+ while (tokens.hasMoreTokens()) {
+ String pathName = tokens.nextToken().trim();
+ if (pathName.length() > 0) {
+ //
+ // Make clean the path string before storing it
+ //
+ this.nameList.add(cleanupPath(pathName));
+ }
+ }
+ }
+
+ /**
+ Handle "FileName" attribute. The value of "FileName" should be the path
+ of a file which contains path strings, one path per line.
+
+ @param pathFileName
+ **/
+ public void setPathFile(String pathFileName) {
+ FileReader fileReader = null;
+ BufferedReader in = null;
+ String path;
+
+ //
+ // Check if the file exists or not
+ //
+ File file = new File(pathFileName);
+ if (!file.exists()) {
+ throw new BuildException("The file, " + file + " does not exist!");
+ }
+
+ try {
+ fileReader = new FileReader(file);
+ in = new BufferedReader(fileReader);
+
+ //
+ // Read the file line by line, skipping empty ones
+ //
+ nameList.clear();
+ while((path = in.readLine()) != null){
+ path = path.trim();
+ if (path.length() == 0){
+ continue;
+ }
+ //getProject().replaceProperties(path);
+
+ //
+ // Make clean the path string before storing it.
+ //
+ nameList.add(cleanupPath(path));
+ }
+ } catch (Exception e){
+ throw new BuildException(e.getMessage());
+ } finally {
+ try {
+ //
+ // close the file
+ //
+ if (in != null) {
+ in.close();
+ }
+ if (fileReader != null) {
+ fileReader.close();
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+ }
+
+ /**
+ Return the name list.
+
+ @return List<String> The list contains the name(path) strings
+ **/
+ public List<String> getNameList() {
+ return nameList;
+ }
+
+ /**
+ Compose and return the the name/path string without any delimiter. The trick
+ here is that it's actually used to return the value of nameList which
+ has just one name/string.
+
+ @return String
+ **/
+ public String toString() {
+ return toString("");
+ }
+
+ /**
+ Compose and return the name/path string concatenated by leading "prefix".
+
+ @param prefix The string will be put before each name/string in nameList
+
+ @return String The string concatenated with "prefix"
+ **/
+ public String toString(String prefix) {
+ StringBuffer string = new StringBuffer(1024);
+ int length = nameList.size();
+
+ for (int i = 0; i < length; ++i) {
+ string.append(prefix);
+ string.append(nameList.get(i));
+ }
+
+ return string.toString();
+ }
+
+ /**
+ Compose and return the name/path string concatenated by space and
+ with only one "prefix".
+
+ @param prefix The prefix at the beginning of the string
+
+ @return String The string with one prefix at the beginning
+ **/
+ public String toStringWithSinglepPrefix(String prefix) {
+ return prefix + toString(" ");
+ }
+
+ /**
+ Compose a string list with file names only, separated by spcified string
+
+ @param separator The separator string
+
+ @return String The file list
+ **/
+ public String toFileList(String separator) {
+ StringBuffer string = new StringBuffer(1024);
+ int length = nameList.size();
+
+ for (int i = 0; i < length; ++i) {
+ File file = new File(nameList.get(i));
+ string.append(file.getName());
+ string.append(separator);
+ }
+
+ return string.toString();
+ }
+
+ /**
+ Compose a string list with file names only, separated by space
+
+ @return String The list string
+ **/
+ public String toFileList() {
+ return toFileList(" ");
+ }
+
+ //
+ // Remove any duplicated path separator or inconsistent path separator
+ //
+ private String cleanupPath(String path) {
+ String separator = "\\" + File.separator;
+ String duplicateSeparator = separator + "{2}";
+
+ path = Path.translateFile(path);
+ path = path.replaceAll(duplicateSeparator, separator);
+
+ return path;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/PeiReBaseTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/PeiReBaseTask.java
new file mode 100644
index 0000000000..1f8a4d1f3c
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/PeiReBaseTask.java
@@ -0,0 +1,268 @@
+/** @file
+ PeiReBaseTask class.
+
+ PeiReBaseTask is used to call PeiReBase.exe to rebase efi fv file.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ PeiReBaseTask class.
+
+ PeiReBaseTask is used to call PeiReBase.exe to rebase efi fv file.
+**/
+public class PeiReBaseTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private String toolName = "PeiReBase";
+ //
+ // Input file
+ //
+ private FileArg inputFile = new FileArg();
+ //
+ // Output file
+ //
+ private FileArg outputFile = new FileArg();
+ //
+ // Base address
+ //
+ private ToolArg baseAddr = new ToolArg();
+ //
+ //
+ //
+ private FileArg mapFile = new FileArg();
+ //
+ // Architecture
+ //
+ private String arch = "IA32";
+
+ /**
+ execute
+
+ PeiReBaseTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+ if (isUptodate()) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, outputFile.toFileList() + " is up-to-date!");
+ return;
+ }
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (this.arch.equalsIgnoreCase("IA32")){
+ command = toolName + "_IA32";
+ } else if (this.arch.equalsIgnoreCase("X64")){
+ command = toolName + "_X64";
+ } else if (this.arch.equalsIgnoreCase("IPF")){
+ command = toolName + "_IPF";
+ } else {
+ command = toolName + "_IA32";
+ }
+ if (path != null) {
+ command = path + File.separator + command;
+ }
+
+ //
+ // argument of tools
+ //
+ if (mapFile.getValue().length() == 0) {
+ mapFile.setArg(" -M ", outputFile.getValue() + ".map");
+ }
+ argument = "" + inputFile + outputFile + baseAddr + mapFile;
+
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, inputFile.toFileList() + " => "
+ + outputFile.toFileList()
+ + mapFile.toFileList());
+
+ revl = runner.execute();
+
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "PeiReBase succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException("PeiReBase failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile".
+
+ @return string of input file name.
+ **/
+ public String getInputFile() {
+ return inputFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "inputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setInputFile(String inputFile) {
+ this.inputFile.setArg(" -I ", inputFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" -O ", outputFile);
+ }
+
+ /**
+ getBaseAddr
+
+ This function is to get class member "baseAddr"
+
+ @return baseAddr string of base address.
+ **/
+ public String getBaseAddr() {
+ return baseAddr.getValue();
+ }
+
+ /**
+ setBaseAddr
+
+ This function is to set class member "baseAddr"
+
+ @param baseAddr string of base address
+ **/
+ public void setBaseAddr(String baseAddr) {
+ this.baseAddr.setArg(" -B ", baseAddr);
+ }
+
+ /**
+ getArch
+
+ This function is to get class member "arch".
+
+ @return arch Architecture
+ **/
+ public String getArch() {
+ return arch;
+ }
+
+ /**
+ setArch
+
+ This function is to set class member "arch"
+
+ @param arch Architecture
+ **/
+ public void setArch(String arch) {
+ this.arch = arch;
+ }
+
+ /**
+ Get the value of map file
+
+ @return String The map file path
+ **/
+ public String getMapFile() {
+ return mapFile.getValue();
+ }
+
+ /**
+ Set "-M MapFile" argument
+
+ @param mapFile The path of map file
+ **/
+ public void setMapFile(String mapFile) {
+ this.mapFile.setArg(" -M ", mapFile);
+ }
+
+ //
+ // Dependency check
+ //
+ private boolean isUptodate() {
+ File srcFile = new File(inputFile.getValue());
+ File dstFile = new File(outputFile.getValue());
+
+ if (srcFile.lastModified() > dstFile.lastModified()) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecApResetVectorFixupTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecApResetVectorFixupTask.java
new file mode 100644
index 0000000000..310cb6a814
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecApResetVectorFixupTask.java
@@ -0,0 +1,196 @@
+/** @file
+ SecApResetVectorFixupTask class.
+
+ SecApResetVectorFixupTask is used to call SecApResetVectorFixup.exe to place
+ Ap reset vector.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ SecApResetVectorFixupTask class.
+
+ SecApResetVectorFixupTask is used to call SecApResetVectorFixup.exe to place
+ Ap reset vector.
+**/
+public class SecApResetVectorFixupTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private String toolName = "SecApResetVectorFixup";
+ //
+ // input FV recovery file
+ //
+ private FileArg fvInputFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg fvOutputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+
+ /**
+ execute
+
+ SecApResetVectorFixupTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + this.fvInputFile + this.fvOutputFile;
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, this.fvInputFile.toFileList()
+ + " => " + this.fvOutputFile.toFileList());
+
+ revl = runner.execute();
+
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "fvInputFile".
+
+ @return string of input file name.
+ **/
+ public String getfvInputFile() {
+ return this.fvInputFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "fvInputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setFvInputFile(String inputFile) {
+ this.fvInputFile.setArg(" ", inputFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "fvOutputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return this.fvOutputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "fvOutputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setFvOutputFile(String outputFile) {
+ this.fvOutputFile.setArg(" ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecFixupTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecFixupTask.java
new file mode 100644
index 0000000000..2f9bc46b8f
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SecFixupTask.java
@@ -0,0 +1,224 @@
+/** @file
+ SecFixupTask class.
+
+ SecFixupTask is used to call SecFixup.exe to fix up sec image.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ * SecFixupTask class.
+ *
+ * SecFixupTask is used to call SecFixup.exe to fix up sec image.
+ */
+public class SecFixupTask extends Task implements EfiDefine {
+ //
+ // tool name
+ //
+ private String toolName = "SecFixup";
+
+ //
+ // input file
+ //
+ private FileArg secExeFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg resetVectorDataFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+ /**
+ execute
+
+ SecFixupTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separatorChar + toolName;
+ }
+ //
+ // argument of tools
+ //
+ argument = "" + secExeFile + resetVectorDataFile + outputFile;
+
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, secExeFile.toFileList()
+ + resetVectorDataFile.toFileList() + " => " + outputFile.toFileList());
+
+ revl = runner.execute();
+
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = "+ Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getSecExeFile
+
+ This function is to get class member "secExeFile".
+
+ @return string of sectExe file name.
+ **/
+ public String getSecExeFile() {
+ return this.secExeFile.getValue();
+ }
+
+ /**
+ setSecExeFile
+
+ This function is to set class member "secExeFile".
+
+ @param secExeFile
+ string of secExe file name.
+ **/
+ public void setSecExeFile(String secExeFile) {
+ this.secExeFile.setArg(" ", secExeFile);
+ }
+
+ /**
+ getResetVectorDataFile
+
+ This function is to get class member "resetVectorDataFile"
+
+ @return resetVectorDataFile string of resetVectorData file name.
+ **/
+ public String getResetVectorDataFile() {
+ return this.resetVectorDataFile.getValue();
+ }
+
+ /**
+ setResetVectorDataFile
+
+ This function is to set class member "resetVectorDataFile"
+
+ @param resetVectorDataFile
+ string of resetVectorData file name.
+ **/
+ public void setResetVectorDataFile(String resetVectorDataFile) {
+ this.resetVectorDataFile.setArg(" ", resetVectorDataFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return this.outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir name of output directory
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ name of output directory
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SectFile.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SectFile.java
new file mode 100644
index 0000000000..c110f3bc50
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SectFile.java
@@ -0,0 +1,103 @@
+/** @file
+This file is to define nested element which is meant for specifying section file
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import org.apache.tools.ant.BuildException;
+
+/**
+ Class SectFile is to define a class corresponding to ANT nested element. It's
+ used to specify section file(s) when used with GenFfsFile task
+ **/
+public class SectFile implements Section {
+ private String fileName = ""; /// section file name
+
+ /**
+ Get method of ANT task/datatype for "FileName" attribute
+
+ @returns The name of section file
+ **/
+ public String getFileName() {
+ return fileName;
+ }
+
+ /**
+ Set method of ANT task/datatype for "FileName" attribute
+
+ @param fileName The name of section file
+ **/
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public SectFile (){
+ }
+
+ /**
+ Put the content of section file into specified buffer with extra bytes for
+ alignment requirement.
+
+ @param Buffer buffer to contain the section file content with alignment
+ **/
+ public void toBuffer (DataOutputStream buffer){
+ File sectFile;
+ int fileLen;
+
+ ///
+ /// open file
+ ///
+ sectFile = new File (this.fileName);
+
+ ///
+ /// check if file exist.
+ ///
+ if (! sectFile.exists()) {
+ throw new BuildException("The file " + this.fileName + " is not exist!\n");
+ }
+
+
+ ///
+ /// Read section file and add it's contains to buffer.
+ ///
+ try {
+
+ FileInputStream fs = new FileInputStream (sectFile.getAbsoluteFile());
+ DataInputStream In = new DataInputStream (fs);
+ fileLen = (int)sectFile.length();
+ byte[] sectBuffer = new byte[fileLen];
+ In.read(sectBuffer);
+ buffer.write(sectBuffer);
+
+ ///
+ /// 4 byte alignment
+ ///
+ while ((fileLen & 0x03)!= 0) {
+ fileLen ++;
+ buffer.writeByte(0);
+ }
+
+ ///
+ /// close inputStream
+ ///
+ In.close();
+
+ } catch (Exception e) {
+ System.out.print(e.getMessage());
+ throw new BuildException("SectFile, toBuffer failed!\n");
+ }
+ }
+} \ No newline at end of file
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Section.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Section.java
new file mode 100644
index 0000000000..5fa8d7b1ee
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Section.java
@@ -0,0 +1,23 @@
+/** @file
+This file is to define interface for manipulating section file
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.DataOutputStream;
+
+/**
+ Section interface is for geting the contain buffer form compress, tool, and sectFile
+ **/
+public interface Section {
+ public void toBuffer (DataOutputStream buffer);
+} \ No newline at end of file
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SetStampTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SetStampTask.java
new file mode 100644
index 0000000000..dc3a96e8e5
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SetStampTask.java
@@ -0,0 +1,162 @@
+/** @file
+This file is to define an ANT task to wrap setstamp.exe tool
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ Class SetStampTask is a wrap class for setstamp.exe.
+ **/
+public class SetStampTask extends Task implements EfiDefine {
+ /**
+ SetStamp Task Class
+ class member
+ -peFile : file of PE
+ -timeFile: Txt file of time
+ **/
+
+ private static String toolName = "SetStamp";
+
+ private FileArg peFile = new FileArg();
+
+ private FileArg timeFile = new FileArg();
+
+ private String outputDir = ".";
+
+ /**
+ assemble tool command line & execute tool command line
+
+ @throws BuildException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+ ///
+ /// absolute path of edk tools
+ ///
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+ ///
+ /// argument of SetStamp tool
+ ///
+ String argument = "" + peFile + timeFile;
+ ///
+ /// reture value of SetStamp execution
+ ///
+ int returnVal = -1;
+
+ try {
+ Commandline commandLine = new Commandline();
+ commandLine.setExecutable(command);
+ commandLine.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+
+ Execute runner = new Execute(streamHandler, null);
+ runner.setAntRun(project);
+ runner.setCommandline(commandLine.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(commandLine.getCommandline()));
+ EdkLog.log(this, peFile.toFileList() + " < " + timeFile.toFileList());
+
+ returnVal = runner.execute();
+ if (EFI_SUCCESS == returnVal) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ ///
+ /// command execution fail
+ ///
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(returnVal));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ set operation of class member "peFile"
+
+ @param peFile name of PE File
+ **/
+ public void setPeFile(String peFile) {
+ this.peFile.setArg(" ", peFile);
+ }
+
+ /**
+ get operation of class member "peFile"
+
+ @return peFile name of PE file
+ **/
+ public String getPeFile() {
+ return this.peFile.getValue();
+ }
+
+ /**
+ set operation of class member "timeFile"
+
+ @param timeFile name of time file
+ **/
+ public void setTimeFile(String timeFile) {
+ this.timeFile.setArg(" ", timeFile);
+ }
+
+ /**
+ get class member "timeFile"
+
+ @returns name of time file
+ **/
+ public String getTimeFile() {
+ return this.timeFile.getValue();
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SkipExt.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SkipExt.java
new file mode 100644
index 0000000000..20883c98e3
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SkipExt.java
@@ -0,0 +1,24 @@
+/** @file
+This file is to define nested element which is meant for specifying skipped file list
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+/**
+ SkipExt nested element Class
+ **/
+public class SkipExt extends NestElement {
+ public String toString() {
+ return super.toString(" -skipext ");
+ }
+}
+
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SplitfileTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SplitfileTask.java
new file mode 100644
index 0000000000..7c1882aaf0
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/SplitfileTask.java
@@ -0,0 +1,195 @@
+/** @file
+ SplitfileTask class.
+
+ SplitfileTask is used to call splitfile.exe to split input file to 2 output
+ file.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ SplitfileTask class.
+
+ SplitfileTask is used to call splitfile.exe to split input file to 2 output
+ file.
+**/
+public class SplitfileTask extends Task implements EfiDefine {
+ //
+ // Tool name
+ //
+ private static String toolName = "SplitFile";
+
+ //
+ // input file
+ //
+ private FileArg inputFile = new FileArg();
+
+ //
+ // offset value
+ //
+ private ToolArg offset = new ToolArg();
+
+ //
+ // Output directory
+ //
+ private String outputDir = ".";
+
+ /**
+ execute
+
+ SplitfleTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+
+ //
+ // argument of tools
+ //
+ argument = "" + inputFile + offset;
+
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ String fileName = inputFile.toFileList();
+ EdkLog.log(this, EdkLog.EDK_INFO, fileName + " => " + fileName + "1 " + fileName + "2");
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile".
+
+ @return string of input file name.
+ **/
+ public String getInputFile() {
+ return inputFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "inputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setInputFile(String inputFile) {
+ this.inputFile.setArg(" ", inputFile);
+ }
+
+ /**
+ getOffset
+
+ This function is to get class member "offset"
+
+ @return offset value of string.
+ **/
+ public String getOffset() {
+ return offset.getValue();
+ }
+
+ /**
+ setOffset
+
+ This function is to set class member "offset"
+
+ @param offset
+ string of offset value.
+ **/
+ public void setOffset(String offset) {
+ this.offset.setArg(" ", offset);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StrGatherTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StrGatherTask.java
new file mode 100644
index 0000000000..541e96f54f
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StrGatherTask.java
@@ -0,0 +1,471 @@
+/** @file
+This file is to define an ANT task which wraps StrGather.exe tool.
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ StrGather Task Class
+ class memberg
+ -commandType : command type [parse/scan/dump]
+ -baseName : base name of component
+ -verbose : level of verbose [all/read/write]
+ -outputDatabase : file name of output database file
+ -databaseList : file name list of database files
+ -inputFileList : file name list of input files
+ -newDatabase : whether to need new database [ture/false]
+ -unquotedString : whether to unquoted strings are used [ture/false]
+ -includePathList: path list of include paths
+ -ignoreNotFound : whether to ignore a given STRING_TOKEN(STR) is not found in database [ture/false]
+ -skipExtList : skip scan of files with extension name
+ -outputString : write string data to filename
+ -outputDefines : write string defines to filename
+ -outputUnicode : dump database to unicode file filename
+ -lang : only dump for the language
+ -indirectionFile: specify an indirection file
+ -outputHpk : create an HII export pack of the strings
+ **/
+public class StrGatherTask extends Task implements EfiDefine {
+ //
+ // Tool name
+ //
+ private static String toolName = "StrGather";
+
+ //
+ // common options
+ //
+ private ToolArg commandType = new ToolArg();
+
+ private ToolArg baseName = new ToolArg();
+
+ //
+ // "all/read/write"
+ //
+ private ToolArg verbose = new ToolArg();
+
+ private FileArg outputDatabase = new FileArg();
+
+ private Database databaseList = new Database();
+
+ private InputFile inputFileList = new InputFile();
+
+ //
+ // parse options newDatabase -- "ture/false" unquoteString -- "ture/false"
+ //
+ private ToolArg newDatabase = new ToolArg();
+
+ private ToolArg unquotedString = new ToolArg();
+
+ private IncludePath includePathList = new IncludePath();
+
+ //
+ // scan options ignoreNotFound -- "ture/false"
+ //
+ private ToolArg ignoreNotFound = new ToolArg();
+
+ private SkipExt skipExtList = new SkipExt();
+
+ //
+ // dump options
+ //
+ private ToolArg outputString = new ToolArg();
+
+ private ToolArg outputDefines = new ToolArg();
+
+ private ToolArg outputUnicode = new ToolArg();
+
+ private ToolArg lang = new ToolArg();
+
+ private FileArg indirectionFile = new FileArg();
+
+ private FileArg outputHpk = new FileArg();
+
+ //
+ // global variable
+ //
+ static private Project project;
+
+ /**
+ assemble tool command line & execute tool command line
+
+ @throws BuildException
+ **/
+ public void execute() throws BuildException {
+
+ project = this.getOwningTarget().getProject();
+ ///
+ /// absolute path of efi tools
+ ///
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+
+ ///
+ /// assemble argument
+ ///
+ String argument = "" + commandType + verbose + databaseList + baseName
+ + outputDatabase + includePathList + newDatabase + unquotedString
+ + skipExtList + ignoreNotFound + outputString + outputDefines
+ + outputUnicode + lang + indirectionFile + outputHpk
+ + inputFileList;
+ ///
+ /// return value of fwimage execution
+ ///
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+
+ String cmdType = getCommandType();
+ if (cmdType.equalsIgnoreCase("parse")) {
+ EdkLog.log(this, "(parse) " + inputFileList.toFileList() + " => "
+ + databaseList.toFileList());
+ } else if (cmdType.equalsIgnoreCase("scan")) {
+ EdkLog.log(this, "(scan) " + databaseList.toFileList() + " => "
+ + outputDatabase.toFileList());
+ } else {
+ EdkLog.log(this, "(dump) " + databaseList.toFileList() + " => "
+ + outputDefines.toFileList() + outputString.toFileList() + outputHpk.toFileList());
+ }
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+
+ revl = runner.execute();
+ if (EFI_SUCCESS == revl) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ ///
+ /// command execution fail
+ ///
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ get class member "commandType"
+
+ @returns commandType parameter
+ **/
+ public String getCommandType() {
+ return this.commandType.getValue();
+ }
+
+ /**
+ set class member ""
+
+ @param commandType type of strgather command [parse/scan/dump]
+ **/
+ public void setCommandType(String commandType) {
+ this.commandType.setArg(" -", commandType);
+ }
+
+ /**
+ get class member "verbose"
+
+ @returns verbose parameter
+ **/
+ public String getVerbose() {
+ return this.verbose.getValue();
+ }
+
+ /**
+ set class member "verbose"
+
+ @param verbose verbose level [all/read/write]
+ **/
+ public void setVerbose(String verbose) {
+ if (verbose.equals("all")) {
+ ///
+ /// for verbose output
+ ///
+ this.verbose.setArg(" -", "v");
+ } else if (verbose.equals("read")) {
+ ///
+ /// for verbose output when reading database
+ ///
+ this.verbose.setArg(" -", "vdbr");
+ } else if (verbose.equals("write")) {
+ ///
+ /// for verbose output when writing database
+ ///
+ this.verbose.setArg(" -", "vdbw");
+ }
+ }
+
+ /**
+ get class member baseName
+
+ @returns baseName parameter
+ **/
+ public String getBaseName() {
+ return this.baseName.getValue();
+ }
+
+ /**
+ set class member baseName
+
+ @param baseName name of the output files of .c and .h
+ **/
+ public void setBaseName(String baseName) {
+ this.baseName.setArg(" -bn ", baseName);
+ }
+
+ /**
+ get class member "outputDatabase"
+
+ @returns outputDatabase parameter
+ **/
+ public String getOutputDatabase() {
+ return this.outputDatabase.getValue();
+ }
+
+ /**
+ set class member "outputDatabase"
+
+ @param outputDatabase filename of output database file
+ **/
+ public void setOutputDatabase(String outputDatabase) {
+ this.outputDatabase.setArg(" -od ", outputDatabase);
+ }
+
+ /**
+ get class member "newDatabase"
+
+ @returns newDatabase parameter
+ **/
+ public boolean getNewDatabse() {
+ return this.newDatabase.getPrefix().length() > 0;
+ }
+
+ /**
+ set class member "newDatabase"
+
+ @param newDatabase whether to not read in existing database file
+ **/
+ public void setNewDatabase(boolean newDatabase) {
+ if (newDatabase) {
+ this.newDatabase.setArg(" -", "newdb");
+ }
+ }
+
+ /**
+ get class member "unquotedString"
+
+ @returns unquotedString parameter
+ **/
+ public boolean getUnquotedString() {
+ return this.unquotedString.getValue().length() > 0;
+ }
+
+ /**
+ set class member "unquotedString"
+
+ @param unquotedString :
+ whether to indicate that unquoted strings are used
+ **/
+ public void setUnquotedString(boolean unquotedString) {
+ if (unquotedString) {
+ this.unquotedString.setArg(" -", "uqs");
+ }
+ }
+
+ /**
+ get class member "ignoreNotFound"
+
+ @returns ignoreNotFound parameter
+ **/
+ public boolean getIgnoreNotFound() {
+ return this.ignoreNotFound.getValue().length() > 0;
+ }
+
+ /**
+ set class member "ignoreNotFound"
+
+ @param ignoreNotFound whether to ignore if a given STRING_TOKEN(STR)
+ is not found in the database
+ **/
+ public void setIgnoreNotFound(boolean ignoreNotFound) {
+ if (ignoreNotFound) {
+ this.ignoreNotFound.setArg(" -", "ignorenotfound");
+ }
+ }
+
+ /**
+ get class member "outputString"
+
+ @returns outputString parameter
+ **/
+ public String getOutputString() {
+ return this.outputString.getValue();
+ }
+
+ /**
+ set class member "outputString"
+
+ @param outputString filename of string data file
+ **/
+ public void setOutputString(String outputString) {
+ this.outputString.setArg(" -oc ", outputString);
+ }
+
+ /**
+ get class member "outputDefines"
+
+ @returns outputDefines parameter
+ **/
+ public String getOutputDefines() {
+ return this.outputDefines.getValue();
+ }
+
+ /**
+ set class member "outputDefines"
+
+ @param outputDefines filename of string defines file
+ **/
+ public void setOutputDefines(String outputDefines) {
+ this.outputDefines.setArg(" -oh ", outputDefines);
+ }
+
+ /**
+ get class member "outputUnicode"
+
+ @returns outputUnicode parameter
+ **/
+ public String getOutputUnicode() {
+ return this.outputUnicode.getValue();
+ }
+
+ /**
+ set class member "outputUnicode"
+
+ @param outputUnicode filename of unicode file to be dumped database
+ **/
+ public void setOutputUnicode(String outputUnicode) {
+ this.outputUnicode.setArg(" -ou ", outputUnicode);
+ }
+
+ /**
+ get class member "lang"
+
+ @returns lang parameter
+ **/
+ public String getLang() {
+ return this.lang.getValue();
+ }
+
+ /**
+ set class member "lang"
+
+ @param lang language of dump
+ **/
+ public void setLang(String lang) {
+ this.lang.setArg(" -lang ", lang);
+ }
+
+ /**
+ get class member "indirectionFile"
+
+ @returns indirectionFile parameter
+ **/
+ public String getIndirectionFile() {
+ return this.indirectionFile.getValue();
+ }
+
+ /**
+ set class member "indirectionFile"
+
+ @param indirectionFile filename of indirection file
+ **/
+ public void setIndirectionFile(String indirectionFile) {
+ this.indirectionFile.setArg(" -if ", indirectionFile);
+ }
+
+ /**
+ get class member "outputHpk"
+
+ @returns outputHpk parameter
+ **/
+ public String getOutputHpk() {
+ return this.outputHpk.getValue();
+ }
+
+ /**
+ set class member "outputHpk"
+
+ @param outputHpk filename of output HII export pack of the strings
+ **/
+ public void setOutputHpk(String outputHpk) {
+ this.outputHpk.setArg(" -hpk ", outputHpk);
+ }
+
+ /**
+ add a skipExt element into list
+
+ @param skipExt skipExt element
+ **/
+ public void addConfiguredSkipext(SkipExt skipExt) {
+ this.skipExtList.insert(skipExt);
+ };
+
+ /**
+ add a includePath element into list
+
+ @param includePath includePath element
+ **/
+ public void addConfiguredIncludepath(IncludePath includePath) {
+ this.includePathList.insert(includePath);
+ };
+
+ /**
+ add a inputFile element into list
+
+ @param inputFile inputFile element
+ **/
+ public void addConfiguredInputfile(InputFile inputFile) {
+ this.inputFileList.insert(inputFile);
+ };
+
+ /**
+ add a database element into list
+
+ @param database :
+ database element
+ **/
+ public void addConfiguredDatabase(Database database) {
+ this.databaseList.insert(database);
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StripTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StripTask.java
new file mode 100644
index 0000000000..9558f703b9
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/StripTask.java
@@ -0,0 +1,197 @@
+/** @file
+ StripTask class.
+
+ StripTask is used to call Strip.exe to strip input file.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ StripTask class.
+
+ StripTask is used to call Strip.exe to strip input file.
+ */
+public class StripTask extends Task implements EfiDefine {
+ //
+ //
+ //
+ private static String toolName = "Strip";
+ //
+ // input file
+ //
+ private FileArg inputFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg();
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+
+ /**
+ execute
+
+ StripTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separator + toolName;
+ }
+
+ //
+ // argument of tools
+ //
+ argument = "" + inputFile + outputFile;
+
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, inputFile.toFileList() + " => " + outputFile.toFileList());
+
+ revl = runner.execute();
+
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, toolName + " succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException(toolName + " failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getInputFile
+
+ This function is to get class member "inputFile".
+
+ @return string of input file name.
+ **/
+ public String getInputFile() {
+ return inputFile.getValue();
+ }
+
+ /**
+ setComponentType
+
+ This function is to set class member "inputFile".
+
+ @param inputFile
+ string of input file name.
+ **/
+ public void setInputFile(String inputFile) {
+ this.inputFile.setArg(" ", inputFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Tool.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Tool.java
new file mode 100644
index 0000000000..fbf69e288d
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/Tool.java
@@ -0,0 +1,242 @@
+/** @file
+This file is to define nested element which is meant for specifying a tool
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+
+import org.apache.tools.ant.BuildException;
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ Class Tool is to define an external tool to be used for genffsfile
+ **/
+public class Tool implements EfiDefine, Section {
+
+ private String toolName = "";
+ private ToolArg toolArgList = new ToolArg();
+ private Input inputFiles = new Input();
+ private Input tempInputFile = new Input();
+ private String outputPath;
+ private String outputFileName ;
+ private static Random ran = new Random(9999);
+ private List<Section> gensectList = new ArrayList<Section>();
+ /**
+ Call extern tool
+
+ @param buffer The buffer to put the result with alignment
+ **/
+ public void toBuffer (DataOutputStream buffer){
+ ///
+ /// call extern tool
+ ///
+ try {
+ executeTool ();
+ } catch (Exception e) {
+ throw new BuildException("Call to executeTool failed!\n" + e.getMessage());
+ }
+
+ ///
+ /// check if file exist
+ ///
+ File outputFile = new File (this.outputFileName);
+ if (!outputFile.exists()) {
+ throw new BuildException("The file " + outputFile.getPath() + " does not exist!\n");
+ }
+
+ ///
+ /// Read output file and write it's cotains to buffer
+ ///
+ FileInputStream fs = null;
+ DataInputStream in = null;
+ try {
+ fs = new FileInputStream (outputFile);
+ in = new DataInputStream (fs);
+
+
+ int fileLen = (int)outputFile.length();
+ byte[] data = new byte[fileLen];
+ in.read(data);
+ buffer.write(data, 0, fileLen);
+
+ ///
+ /// 4 byte alignment
+ ///
+ while ((fileLen & 0x03) != 0) {
+ fileLen++;
+ buffer.writeByte(0);
+ }
+ } catch (Exception e) {
+ EdkLog.log(e.getMessage());
+ throw new BuildException("Tool call, toBuffer failed!\n");
+ } finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ if (fs != null) {
+ fs.close();
+ }
+ outputFile.delete();
+ } catch (Exception e) {
+ EdkLog.log("WARNING: Cannot close " + outputFile.getPath());
+ }
+ }
+ }
+
+ ///
+ /// execute external tool for genffsfile
+ ///
+ private void executeTool () {
+ String command = "";
+ String argument = "";
+ command = toolName;
+
+ //
+ // Get each section which under the compress {};
+ // And add it is contains to File;
+ //
+ Section sect;
+ try{
+ Iterator SectionIter = this.gensectList.iterator();
+ while (SectionIter.hasNext()){
+ sect = (Section)SectionIter.next();
+ //
+ // Parse <genSection> element
+ //
+ File outputFile = File.createTempFile("temp", "sec1", new File(outputPath));
+ FileOutputStream bo = new FileOutputStream(outputFile);
+ DataOutputStream Do = new DataOutputStream (bo);
+ //
+ // Call each section class's toBuffer function.
+ //
+ try {
+ sect.toBuffer(Do);
+ }
+ catch (BuildException e) {
+ EdkLog.log(e.getMessage());
+ throw new BuildException ("GenSection failed at Tool!");
+ } finally {
+ if (Do != null){
+ Do.close();
+ }
+
+ }
+ this.tempInputFile.insFile(outputFile.getPath());
+ }
+ } catch (IOException e){
+ throw new BuildException ("Gensection failed at tool!");
+ }
+
+ try {
+ this.outputFileName = "Temp" + ran.nextInt();
+ argument = toolArgList + inputFiles.toStringWithSinglepPrefix(" -i ")
+ + tempInputFile.toString(" ")+ " -o " + outputFileName;
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, command + " " + argument);
+ ///
+ /// execute command line
+ ///
+ Process process = Runtime.getRuntime().exec(command + " " + argument);
+ process.waitFor();
+ Iterator tempFile = tempInputFile.getNameList().iterator();
+ while (tempFile.hasNext()){
+ File file = new File((String)tempFile.next());
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+ } catch (Exception e) { EdkLog.log(e.getMessage());
+ throw new BuildException("Execution of externalTool task failed!\n");
+ }
+ }
+
+ /**
+ Add method of ANT task/datatype for nested ToolArg type of element
+
+ @param toolArg The ToolArg object containing arguments for the tool
+ **/
+ public void addConfiguredToolArg (ToolArg toolArg) {
+ toolArgList.insert(toolArg);
+ }
+
+ /**
+ Get method of ANT task/datatype for attribute "OutputPath"
+
+ @returns The name of output path
+ **/
+ public String getOutputPath() {
+ return outputPath;
+ }
+
+ /**
+ Set method of ANT task/datatype for attribute "OutputPath"
+
+ @param outputPath The name of output path
+ **/
+ public void setOutputPath(String outPutPath) {
+ this.outputPath = outPutPath;
+ }
+
+ /**
+ Get method of ANT task/datatype for attribute "ToolName"
+
+ @returns The name of the tool.
+ **/
+ public String getToolName() {
+ return toolName;
+ }
+
+ /**
+ Set method of ANT task/datatype for attribute "ToolName"
+
+ @param toolName The name of the tool
+ **/
+ public void setToolName(String toolName) {
+ this.toolName = toolName;
+ }
+
+ /**
+ Add method of ANT task/datatype for nested Input type of element
+
+ @param file The Input objec which represents a file
+ **/
+ public void addConfiguredInput(Input file) {
+ inputFiles.insert(file);
+ }
+
+// /**
+// addTool
+//
+// This function is to add instance of Tool to list.
+//
+// @param tool instance of Tool.
+// **/
+// public void addTool(Tool tool){
+// this.toolList.add(tool);
+// }
+
+ public void addGenSection(GenSectionTask genSect){
+ this.gensectList.add(genSect);
+ }
+}
+
+
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ToolArg.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ToolArg.java
new file mode 100644
index 0000000000..ade6817955
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ToolArg.java
@@ -0,0 +1,151 @@
+/** @file
+This file is used to nest elements which is meant for tool's argument
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+/**
+ ToolArg class is defined to represent the argument of a tool. The argument
+ includes the prefix (e.g. -I, -o) and the value.
+ **/
+public class ToolArg extends NestElement {
+ ///
+ /// A constant which is used to represent an empty argument
+ ///
+ public final static ToolArg EMPTY_ARG = new ToolArg();
+
+ //
+ // Keep track the prefix of this argument
+ //
+ private String prefix = "";
+
+ /**
+ Default constructor
+ **/
+ public ToolArg() {
+ }
+
+ /**
+ Constructor which will initialize the prefix of this argument
+
+ @param prefix The string of prefix
+ */
+ public ToolArg(String prefix) {
+ this.prefix = prefix;
+ }
+
+ /**
+ Constructor which will initialize both the prefix and value of this argument
+
+ @param prefix The prefix of this argument
+ @param value The value of this argument
+ */
+ public ToolArg(String prefix, String value) {
+ setArg(prefix, value);
+ }
+
+ /**
+ Set the prefix and value of this argument
+
+ @param prefix The prefix of this argument
+ @param value The value of this argument
+ */
+ public void setArg(String prefix, String value) {
+ this.prefix = prefix;
+ super.setName(value);
+ }
+
+ /**
+ Set the prefix of this argument
+
+ @param prefix The prefix of this argument
+ */
+ public void setPrefix(String prefix) {
+ this.prefix = prefix;
+ }
+
+ /**
+ Get the prefix of this argument
+
+ @return String The prefix of this argument
+ */
+ public String getPrefix() {
+ return this.prefix.trim();
+ }
+
+ /**
+ Set the value of this argument
+
+ @param value The value of this argument
+ */
+ public void setValue(String value) {
+ super.setName(value);
+ }
+
+ /**
+ Add a value for this argument
+
+ @param value The value of this argument
+ */
+ public void insValue(String value) {
+ super.insName(value);
+ }
+
+ /**
+ Get the value list of this argument, separated by space
+
+ @return String The value list
+ */
+ public String getValue() {
+ return super.toString(" ").trim();
+ }
+
+ /**
+ Set the argument as a whole
+
+ @param line The argument string line
+ */
+ public void setLine(String line) {
+ //
+ // Since the prefix is in the "line", we don't need another prefix.
+ //
+ this.prefix = " ";
+ super.setName(line);
+ }
+
+ /**
+ Get the argument line
+
+ @return String The argument string line
+ */
+ public String getLine() {
+ return this.toString();
+ }
+
+ /**
+ Compose a complete argument string.
+
+ @return String The complete argument
+ */
+ public String toString() {
+ return super.toString(prefix);
+ }
+
+ /**
+ Check if the argument is empty or not
+
+ @return boolean
+ **/
+ public boolean isEmpty() {
+ return (prefix.length() == 0) && (nameList.isEmpty());
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/VfrCompilerTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/VfrCompilerTask.java
new file mode 100644
index 0000000000..5897bd2b09
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/VfrCompilerTask.java
@@ -0,0 +1,215 @@
+/** @file
+This file is to define an ANT task which wraps VfrCompile.exe tool
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ VfrcompilerTask Task Class
+ class member
+ -createListFile : create an output IFR listing file.
+ -outPutDir : deposit all output files to directory OutputDir (default=cwd)
+ -createIfrBinFile: create an IFR HII pack file
+ -vfrFile : name of the input VFR script file
+ -processArg : c processer argument
+ -includepathList : add IncPath to the search path for VFR included files
+ **/
+public class VfrCompilerTask extends Task implements EfiDefine {
+ private static String toolName = "VfrCompile";
+
+ private ToolArg createListFile = new ToolArg();
+ private ToolArg createIfrBinFile = new ToolArg();
+ private ToolArg processerArg = new ToolArg();
+ private FileArg vfrFile = new FileArg();
+ private IncludePath includepathList = new IncludePath();
+ private FileArg outPutDir = new FileArg(" -od ", ".");
+ private String dllPath = "";
+
+ /**
+ get class member of createList file
+
+ @returns file name of createList
+ **/
+ public boolean getCreateListFile() {
+ return this.createListFile.getValue().length() > 0;
+ }
+
+ /**
+ set class member of createList file
+
+ @param createListFile if createList string equal "on" set '-l' flag
+ **/
+ public void setCreateListFile(boolean createListFile) {
+ if (createListFile) {
+ this.createListFile.setArg(" -", "l");
+ }
+ }
+
+ /**
+ get output dir
+
+ @returns name of output dir
+ **/
+ public String getOutPutDir() {
+ return this.outPutDir.getValue();
+ }
+
+ /**
+ set class member of outPutDir
+
+ @param outPutDir The directory name for ouput file
+ **/
+ public void setOutPutDir(String outPutDir) {
+ this.outPutDir.setArg(" -od ", outPutDir);
+ }
+
+
+ /**
+ get class member of ifrBinFile
+
+ @return file name of ifrBinFile
+ **/
+ public boolean getCreateIfrBinFile() {
+ return this.createIfrBinFile.getValue().length() > 0;
+ }
+
+ /**
+ set class member of ifrBinFile
+
+ @param createIfrBinFile The flag to specify if the IFR binary file should
+ be generated or not
+ */
+ public void setCreateIfrBinFile(boolean createIfrBinFile) {
+ if (createIfrBinFile) {
+ this.createIfrBinFile.setArg(" -", "ibin");
+ }
+ }
+
+ /**
+ get class member of vfrFile
+
+ @returns name of vfrFile
+ **/
+ public String getVfrFile() {
+ return this.vfrFile.getValue();
+ }
+
+ /**
+ set class member of vfrFile
+
+ @param vfrFile The name of VFR file
+ **/
+ public void setVfrFile(String vfrFile) {
+ this.vfrFile.setArg(" ", vfrFile);
+ }
+
+ /**
+ add includePath in includepath List
+
+ @param includepath The IncludePath object which represents include path
+ **/
+ public void addConfiguredIncludepath(IncludePath includepath){
+ this.includepathList.insert(includepath);
+ }
+
+ /**
+ get class member of processerArg
+
+ @returns processer argument
+ **/
+ public String getProcesserArg() {
+ return this.processerArg.getValue();
+ }
+
+
+ /**
+ set class member of processerArg
+
+ @param processerArg The processor argument
+ */
+ public void setProcesserArg(String processerArg) {
+ this.processerArg.setArg(" -ppflag ", processerArg);
+ }
+
+ public void setDllPath(String dllPath) {
+ this.dllPath = dllPath;
+ }
+
+ /**
+ The standard execute method of ANT task.
+ **/
+ public void execute() throws BuildException {
+ Project project = this.getProject();
+ String toolPath= project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ if (toolPath == null) {
+ command = toolName;
+ } else {
+ command = toolPath + File.separator + toolName;
+ }
+
+ String argument = "" + createIfrBinFile
+ + processerArg
+ + includepathList
+ + outPutDir
+ + createListFile
+ + vfrFile;
+ try {
+ ///
+ /// constructs the command-line
+ ///
+ Commandline commandLine = new Commandline();
+ commandLine.setExecutable(command);
+ commandLine.createArgument().setLine(argument);
+
+ ///
+ /// configures the Execute object
+ ///
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO,
+ Project.MSG_WARN);
+
+ Execute runner = new Execute(streamHandler,null);
+ runner.setAntRun(project);
+ runner.setCommandline(commandLine.getCommandline());
+ runner.setWorkingDirectory(new File(outPutDir.getValue()));
+ runner.setEnvironment(new String[]{"PATH", dllPath});
+
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(commandLine.getCommandline()));
+ EdkLog.log(this, vfrFile.toFileList());
+
+ int returnVal = runner.execute();
+ if (EFI_SUCCESS == returnVal) {
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "VfrCompile succeeded!");
+ } else {
+ EdkLog.log(this, "ERROR = " + Integer.toHexString(returnVal));
+ throw new BuildException("VfrCompile failed!");
+ }
+ } catch (IOException e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+}
diff --git a/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ZeroDebugDataTask.java b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ZeroDebugDataTask.java
new file mode 100644
index 0000000000..f60b8a6bb8
--- /dev/null
+++ b/Tools/Java/Source/FrameworkTasks/org/tianocore/framework/tasks/ZeroDebugDataTask.java
@@ -0,0 +1,195 @@
+/** @file
+ ZeroDebugDataTask class.
+
+ ZeroDebugDataTask is used to call ZeroDebugData.exe to remove debug data.
+
+
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ **/
+package org.tianocore.framework.tasks;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Execute;
+import org.apache.tools.ant.taskdefs.LogStreamHandler;
+import org.apache.tools.ant.types.Commandline;
+
+import org.tianocore.common.logger.EdkLog;
+
+/**
+ ZeroDebugDataTask class.
+
+ ZeroDebugDataTask is used to call ZeroDebugData.exe to remove debug data.
+**/
+public class ZeroDebugDataTask extends Task implements EfiDefine {
+ //
+ // Tool name
+ //
+ private static String toolName = "ZeroDebugData";
+ //
+ // input PE file
+ //
+ private FileArg peFile = new FileArg();
+
+ //
+ // output file
+ //
+ private FileArg outputFile = new FileArg(" ", "DebugData.dat");
+
+ //
+ // output directory, this variable is added by jave wrap
+ //
+ private String outputDir = ".";
+
+
+ /**
+ execute
+
+ ZeroDebugDataTask execute function is to assemble tool command line & execute
+ tool command line
+
+ @throws BuidException
+ **/
+ public void execute() throws BuildException {
+
+ Project project = this.getOwningTarget().getProject();
+
+ //
+ // absolute path of efi tools
+ //
+ String path = project.getProperty("env.FRAMEWORK_TOOLS_PATH");
+ String command;
+ String argument;
+ if (path == null) {
+ command = toolName;
+ } else {
+ command = path + File.separatorChar + toolName;
+ }
+
+ //
+ // argument of tools
+ //
+ argument = "" + peFile + outputFile;
+
+ //
+ // return value of fwimage execution
+ //
+ int revl = -1;
+
+ try {
+ Commandline cmdline = new Commandline();
+ cmdline.setExecutable(command);
+ cmdline.createArgument().setLine(argument);
+
+ LogStreamHandler streamHandler = new LogStreamHandler(this,
+ Project.MSG_INFO, Project.MSG_WARN);
+ Execute runner = new Execute(streamHandler, null);
+
+ runner.setAntRun(project);
+ runner.setCommandline(cmdline.getCommandline());
+ runner.setWorkingDirectory(new File(outputDir));
+ //
+ // Set debug log information.
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
+ EdkLog.log(this, EdkLog.EDK_INFO, peFile.toFileList() + " => " + outputFile.toFileList());
+
+ revl = runner.execute();
+
+ if (EFI_SUCCESS == revl) {
+ //
+ // command execution success
+ //
+ EdkLog.log(this, EdkLog.EDK_VERBOSE, "ZeroDebugData succeeded!");
+ } else {
+ //
+ // command execution fail
+ //
+ EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
+ throw new BuildException("ZeroDebugData failed!");
+ }
+ } catch (Exception e) {
+ throw new BuildException(e.getMessage());
+ }
+ }
+
+ /**
+ getPeFile
+
+ This function is to get class member "inputFile".
+
+ @return string of input file name.
+ **/
+ public String getPeFile() {
+ return this.peFile.getValue();
+ }
+
+ /**
+ setPeFile
+
+ This function is to set class member "peFile".
+
+ @param peFile
+ string of input file name.
+ **/
+ public void setPeFile(String peFile) {
+ this.peFile.setArg(" ", peFile);
+ }
+
+ /**
+ getOutputFile
+
+ This function is to get class member "outputFile"
+
+ @return outputFile string of output file name.
+ **/
+ public String getOutputFile() {
+ return this.outputFile.getValue();
+ }
+
+ /**
+ setOutputFile
+
+ This function is to set class member "outputFile"
+
+ @param outputFile
+ string of output file name.
+ **/
+ public void setOutputFile(String outputFile) {
+ this.outputFile.setArg(" ", outputFile);
+ }
+
+ /**
+ getOutputDir
+
+ This function is to get class member "outputDir"
+
+ @return outputDir string of output directory.
+ **/
+ public String getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ setOutputDir
+
+ This function is to set class member "outputDir"
+
+ @param outputDir
+ string of output directory.
+ **/
+ public void setOutputDir(String outputDir) {
+ this.outputDir = outputDir;
+ }
+}