    001/*
    002 * Licensed to the Apache Software Foundation (ASF) under one
    003 * or more contributor license agreements.  See the NOTICE file
    004 * distributed with this work for additional information
    005 * regarding copyright ownership.  The ASF licenses this file
    006 * to you under the Apache License, Version 2.0 (the
    007 * "License"); you may not use this file except in compliance
    008 * with the License.  You may obtain a copy of the License at
    009 *
    010 * http://www.apache.org/licenses/LICENSE-2.0
    011 *
    012 * Unless required by applicable law or agreed to in writing,
    013 * software distributed under the License is distributed on an
    014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015 * KIND, either express or implied.  See the License for the
    016 * specific language governing permissions and limitations
    017 * under the License.
    018 */
    019package org.apache.commons.compress.archivers.zip;
    020
    021/**
    022 * Simple placeholder for all those extra fields we don't want to deal
    023 * with.
    024 *
    025 * <p>Assumes local file data and central directory entries are
    026 * identical - unless told the opposite.</p>
    027 * @NotThreadSafe
    028 */
    029public class UnrecognizedExtraField implements ZipExtraField {
    030
    031    /**
    032     * The Header-ID.
    033     */
    034    private ZipShort headerId;
    035
    036    /**
    037     * Set the header id.
    038     * @param headerId the header id to use
    039     */
    040    public void setHeaderId(final ZipShort headerId) {
    041        this.headerId = headerId;
    042    }
    043
    044    /**
    045     * Get the header id.
    046     * @return the header id
    047     */
    048    @Override
    049    public ZipShort getHeaderId() {
    050        return headerId;
    051    }
    052
    053    /**
    054     * Extra field data in local file data - without
    055     * Header-ID or length specifier.
    056     */
    057    private byte[] localData;
    058
    059    /**
    060     * Set the extra field data in the local file data -
    061     * without Header-ID or length specifier.
    062     * @param data the field data to use
    063     */
    064    public void setLocalFileDataData(final byte[] data) {
    065        localData = ZipUtil.copy(data);
    066    }
    067
    068    /**
    069     * Get the length of the local data.
    070     * @return the length of the local data
    071     */
    072    @Override
    073    public ZipShort getLocalFileDataLength() {
    074        return new ZipShort(localData != null ? localData.length : 0);
    075    }
    076
    077    /**
    078     * Get the local data.
    079     * @return the local data
    080     */
    081    @Override
    082    public byte[] getLocalFileDataData() {
    083        return ZipUtil.copy(localData);
    084    }
    085
    086    /**
    087     * Extra field data in central directory - without
    088     * Header-ID or length specifier.
    089     */
    090    private byte[] centralData;
    091
    092    /**
    093     * Set the extra field data in central directory.
    094     * @param data the data to use
    095     */
    096    public void setCentralDirectoryData(final byte[] data) {
    097        centralData = ZipUtil.copy(data);
    098    }
    099
    100    /**
    101     * Get the central data length.
    102     * If there is no central data, get the local file data length.
    103     * @return the central data length
    104     */
    105    @Override
    106    public ZipShort getCentralDirectoryLength() {
    107        if (centralData != null) {
    108            return new ZipShort(centralData.length);
    109        }
    110        return getLocalFileDataLength();
    111    }
    112
    113    /**
    114     * Get the central data.
    115     * @return the central data if present, else return the local file data
    116     */
    117    @Override
    118    public byte[] getCentralDirectoryData() {
    119        if (centralData != null) {
    120            return ZipUtil.copy(centralData);
    121        }
    122        return getLocalFileDataData();
    123    }
    124
    125    /**
    126     * @param data the array of bytes.
    127     * @param offset the source location in the data array.
    128     * @param length the number of bytes to use in the data array.
    129     * @see ZipExtraField#parseFromLocalFileData(byte[], int, int)
    130     */
    131    @Override
    132    public void parseFromLocalFileData(final byte[] data, final int offset, final int length) {
    133        final byte[] tmp = new byte[length];
    134        System.arraycopy(data, offset, tmp, 0, length);
    135        setLocalFileDataData(tmp);
    136    }
    137
    138    /**
    139     * @param data the array of bytes.
    140     * @param offset the source location in the data array.
    141     * @param length the number of bytes to use in the data array.
    142     * @see ZipExtraField#parseFromCentralDirectoryData(byte[], int, int)
    143     */
    144    @Override
    145    public void parseFromCentralDirectoryData(final byte[] data, final int offset,
    146                                              final int length) {
    147        final byte[] tmp = new byte[length];
    148        System.arraycopy(data, offset, tmp, 0, length);
    149        setCentralDirectoryData(tmp);
    150        if (localData == null) {
    151            setLocalFileDataData(tmp);
    152        }
    153    }
    154
    155}