jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipConstants.java
changeset 24414 2061862eb57c
parent 24413 1d117d2dfe92
parent 24077 0809c9a4d36e
child 24415 43aa54df554d
equal deleted inserted replaced
24413:1d117d2dfe92 24414:2061862eb57c
     1 /*
       
     2  * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  *
       
     8  *   - Redistributions of source code must retain the above copyright
       
     9  *     notice, this list of conditions and the following disclaimer.
       
    10  *
       
    11  *   - Redistributions in binary form must reproduce the above copyright
       
    12  *     notice, this list of conditions and the following disclaimer in the
       
    13  *     documentation and/or other materials provided with the distribution.
       
    14  *
       
    15  *   - Neither the name of Oracle nor the names of its
       
    16  *     contributors may be used to endorse or promote products derived
       
    17  *     from this software without specific prior written permission.
       
    18  *
       
    19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       
    20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       
    21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    30  */
       
    31 
       
    32 /*
       
    33  * This source code is provided to illustrate the usage of a given feature
       
    34  * or technique and has been deliberately simplified. Additional steps
       
    35  * required for a production-quality application, such as security checks,
       
    36  * input validation and proper error handling, might not be present in
       
    37  * this sample code.
       
    38  */
       
    39 
       
    40 
       
    41 package com.sun.nio.zipfs;
       
    42 
       
    43 
       
    44 /**
       
    45  *
       
    46  * @author Xueming Shen
       
    47  */
       
    48 
       
    49 class ZipConstants {
       
    50     /*
       
    51      * Compression methods
       
    52      */
       
    53     static final int METHOD_STORED     = 0;
       
    54     static final int METHOD_DEFLATED   = 8;
       
    55     static final int METHOD_DEFLATED64 = 9;
       
    56     static final int METHOD_BZIP2      = 12;
       
    57     static final int METHOD_LZMA       = 14;
       
    58     static final int METHOD_LZ77       = 19;
       
    59     static final int METHOD_AES        = 99;
       
    60 
       
    61     /*
       
    62      * General purpose big flag
       
    63      */
       
    64     static final int FLAG_ENCRYPTED  = 0x01;
       
    65     static final int FLAG_DATADESCR  = 0x08;    // crc, size and csize in dd
       
    66     static final int FLAG_EFS        = 0x800;   // If this bit is set the filename and
       
    67                                                 // comment fields for this file must be
       
    68                                                 // encoded using UTF-8.
       
    69     /*
       
    70      * Header signatures
       
    71      */
       
    72     static long LOCSIG = 0x04034b50L;   // "PK\003\004"
       
    73     static long EXTSIG = 0x08074b50L;   // "PK\007\008"
       
    74     static long CENSIG = 0x02014b50L;   // "PK\001\002"
       
    75     static long ENDSIG = 0x06054b50L;   // "PK\005\006"
       
    76 
       
    77     /*
       
    78      * Header sizes in bytes (including signatures)
       
    79      */
       
    80     static final int LOCHDR = 30;       // LOC header size
       
    81     static final int EXTHDR = 16;       // EXT header size
       
    82     static final int CENHDR = 46;       // CEN header size
       
    83     static final int ENDHDR = 22;       // END header size
       
    84 
       
    85     /*
       
    86      * Local file (LOC) header field offsets
       
    87      */
       
    88     static final int LOCVER = 4;        // version needed to extract
       
    89     static final int LOCFLG = 6;        // general purpose bit flag
       
    90     static final int LOCHOW = 8;        // compression method
       
    91     static final int LOCTIM = 10;       // modification time
       
    92     static final int LOCCRC = 14;       // uncompressed file crc-32 value
       
    93     static final int LOCSIZ = 18;       // compressed size
       
    94     static final int LOCLEN = 22;       // uncompressed size
       
    95     static final int LOCNAM = 26;       // filename length
       
    96     static final int LOCEXT = 28;       // extra field length
       
    97 
       
    98     /*
       
    99      * Extra local (EXT) header field offsets
       
   100      */
       
   101     static final int EXTCRC = 4;        // uncompressed file crc-32 value
       
   102     static final int EXTSIZ = 8;        // compressed size
       
   103     static final int EXTLEN = 12;       // uncompressed size
       
   104 
       
   105     /*
       
   106      * Central directory (CEN) header field offsets
       
   107      */
       
   108     static final int CENVEM = 4;        // version made by
       
   109     static final int CENVER = 6;        // version needed to extract
       
   110     static final int CENFLG = 8;        // encrypt, decrypt flags
       
   111     static final int CENHOW = 10;       // compression method
       
   112     static final int CENTIM = 12;       // modification time
       
   113     static final int CENCRC = 16;       // uncompressed file crc-32 value
       
   114     static final int CENSIZ = 20;       // compressed size
       
   115     static final int CENLEN = 24;       // uncompressed size
       
   116     static final int CENNAM = 28;       // filename length
       
   117     static final int CENEXT = 30;       // extra field length
       
   118     static final int CENCOM = 32;       // comment length
       
   119     static final int CENDSK = 34;       // disk number start
       
   120     static final int CENATT = 36;       // internal file attributes
       
   121     static final int CENATX = 38;       // external file attributes
       
   122     static final int CENOFF = 42;       // LOC header offset
       
   123 
       
   124     /*
       
   125      * End of central directory (END) header field offsets
       
   126      */
       
   127     static final int ENDSUB = 8;        // number of entries on this disk
       
   128     static final int ENDTOT = 10;       // total number of entries
       
   129     static final int ENDSIZ = 12;       // central directory size in bytes
       
   130     static final int ENDOFF = 16;       // offset of first CEN header
       
   131     static final int ENDCOM = 20;       // zip file comment length
       
   132 
       
   133     /*
       
   134      * ZIP64 constants
       
   135      */
       
   136     static final long ZIP64_ENDSIG = 0x06064b50L;  // "PK\006\006"
       
   137     static final long ZIP64_LOCSIG = 0x07064b50L;  // "PK\006\007"
       
   138     static final int  ZIP64_ENDHDR = 56;           // ZIP64 end header size
       
   139     static final int  ZIP64_LOCHDR = 20;           // ZIP64 end loc header size
       
   140     static final int  ZIP64_EXTHDR = 24;           // EXT header size
       
   141     static final int  ZIP64_EXTID  = 0x0001;       // Extra field Zip64 header ID
       
   142 
       
   143     static final int  ZIP64_MINVAL32 = 0xFFFF;
       
   144     static final long ZIP64_MINVAL = 0xFFFFFFFFL;
       
   145 
       
   146     /*
       
   147      * Zip64 End of central directory (END) header field offsets
       
   148      */
       
   149     static final int  ZIP64_ENDLEN = 4;       // size of zip64 end of central dir
       
   150     static final int  ZIP64_ENDVEM = 12;      // version made by
       
   151     static final int  ZIP64_ENDVER = 14;      // version needed to extract
       
   152     static final int  ZIP64_ENDNMD = 16;      // number of this disk
       
   153     static final int  ZIP64_ENDDSK = 20;      // disk number of start
       
   154     static final int  ZIP64_ENDTOD = 24;      // total number of entries on this disk
       
   155     static final int  ZIP64_ENDTOT = 32;      // total number of entries
       
   156     static final int  ZIP64_ENDSIZ = 40;      // central directory size in bytes
       
   157     static final int  ZIP64_ENDOFF = 48;      // offset of first CEN header
       
   158     static final int  ZIP64_ENDEXT = 56;      // zip64 extensible data sector
       
   159 
       
   160     /*
       
   161      * Zip64 End of central directory locator field offsets
       
   162      */
       
   163     static final int  ZIP64_LOCDSK = 4;       // disk number start
       
   164     static final int  ZIP64_LOCOFF = 8;       // offset of zip64 end
       
   165     static final int  ZIP64_LOCTOT = 16;      // total number of disks
       
   166 
       
   167     /*
       
   168      * Zip64 Extra local (EXT) header field offsets
       
   169      */
       
   170     static final int  ZIP64_EXTCRC = 4;       // uncompressed file crc-32 value
       
   171     static final int  ZIP64_EXTSIZ = 8;       // compressed size, 8-byte
       
   172     static final int  ZIP64_EXTLEN = 16;      // uncompressed size, 8-byte
       
   173 
       
   174     /*
       
   175      * Extra field header ID
       
   176      */
       
   177     static final int  EXTID_ZIP64 = 0x0001;      // ZIP64
       
   178     static final int  EXTID_NTFS  = 0x000a;      // NTFS
       
   179     static final int  EXTID_UNIX  = 0x000d;      // UNIX
       
   180     static final int  EXTID_EFS   = 0x0017;      // Strong Encryption
       
   181     static final int  EXTID_EXTT  = 0x5455;      // Info-ZIP Extended Timestamp
       
   182 
       
   183     /*
       
   184      * fields access methods
       
   185      */
       
   186     ///////////////////////////////////////////////////////
       
   187     static final int CH(byte[] b, int n) {
       
   188         return Byte.toUnsignedInt(b[n]);
       
   189     }
       
   190 
       
   191     static final int SH(byte[] b, int n) {
       
   192         return Byte.toUnsignedInt(b[n]) | (Byte.toUnsignedInt(b[n + 1]) << 8);
       
   193     }
       
   194 
       
   195     static final long LG(byte[] b, int n) {
       
   196         return ((SH(b, n)) | (SH(b, n + 2) << 16)) & 0xffffffffL;
       
   197     }
       
   198 
       
   199     static final long LL(byte[] b, int n) {
       
   200         return (LG(b, n)) | (LG(b, n + 4) << 32);
       
   201     }
       
   202 
       
   203     static final long GETSIG(byte[] b) {
       
   204         return LG(b, 0);
       
   205     }
       
   206 
       
   207     // local file (LOC) header fields
       
   208     static final long LOCSIG(byte[] b) { return LG(b, 0); } // signature
       
   209     static final int  LOCVER(byte[] b) { return SH(b, 4); } // version needed to extract
       
   210     static final int  LOCFLG(byte[] b) { return SH(b, 6); } // general purpose bit flags
       
   211     static final int  LOCHOW(byte[] b) { return SH(b, 8); } // compression method
       
   212     static final long LOCTIM(byte[] b) { return LG(b, 10);} // modification time
       
   213     static final long LOCCRC(byte[] b) { return LG(b, 14);} // crc of uncompressed data
       
   214     static final long LOCSIZ(byte[] b) { return LG(b, 18);} // compressed data size
       
   215     static final long LOCLEN(byte[] b) { return LG(b, 22);} // uncompressed data size
       
   216     static final int  LOCNAM(byte[] b) { return SH(b, 26);} // filename length
       
   217     static final int  LOCEXT(byte[] b) { return SH(b, 28);} // extra field length
       
   218 
       
   219     // extra local (EXT) header fields
       
   220     static final long EXTCRC(byte[] b) { return LG(b, 4);}  // crc of uncompressed data
       
   221     static final long EXTSIZ(byte[] b) { return LG(b, 8);}  // compressed size
       
   222     static final long EXTLEN(byte[] b) { return LG(b, 12);} // uncompressed size
       
   223 
       
   224     // end of central directory header (END) fields
       
   225     static final int  ENDSUB(byte[] b) { return SH(b, 8); }  // number of entries on this disk
       
   226     static final int  ENDTOT(byte[] b) { return SH(b, 10);}  // total number of entries
       
   227     static final long ENDSIZ(byte[] b) { return LG(b, 12);}  // central directory size
       
   228     static final long ENDOFF(byte[] b) { return LG(b, 16);}  // central directory offset
       
   229     static final int  ENDCOM(byte[] b) { return SH(b, 20);}  // size of zip file comment
       
   230     static final int  ENDCOM(byte[] b, int off) { return SH(b, off + 20);}
       
   231 
       
   232     // zip64 end of central directory recoder fields
       
   233     static final long ZIP64_ENDTOD(byte[] b) { return LL(b, 24);}  // total number of entries on disk
       
   234     static final long ZIP64_ENDTOT(byte[] b) { return LL(b, 32);}  // total number of entries
       
   235     static final long ZIP64_ENDSIZ(byte[] b) { return LL(b, 40);}  // central directory size
       
   236     static final long ZIP64_ENDOFF(byte[] b) { return LL(b, 48);}  // central directory offset
       
   237     static final long ZIP64_LOCOFF(byte[] b) { return LL(b, 8);}   // zip64 end offset
       
   238 
       
   239     // central directory header (CEN) fields
       
   240     static final long CENSIG(byte[] b, int pos) { return LG(b, pos + 0); }
       
   241     static final int  CENVEM(byte[] b, int pos) { return SH(b, pos + 4); }
       
   242     static final int  CENVER(byte[] b, int pos) { return SH(b, pos + 6); }
       
   243     static final int  CENFLG(byte[] b, int pos) { return SH(b, pos + 8); }
       
   244     static final int  CENHOW(byte[] b, int pos) { return SH(b, pos + 10);}
       
   245     static final long CENTIM(byte[] b, int pos) { return LG(b, pos + 12);}
       
   246     static final long CENCRC(byte[] b, int pos) { return LG(b, pos + 16);}
       
   247     static final long CENSIZ(byte[] b, int pos) { return LG(b, pos + 20);}
       
   248     static final long CENLEN(byte[] b, int pos) { return LG(b, pos + 24);}
       
   249     static final int  CENNAM(byte[] b, int pos) { return SH(b, pos + 28);}
       
   250     static final int  CENEXT(byte[] b, int pos) { return SH(b, pos + 30);}
       
   251     static final int  CENCOM(byte[] b, int pos) { return SH(b, pos + 32);}
       
   252     static final int  CENDSK(byte[] b, int pos) { return SH(b, pos + 34);}
       
   253     static final int  CENATT(byte[] b, int pos) { return SH(b, pos + 36);}
       
   254     static final long CENATX(byte[] b, int pos) { return LG(b, pos + 38);}
       
   255     static final long CENOFF(byte[] b, int pos) { return LG(b, pos + 42);}
       
   256 
       
   257     /* The END header is followed by a variable length comment of size < 64k. */
       
   258     static final long END_MAXLEN = 0xFFFF + ENDHDR;
       
   259     static final int READBLOCKSZ = 128;
       
   260 }