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