mirror of https://github.com/acidanthera/audk.git
(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:
parent
d965d1f63f
commit
5c4eec41d7
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue