You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by sj...@apache.org on 2008/06/03 16:17:00 UTC

svn commit: r662810 - in /harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200: BHSDCodec.java BandSet.java CPClass.java Codec.java CpBands.java PopulationCodec.java RunCodec.java Segment.java SegmentHeader.java

Author: sjanuary
Date: Tue Jun  3 07:17:00 2008
New Revision: 662810

URL: http://svn.apache.org/viewvc?rev=662810&view=rev
Log:
Pack200 segment header and supporting encode methods

Modified:
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
    harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BHSDCodec.java Tue Jun  3 07:17:00 2008
@@ -308,6 +308,10 @@
         return bytes;
     }
 
+    public byte[] encode(long value) throws Pack200Exception {
+        return encode(value, 0);
+    }
+
     /**
      * Returns true if this codec is a delta codec
      *

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/BandSet.java Tue Jun  3 07:17:00 2008
@@ -22,11 +22,14 @@
 
 public abstract class BandSet {
 
-    public abstract void pack(OutputStream out) throws IOException;
+    public abstract void pack(OutputStream out) throws IOException, Pack200Exception;
 
-    protected byte[] encodeScalar(int[] band) {
-        // TODO Auto-generated method stub
-        return null;
+    public byte[] encodeScalar(int[] band, BHSDCodec codec) throws Pack200Exception {
+        return codec.encode(band);
+    }
+
+    public byte[] encodeScalar(int value, BHSDCodec codec) throws Pack200Exception {
+        return codec.encode(value);
     }
 
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CPClass.java Tue Jun  3 07:17:00 2008
@@ -17,7 +17,7 @@
 package org.apache.harmony.pack200;
 
 
-public class CPClass {
+public class CPClass implements Comparable {
 
 
     private final String className;
@@ -26,4 +26,8 @@
         this.className = className;
     }
 
+    public int compareTo(Object arg0) {
+        return className.compareTo(((CPClass)arg0).className);
+    }
+
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Codec.java Tue Jun  3 07:17:00 2008
@@ -103,6 +103,30 @@
             Pack200Exception;
 
     /**
+     * Encode a single value into a sequence of bytes.
+     * 
+     * @param value
+     *            the value to encode
+     * @param last
+     *            the previous value encoded (for delta encodings)
+     * @return the encoded bytes
+     * @throws Pack200Exception
+     */
+    public abstract byte[] encode(long value, long last)
+            throws Pack200Exception;
+
+    /**
+     * Encode a single value into a sequence of bytes. Note that this method can
+     * only be used for non-delta encodings.
+     * 
+     * @param value
+     *            the value to encode
+     * @return the encoded bytes
+     * @throws Pack200Exception
+     */
+    public abstract byte[] encode(long value) throws Pack200Exception;
+
+    /**
      * Decode a sequence of bytes from the given input stream, returning the
      * value as a long. If this encoding is a delta encoding (d=1) then the
      * previous value must be passed in as a parameter. If it is a non-delta
@@ -250,4 +274,29 @@
         }
         return result;
     }
+
+    /**
+     * Encode a sequence of integers into a byte array
+     * 
+     * @param ints
+     *            the values to encode
+     * @return byte[] encoded bytes
+     * @throws Pack200Exception
+     *             if there is a problem encoding any of the values
+     */
+    public byte[] encode(int[] ints) throws Pack200Exception {
+        int total = 0;
+        byte[][] bytes = new byte[ints.length][];
+        for (int i = 0; i < ints.length; i++) {
+            bytes[i] = encode(ints[i]);
+            total += bytes[i].length;
+        }
+        byte[] encoded = new byte[total];
+        int index = 0;
+        for (int i = 0; i < bytes.length; i++) {
+            System.arraycopy(bytes[i], 0, encoded, index, bytes[i].length);
+            index += bytes[i].length;
+        }
+        return encoded;
+    }
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/CpBands.java Tue Jun  3 07:17:00 2008
@@ -129,17 +129,21 @@
     public void addConstantNameAndType(ConstantNameAndType constant) {
         String name = constant.getName(currentConstantPool);
         String signature = constant.getSignature(currentConstantPool);
-        cp_Signature.add(signature);
-        CPNameAndType nameAndType = new CPNameAndType(name,
-                signature);
-        stringsToCpNameAndType.put(name + ":" + signature, nameAndType);
-        cp_Descr.add(nameAndType);
+        String descr = name + ":" + signature;
+        if(stringsToCpNameAndType.get(descr) != null) {
+            cp_Signature.add(signature);
+            CPNameAndType nameAndType = new CPNameAndType(name,
+                    signature);
+            stringsToCpNameAndType.put(descr, nameAndType);
+            cp_Descr.add(nameAndType);
+        }
     }
 
     public void addConstantString(ConstantString constant) {
         String string = constant.getBytes(currentConstantPool);
-        if(stringsToCpString.get(string) == null) {
-            CPString cpString = new CPString(string);
+        CPString cpString = (CPString) stringsToCpString.get(string);
+        if(cpString == null) {
+            cpString = new CPString(string);
             cp_String.add(cpString);
             stringsToCpString.put(string, cpString);
         }
@@ -159,18 +163,25 @@
     }
 
     public CPClass getCPClass(String className) {
-        if(stringsToCpClass.get(className) == null) {
-            throw new RuntimeException("null");
+        CPClass cpClass = (CPClass) stringsToCpClass.get(className);
+        if(cpClass == null) {
+            cpClass = new CPClass(className);
+            cp_Class.add(cpClass);
+            stringsToCpClass.put(className, cpClass);
         }
-        return (CPClass) stringsToCpClass.get(className);
+        return cpClass;
     }
 
     public CPNameAndType getCPNameAndType(String name, String signature) {
-        String str = name + ":" + signature;
-        if(stringsToCpNameAndType.get(str) == null) {
-            throw new RuntimeException("null");
+        String descr = name + ":" + signature;
+        CPNameAndType nameAndType = (CPNameAndType) stringsToCpNameAndType.get(descr);
+        if (nameAndType == null) {
+            cp_Signature.add(signature);
+            nameAndType = new CPNameAndType(name, signature);
+            stringsToCpNameAndType.put(descr, nameAndType);
+            cp_Descr.add(nameAndType);
         }
-        return (CPNameAndType) stringsToCpNameAndType.get(str);
+        return nameAndType;
     }
 
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/PopulationCodec.java Tue Jun  3 07:17:00 2008
@@ -137,4 +137,14 @@
     public Codec getUnvafouredCodec() {
         return unvafouredCodec;
     }
+
+    public byte[] encode(long value, long last) throws Pack200Exception {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public byte[] encode(long value) throws Pack200Exception {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/RunCodec.java Tue Jun  3 07:17:00 2008
@@ -125,4 +125,14 @@
         return "RunCodec[k=" + k + ";aCodec=" + aCodec + "bCodec=" + bCodec
                 + "]";
     }
+
+    public byte[] encode(long value, long last) throws Pack200Exception {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public byte[] encode(long value) throws Pack200Exception {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/Segment.java Tue Jun  3 07:17:00 2008
@@ -75,7 +75,7 @@
     private BcBands bcBands;
     private FileBands fileBands;
 
-    public void pack(List classes, OutputStream out) throws IOException {
+    public void pack(List classes, OutputStream out) throws IOException, Pack200Exception {
         segmentHeader = new SegmentHeader();
         cpBands = new CpBands();
         attributeDefinitionBands = new AttributeDefinitionBands();

Modified: harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java?rev=662810&r1=662809&r2=662810&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java (original)
+++ harmony/enhanced/classlib/trunk/modules/pack200/src/main/java/org/apache/harmony/pack200/SegmentHeader.java Tue Jun  3 07:17:00 2008
@@ -19,79 +19,298 @@
 import java.io.IOException;
 import java.io.OutputStream;
 
-
+/**
+ * SegmentHeader is the header band of a {@link Segment}
+ */
 public class SegmentHeader extends BandSet {
 
     private static final int[] magic = { 0xCA, 0xFE, 0xD0, 0x0D };
+    private static final int archive_minver = 7;
+    private static final int archive_majver = 150;
+
+    private int archive_options;
+
+    private int cp_Utf8_count;
+    private int cp_Int_count;
+    private int cp_Float_count;
+    private int cp_Long_count;
+    private int cp_Double_count;
+    private int cp_String_count;
+    private int cp_Class_count;
+    private int cp_Signature_count;
+    private int cp_Descr_count;
+    private int cp_Field_count;
+    private int cp_Method_count;
+    private int cp_Imethod_count;
+
+    private int attribute_definition_count;
+    private final byte[] band_headers = new byte[0];
+
+    private boolean have_all_code_flags;
+
+    private int archive_size_hi;
+    private int archive_size_lo;
+    private int archive_next_count;
+    private int archive_modtime;
+    private int file_count;
+
+    private boolean deflate_hint;
+    private boolean have_file_modtime;
+    private boolean  have_file_options;
+    private boolean  have_file_size_hi;
+    private boolean  have_class_flags_hi;
+    private boolean  have_field_flags_hi;
+    private boolean  have_method_flags_hi;
+    private boolean  have_code_flags_hi;
+
+    private int ic_count;
+    private int default_class_minver;
+    private int default_class_majver;
+    private int class_count;
+
+    /**
+     * Encode and write the SegmentHeader bands to the OutputStream
+     */
+    public void pack(OutputStream out) throws IOException, Pack200Exception {
+        out.write(encodeScalar(magic, Codec.BYTE1));
+        out.write(encodeScalar(archive_minver, Codec.UNSIGNED5));
+        out.write(encodeScalar(archive_majver, Codec.UNSIGNED5));
+        calculateArchiveOptions();
+        out.write(encodeScalar(archive_options, Codec.UNSIGNED5));
+        writeArchiveFileCounts(out);
+        writeArchiveSpecialCounts(out);
+        writeCpCounts(out);
+        writeClassCounts(out);
+        if (band_headers.length > 0) {
+            out.write(band_headers);
+        }
+    }
+
+    private void calculateArchiveOptions() {
+        if(attribute_definition_count > 0 || band_headers.length > 0) {
+            archive_options |= 1;
+        }
+        if(cp_Int_count > 0 || cp_Float_count > 0 || cp_Long_count > 0 || cp_Double_count > 0) {
+            archive_options |= (1 << 1);
+        }
+        if(have_all_code_flags) {
+            archive_options |= (1 << 2);
+        }
+        if(file_count > 0) {
+            archive_options |= (1 << 4);
+        }
+        if(deflate_hint) {
+            archive_options |= (1 << 5);
+        }
+        if(have_file_modtime) {
+            archive_options |= (1 << 6);
+        }
+        if(have_file_options) {
+            archive_options |= (1 << 7);
+        }
+        if(have_file_size_hi) {
+            archive_options |= (1 << 8);
+        }
+        if(have_class_flags_hi) {
+            archive_options |= (1 << 9);
+        }
+        if(have_field_flags_hi) {
+            archive_options |= (1 << 10);
+        }
+        if(have_method_flags_hi) {
+            archive_options |= (1 << 11);
+        }
+        if(have_code_flags_hi) {
+            archive_options |= (1 << 12);
+        }
+    }
+
+    public void setCp_Utf8_count(int count) {
+        cp_Utf8_count = count;
+    }
+
+    public void setCp_Int_count(int count) {
+        cp_Int_count = count;
+    }
+
+    public void setCp_Float_count(int count) {
+        cp_Float_count = count;
+    }
+
+    public void setCp_Long_count(int count) {
+        cp_Long_count = count;
+    }
+
+    public void setCp_Double_count(int count) {
+        cp_Double_count = count;
+    }
+
+    public void setCp_String_count(int count) {
+        cp_String_count = count;
+    }
+
+    public void setCp_Class_count(int count) {
+        cp_Class_count = count;
+    }
+
+    public void setCp_Signature_count(int count) {
+        cp_Signature_count = count;
+    }
+
+    public void setCp_Descr_count(int count) {
+        cp_Descr_count = count;
+    }
+
+    public void setCp_Field_count(int count) {
+        cp_Field_count = count;
+    }
+
+    public void setCp_Method_count(int count) {
+        cp_Method_count = count;
+    }
+
+    public void setCp_Imethod_count(int count) {
+        cp_Imethod_count = count;
+    }
+
+    public void setAttributeDefinition_count(int count) {
+        attribute_definition_count = count;
+    }
 
-    private int cpUtf8Count;
-    private int cpIntCount;
-    private int cpFloatCount;
-    private int cpLongCount;
-    private int cpDoubleCount;
-    private int cpStringCount;
-    private int cpClassCount;
-    private int cpSignatureCount;
-    private int cpDescrCount;
-    private int cpFieldCount;
-    private int cpMethodCount;
-    private int cpImethodCount;
-    private int attributeDefinitionCount;
 
-    public void pack(OutputStream out) throws IOException {
-        out.write(encodeScalar(magic));
+    public void setAttribute_definition_count(int attribute_definition_count) {
+        this.attribute_definition_count = attribute_definition_count;
     }
 
-    public void setCpUtf8Count(int count) {
-        cpUtf8Count = count;
+
+    public void setHave_all_code_flags(boolean have_all_code_flags) {
+        this.have_all_code_flags = have_all_code_flags;
     }
 
-    public void setCpIntCount(int count) {
-        cpIntCount = count;
+
+    public void setArchive_size_hi(int archive_size_hi) {
+        this.archive_size_hi = archive_size_hi;
     }
 
-    public void setCpFloatCount(int count) {
-        cpFloatCount = count;
+
+    public void setArchive_size_lo(int archive_size_lo) {
+        this.archive_size_lo = archive_size_lo;
     }
 
-    public void setCpLongCount(int count) {
-        cpLongCount = count;
+
+    public void setArchive_next_count(int archive_next_count) {
+        this.archive_next_count = archive_next_count;
     }
 
-    public void setCpDoubleCount(int count) {
-        cpDoubleCount = count;
+
+    public void setArchive_modtime(int archive_modtime) {
+        this.archive_modtime = archive_modtime;
     }
 
-    public void setCpStringCount(int count) {
-        cpStringCount = count;
+
+    public void setFile_count(int file_count) {
+        this.file_count = file_count;
     }
 
-    public void setCpClassCount(int count) {
-        cpClassCount = count;
+
+    public void setDeflate_hint(boolean deflate_hint) {
+        this.deflate_hint = deflate_hint;
     }
 
-    public void setCpSignatureCount(int count) {
-        cpSignatureCount = count;
+
+    public void setHave_file_modtime(boolean have_file_modtime) {
+        this.have_file_modtime = have_file_modtime;
     }
 
-    public void setCpDescrCount(int count) {
-        cpDescrCount = count;
+
+    public void setHave_file_options(boolean have_file_options) {
+        this.have_file_options = have_file_options;
+    }
+
+
+    public void setHave_file_size_hi(boolean have_file_size_hi) {
+        this.have_file_size_hi = have_file_size_hi;
+    }
+
+
+    public void setHave_class_flags_hi(boolean have_class_flags_hi) {
+        this.have_class_flags_hi = have_class_flags_hi;
+    }
+
+
+    public void setHave_field_flags_hi(boolean have_field_flags_hi) {
+        this.have_field_flags_hi = have_field_flags_hi;
+    }
+
+
+    public void setHave_method_flags_hi(boolean have_method_flags_hi) {
+        this.have_method_flags_hi = have_method_flags_hi;
+    }
+
+
+    public void setHave_code_flags_hi(boolean have_code_flags_hi) {
+        this.have_code_flags_hi = have_code_flags_hi;
+    }
+
+
+    public void setIc_count(int ic_count) {
+        this.ic_count = ic_count;
+    }
+
+
+    public void setDefault_class_minver(int default_class_minver) {
+        this.default_class_minver = default_class_minver;
+    }
+
+
+    public void setDefault_class_majver(int default_class_majver) {
+        this.default_class_majver = default_class_majver;
+    }
+
+
+    public void setClass_count(int class_count) {
+        this.class_count = class_count;
     }
 
-    public void setCpFieldCount(int count) {
-        cpFieldCount = count;
+    private void writeCpCounts(OutputStream out) throws IOException, Pack200Exception {
+        out.write(encodeScalar(cp_Utf8_count, Codec.UNSIGNED5));
+        if((archive_options & (1 << 1)) != 0) { // have_cp_numbers
+            out.write(encodeScalar(cp_Int_count, Codec.UNSIGNED5));
+            out.write(encodeScalar(cp_Float_count, Codec.UNSIGNED5));
+            out.write(encodeScalar(cp_Long_count, Codec.UNSIGNED5));
+            out.write(encodeScalar(cp_Double_count, Codec.UNSIGNED5));
+        }
+        out.write(encodeScalar(cp_String_count, Codec.UNSIGNED5));
+        out.write(encodeScalar(cp_Class_count, Codec.UNSIGNED5));
+        out.write(encodeScalar(cp_Signature_count, Codec.UNSIGNED5));
+        out.write(encodeScalar(cp_Descr_count, Codec.UNSIGNED5));
+        out.write(encodeScalar(cp_Field_count, Codec.UNSIGNED5));
+        out.write(encodeScalar(cp_Method_count, Codec.UNSIGNED5));
+        out.write(encodeScalar(cp_Imethod_count, Codec.UNSIGNED5));
     }
 
-    public void setCpMethodCount(int count) {
-        cpMethodCount = count;
+    private void writeClassCounts(OutputStream out) throws IOException, Pack200Exception {
+        out.write(encodeScalar(ic_count, Codec.UNSIGNED5));
+        out.write(encodeScalar(default_class_minver, Codec.UNSIGNED5));
+        out.write(encodeScalar(default_class_majver, Codec.UNSIGNED5));
+        out.write(encodeScalar(class_count, Codec.UNSIGNED5));
     }
 
-    public void setCpImethodCount(int count) {
-        cpImethodCount = count;
+    private void writeArchiveSpecialCounts(OutputStream out) throws IOException, Pack200Exception {
+        if((archive_options & 1) > 0) { // have_special_formats
+            out.write(encodeScalar(band_headers.length, Codec.UNSIGNED5));
+            out.write(encodeScalar(attribute_definition_count, Codec.UNSIGNED5));
+        }
     }
 
-    public void setAttributeDefinitionCount(int count) {
-        attributeDefinitionCount = count;
+    private void writeArchiveFileCounts(OutputStream out) throws IOException, Pack200Exception {
+        if((archive_options & (1 << 4)) > 0) { // have_file_headers
+            out.write(encodeScalar(archive_size_hi, Codec.UNSIGNED5));
+            out.write(encodeScalar(archive_size_lo, Codec.UNSIGNED5));
+            out.write(encodeScalar(archive_next_count, Codec.UNSIGNED5));
+            out.write(encodeScalar(archive_modtime, Codec.UNSIGNED5));
+            out.write(encodeScalar(file_count, Codec.UNSIGNED5));
+        }
     }
 
-}
+}
\ No newline at end of file