1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * https://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.commons.compress.archivers.zip;
20
21 import java.util.Arrays;
22
23 /**
24 * Simple placeholder for all those extra fields we don't want to deal with.
25 *
26 * <p>
27 * Assumes local file data and central directory entries are identical - unless told the opposite.
28 * </p>
29 *
30 * @NotThreadSafe
31 */
32 public class UnrecognizedExtraField implements ZipExtraField {
33
34 /**
35 * The Header-ID.
36 */
37 private ZipShort headerId;
38
39 /**
40 * Extra field data in local file data - without Header-ID or length specifier.
41 */
42 private byte[] localData;
43
44 /**
45 * Extra field data in central directory - without Header-ID or length specifier.
46 */
47 private byte[] centralData;
48
49 /**
50 * Gets the central data.
51 *
52 * @return the central data if present, else return the local file data
53 */
54 @Override
55 public byte[] getCentralDirectoryData() {
56 if (centralData != null) {
57 return ZipUtil.copy(centralData);
58 }
59 return getLocalFileDataData();
60 }
61
62 /**
63 * Gets the central data length. If there is no central data, get the local file data length.
64 *
65 * @return the central data length
66 */
67 @Override
68 public ZipShort getCentralDirectoryLength() {
69 if (centralData != null) {
70 return new ZipShort(centralData.length);
71 }
72 return getLocalFileDataLength();
73 }
74
75 /**
76 * Gets the header id.
77 *
78 * @return the header id
79 */
80 @Override
81 public ZipShort getHeaderId() {
82 return headerId;
83 }
84
85 /**
86 * Gets the local data.
87 *
88 * @return the local data
89 */
90 @Override
91 public byte[] getLocalFileDataData() {
92 return ZipUtil.copy(localData);
93 }
94
95 /**
96 * Gets the length of the local data.
97 *
98 * @return the length of the local data
99 */
100 @Override
101 public ZipShort getLocalFileDataLength() {
102 return ZipShort.lengthOf(localData);
103 }
104
105 /**
106 * @param data the array of bytes.
107 * @param offset the source location in the data array.
108 * @param length the number of bytes to use in the data array.
109 * @see ZipExtraField#parseFromCentralDirectoryData(byte[], int, int)
110 */
111 @Override
112 public void parseFromCentralDirectoryData(final byte[] data, final int offset, final int length) {
113 final byte[] tmp = Arrays.copyOfRange(data, offset, offset + length);
114 setCentralDirectoryData(tmp);
115 if (localData == null) {
116 setLocalFileDataData(tmp);
117 }
118 }
119
120 /**
121 * @param data the array of bytes.
122 * @param offset the source location in the data array.
123 * @param length the number of bytes to use in the data array.
124 * @see ZipExtraField#parseFromLocalFileData(byte[], int, int)
125 */
126 @Override
127 public void parseFromLocalFileData(final byte[] data, final int offset, final int length) {
128 setLocalFileDataData(Arrays.copyOfRange(data, offset, offset + length));
129 }
130
131 /**
132 * Sets the extra field data in central directory.
133 *
134 * @param data the data to use
135 */
136 public void setCentralDirectoryData(final byte[] data) {
137 centralData = ZipUtil.copy(data);
138 }
139
140 /**
141 * Sets the header id.
142 *
143 * @param headerId the header id to use
144 */
145 public void setHeaderId(final ZipShort headerId) {
146 this.headerId = headerId;
147 }
148
149 /**
150 * Sets the extra field data in the local file data - without Header-ID or length specifier.
151 *
152 * @param data the field data to use
153 */
154 public void setLocalFileDataData(final byte[] data) {
155 localData = ZipUtil.copy(data);
156 }
157
158 }