View Javadoc
1   /*
2    * Copyright (C) 2005-2015 Schlichtherle IT Services.
3    * All rights reserved. Use is subject to license terms.
4    */
5   package net.java.truevfs.comp.zip;
6   
7   import static java.lang.System.arraycopy;
8   import javax.annotation.CheckForNull;
9   import javax.annotation.concurrent.NotThreadSafe;
10  
11  /**
12   * Default implementation for an Extra Field in a Local or Central Header of a
13   * ZIP file.
14   *
15   * @author Christian Schlichtherle
16   */
17  @NotThreadSafe
18  final class DefaultExtraField extends ExtraField {
19  
20      private final short headerId;
21      private @CheckForNull byte[] data;
22  
23      /**
24       * Constructs a new extra field.
25       *
26       * @param  headerId an unsigned short integer (two bytes) indicating the
27       *         type of the extra field.
28       */
29      DefaultExtraField(final int headerId) {
30          assert UShort.check(headerId);
31          this.headerId = (short) headerId;
32      }
33  
34      @Override
35      int getHeaderId() {
36          return headerId & UShort.MAX_VALUE;
37      }
38  
39      @Override
40      int getDataSize() {
41          final byte[] data = this.data;
42          return null != data ? data.length : 0;
43      }
44  
45      @Override
46      void readFrom(final byte[] buf, final int off, final int len) {
47          assert UShort.check(len);
48          arraycopy(buf, off, this.data = new byte[len], 0, len);
49      }
50  
51      @Override
52      void writeTo(byte[] buf, int off) {
53          final byte[] src = this.data;
54          if (null != src) arraycopy(src, 0, buf, off, src.length);
55      }
56  }