(Customized Compression)If setting the EncapsulationType="Compress", Tool will transfer it to sectiontype="EFI_SECTION_COMPRESS" in <gensection>element of <genffsFile> task.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1529 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qouyang 2006-09-13 09:20:36 +00:00
parent d965d1f63f
commit 5c4eec41d7
7 changed files with 206 additions and 189 deletions

View File

@ -17,12 +17,6 @@
package org.tianocore.framework.tasks;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;

View File

@ -16,8 +16,6 @@
**/
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;

View File

@ -23,9 +23,6 @@ import org.apache.tools.ant.taskdefs.LogStreamHandler;
import org.apache.tools.ant.types.Commandline;
import java.io.File;
import java.io.InputStreamReader;
import java.lang.ProcessBuilder;
import java.util.LinkedList;
import org.tianocore.common.logger.EdkLog;

View File

@ -12,13 +12,12 @@
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;
@ -31,40 +30,51 @@ 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 {
public class GenSectionTask extends Task implements EfiDefine, Section,
FfsTypes {
//
// 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
**/
* 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();
@ -80,7 +90,8 @@ public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes
//
// argument of tools
//
String argument = "" + inputFile + outputFile + sectionType + versionNum + interfaceString;
String argument = "" + inputFile + outputFile + sectionType
+ versionNum + interfaceString;
//
// return value of gensection execution
//
@ -98,8 +109,10 @@ public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes
runner.setAntRun(project);
runner.setCommandline(cmdline.getCommandline());
EdkLog.log(this, inputFile.toFileList() + " => " + outputFile.toFileList());
EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline.getCommandline()));
EdkLog.log(this, inputFile.toFileList() + " => "
+ outputFile.toFileList());
EdkLog.log(this, EdkLog.EDK_VERBOSE, Commandline.toString(cmdline
.getCommandline()));
revl = runner.execute();
if (EFI_SUCCESS == revl) {
@ -108,7 +121,8 @@ public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes
//
// command execution fail
//
EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = " + Integer.toHexString(revl));
EdkLog.log(this, EdkLog.EDK_INFO, "ERROR = "
+ Integer.toHexString(revl));
throw new BuildException("GenSection failed!");
}
} catch (Exception e) {
@ -117,252 +131,264 @@ public class GenSectionTask extends Task implements EfiDefine, Section, FfsTypes
}
/**
getInputFile
This function is to get class member "inputFile".
@return name of input file
**/
* 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
**/
* 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
**/
* 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
**/
* 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
**/
* 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
**/
* 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
**/
* 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
**/
* 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
**/
* 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
**/
* 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){
* 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
**/
* 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){
* 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){
public void toBuffer(DataOutputStream buffer) {
//
// Search SectionList find earch section and call it's
// ToBuffer function.
// Search SectionList find earch section and call it's
// ToBuffer function.
//
if (this.sectionType.getValue().equalsIgnoreCase("EFI_SECTION_COMPRESSION")){
Section sect;
if (this.sectionType.getValue().equalsIgnoreCase(
"EFI_SECTION_COMPRESSION")
&& !this.haveTool) {
Section sect;
//
// Get section file in compress node.
// Get section file in compress node.
//
try{
ByteArrayOutputStream bo = new ByteArrayOutputStream ();
DataOutputStream Do = new DataOutputStream (bo);
try {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
DataOutputStream Do = new DataOutputStream(bo);
//
// Get each section which under the compress {};
// And add it is contains to File;
// 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();
while (SectionIter.hasNext()) {
sect = (Section) SectionIter.next();
//
// Call each section class's toBuffer function.
// Call each section class's toBuffer function.
//
try {
sect.toBuffer(Do);
}
catch (BuildException e) {
} catch (BuildException e) {
System.out.print(e.getMessage());
throw new BuildException ("Compress.toBuffer failed at section");
}
throw new BuildException(
"Compress.toBuffer failed at section");
}
}
Do.close();
Do.close();
//
// Call compress
// 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);
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){
} catch (Exception e) {
throw new BuildException("compress.toBuffer failed!\n");
}
}
} else {
Section sect;
Iterator sectionIter = this.sectFileList.iterator();
while (sectionIter.hasNext()) {
sect = (Section)sectionIter.next();
sect = (Section) sectionIter.next();
try {
//
// The last section don't need 4 byte ffsAligment.
// The last section don't need 4 byte ffsAligment.
//
sect.toBuffer(buffer);
} catch (Exception e) {
throw new BuildException (e.getMessage());
throw new BuildException(e.getMessage());
}
}
}

View File

@ -14,8 +14,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
package org.tianocore.framework.tasks;
import java.io.File;
import java.util.*;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;

View File

@ -13,7 +13,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
package org.tianocore.framework.tasks;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;

View File

@ -273,7 +273,12 @@ public class FfsProcess {
//
ele = doc.createElement("gensection");
if (type != null) {
ele.setAttribute("sectiontype", "EFI_SECTION_GUID_DEFINED");
if (type.equalsIgnoreCase("COMPRESS")) {
ele.setAttribute("sectionType", "EFI_SECTION_COMPRESSION");
}else {
ele.setAttribute("sectiontype", "EFI_SECTION_GUID_DEFINED");
}
} else {
ele.setAttribute("sectiontype", sectType);
}