org.apache.tools.zip
Class Zip64ExtendedInformationExtraField

java.lang.Object
  extended by org.apache.tools.zip.Zip64ExtendedInformationExtraField
All Implemented Interfaces:
CentralDirectoryParsingZipExtraField, ZipExtraField

public class Zip64ExtendedInformationExtraField
extends java.lang.Object
implements CentralDirectoryParsingZipExtraField

Holds size and other extended information for entries that use Zip64 features.

See "http://www.pkware.com/documents/casestudies/APPNOTE.TXT PKWARE's APPNOTE.TXT, section 4.5.3".

Currently Ant doesn't support encrypting the central directory so the note about masking doesn't apply.

The implementation relies on data being read from the local file header and assumes that both size values are always present.

Since:
Ant 1.9.0

Constructor Summary
Zip64ExtendedInformationExtraField()
          This constructor should only be used by the code that reads archives inside of Ant.
Zip64ExtendedInformationExtraField(ZipEightByteInteger size, ZipEightByteInteger compressedSize)
          Creates an extra field based on the original and compressed size.
Zip64ExtendedInformationExtraField(ZipEightByteInteger size, ZipEightByteInteger compressedSize, ZipEightByteInteger relativeHeaderOffset, ZipLong diskStart)
          Creates an extra field based on all four possible values.
 
Method Summary
 byte[] getCentralDirectoryData()
          The actual data to put into central directory - without Header-ID or length specifier.
 ZipShort getCentralDirectoryLength()
          Length of the extra field in the central directory - without Header-ID or length specifier.
 ZipEightByteInteger getCompressedSize()
          The compressed size stored in this extra field.
 ZipLong getDiskStartNumber()
          The disk start number stored in this extra field.
 ZipShort getHeaderId()
          The Header-ID.
 byte[] getLocalFileDataData()
          The actual data to put into local file data - without Header-ID or length specifier.
 ZipShort getLocalFileDataLength()
          Length of the extra field in the local file data - without Header-ID or length specifier.
 ZipEightByteInteger getRelativeHeaderOffset()
          The relative header offset stored in this extra field.
 ZipEightByteInteger getSize()
          The uncompressed size stored in this extra field.
 void parseFromCentralDirectoryData(byte[] buffer, int offset, int length)
          Populate data from this array as if it was in central directory data.
 void parseFromLocalFileData(byte[] buffer, int offset, int length)
          Populate data from this array as if it was in local file data.
 void reparseCentralDirectoryData(boolean hasUncompressedSize, boolean hasCompressedSize, boolean hasRelativeHeaderOffset, boolean hasDiskStart)
          Parses the raw bytes read from the central directory extra field with knowledge which fields are expected to be there.
 void setCompressedSize(ZipEightByteInteger compressedSize)
          The uncompressed size stored in this extra field.
 void setDiskStartNumber(ZipLong ds)
          The disk start number stored in this extra field.
 void setRelativeHeaderOffset(ZipEightByteInteger rho)
          The relative header offset stored in this extra field.
 void setSize(ZipEightByteInteger size)
          The uncompressed size stored in this extra field.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

Zip64ExtendedInformationExtraField

public Zip64ExtendedInformationExtraField()
This constructor should only be used by the code that reads archives inside of Ant.


Zip64ExtendedInformationExtraField

public Zip64ExtendedInformationExtraField(ZipEightByteInteger size,
                                          ZipEightByteInteger compressedSize)
Creates an extra field based on the original and compressed size.

Parameters:
size - the entry's original size
compressedSize - the entry's compressed size
Throws:
java.lang.IllegalArgumentException - if size or compressedSize is null

Zip64ExtendedInformationExtraField

public Zip64ExtendedInformationExtraField(ZipEightByteInteger size,
                                          ZipEightByteInteger compressedSize,
                                          ZipEightByteInteger relativeHeaderOffset,
                                          ZipLong diskStart)
Creates an extra field based on all four possible values.

Parameters:
size - the entry's original size
compressedSize - the entry's compressed size
Throws:
java.lang.IllegalArgumentException - if size or compressedSize is null
Method Detail

getHeaderId

public ZipShort getHeaderId()
The Header-ID.

Specified by:
getHeaderId in interface ZipExtraField
Returns:
the header id

getLocalFileDataLength

public ZipShort getLocalFileDataLength()
Length of the extra field in the local file data - without Header-ID or length specifier.

Specified by:
getLocalFileDataLength in interface ZipExtraField
Returns:
the length of the field in the local file data

getCentralDirectoryLength

public ZipShort getCentralDirectoryLength()
Length of the extra field in the central directory - without Header-ID or length specifier.

Specified by:
getCentralDirectoryLength in interface ZipExtraField
Returns:
the length of the field in the central directory

getLocalFileDataData

public byte[] getLocalFileDataData()
The actual data to put into local file data - without Header-ID or length specifier.

Specified by:
getLocalFileDataData in interface ZipExtraField
Returns:
the data

getCentralDirectoryData

public byte[] getCentralDirectoryData()
The actual data to put into central directory - without Header-ID or length specifier.

Specified by:
getCentralDirectoryData in interface ZipExtraField
Returns:
the data

parseFromLocalFileData

public void parseFromLocalFileData(byte[] buffer,
                                   int offset,
                                   int length)
                            throws java.util.zip.ZipException
Populate data from this array as if it was in local file data.

Specified by:
parseFromLocalFileData in interface ZipExtraField
Parameters:
buffer - an array of bytes
offset - the start offset
length - the number of bytes in the array from offset
Throws:
java.util.zip.ZipException - on error

parseFromCentralDirectoryData

public void parseFromCentralDirectoryData(byte[] buffer,
                                          int offset,
                                          int length)
                                   throws java.util.zip.ZipException
Populate data from this array as if it was in central directory data.

Specified by:
parseFromCentralDirectoryData in interface CentralDirectoryParsingZipExtraField
Parameters:
buffer - an array of bytes
offset - the start offset
length - the number of bytes in the array from offset
Throws:
java.util.zip.ZipException - on error

reparseCentralDirectoryData

public void reparseCentralDirectoryData(boolean hasUncompressedSize,
                                        boolean hasCompressedSize,
                                        boolean hasRelativeHeaderOffset,
                                        boolean hasDiskStart)
                                 throws java.util.zip.ZipException
Parses the raw bytes read from the central directory extra field with knowledge which fields are expected to be there.

All four fields inside the zip64 extended information extra field are optional and must only be present if their corresponding entry inside the central directory contains the correct magic value.

Throws:
java.util.zip.ZipException

getSize

public ZipEightByteInteger getSize()
The uncompressed size stored in this extra field.


setSize

public void setSize(ZipEightByteInteger size)
The uncompressed size stored in this extra field.


getCompressedSize

public ZipEightByteInteger getCompressedSize()
The compressed size stored in this extra field.


setCompressedSize

public void setCompressedSize(ZipEightByteInteger compressedSize)
The uncompressed size stored in this extra field.


getRelativeHeaderOffset

public ZipEightByteInteger getRelativeHeaderOffset()
The relative header offset stored in this extra field.


setRelativeHeaderOffset

public void setRelativeHeaderOffset(ZipEightByteInteger rho)
The relative header offset stored in this extra field.


getDiskStartNumber

public ZipLong getDiskStartNumber()
The disk start number stored in this extra field.


setDiskStartNumber

public void setDiskStartNumber(ZipLong ds)
The disk start number stored in this extra field.