+ \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
+ }\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.equalsIgnoreCase("EFI_SECTION_COMPRESSION")){\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
+ }\r
+ catch (BuildException e) {\r
+ System.out.print(e.getMessage());\r
+ throw new BuildException ("Compress.toBuffer failed at section");\r
+ } \r
+ \r
+ }\r
+ Do.close(); \r
+ \r
+ //\r
+ // Call compress\r
+ //\r
+ byte[] fileBuffer = bo.toByteArray();\r
+ Compress myCompress = new Compress(fileBuffer, fileBuffer.length); \r
+ \r
+ //\r
+ // Add Compress header\r
+ //\r
+ CompressHeader Ch = new CompressHeader();\r
+ Ch.SectionHeader.Size[0] = (byte)((myCompress.outputBuffer.length +\r
+ Ch.GetSize()) &\r
+ 0xff\r
+ );\r
+ Ch.SectionHeader.Size[1] = (byte)(((myCompress.outputBuffer.length + \r
+ Ch.GetSize())&\r
+ 0xff00) >> 8\r
+ );\r
+ Ch.SectionHeader.Size[2] = (byte)(((myCompress.outputBuffer.length + \r
+ Ch.GetSize()) & \r
+ 0xff0000) >> 16\r
+ );\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 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 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